从零到有的lex学习
最近总是在忙各种事情,毕业设计要求写一个基于云计算的java语法分析器。其实选题的时候就没有底,现在什么都不懂,只有从零开始。
我与lex和yacc的缘分应该是在编译原理课程上,但是当时有很多门课,所以就没有管他。到了实验室老师叫我用lex和yacc写一个计算器后台运行程序。我当时就蒙啦!由于要学html和php所以就一直拖着,到了现在终于轮到学习他啦。好了,不多说啦。开始吧!
lex部分
lex分为三部分:第一部分是声明部分,什么c中的宏定义呀,变量什么的,随便写。这类的书也很多。
第二部分就是规则区,这里面就是lex的核心的部分啦。参看“原始的lex模式匹配”和“模式匹配示例”,这两个是核心东西,要好好看哈。
第三部分还是c语言的东西,main函数也在这里。但是要注意,因为这里会用到lex里面很多函数(其实这些函数都是在lex里面有的,你只需要记住他们当功能就可以啦!)
下面附上我刚在书上抄下来的代码(我本来想借图书馆里的《lex与yacc》这本书的,但是都被借走了,亚马逊上看了一下三十多块呢,想想还是算了。我就借了《编译器设计》Santanu Chattopadhyay 著 徐骁栋 王海涛 译的,这本书真心精炼,对于只是用用lex和yacc的同学来说相当实在,初学者也很好。)
%{
int yylineno;
%}
%%
^(.*)\n printf("%4d\t%s",++yylineno,yytext);
%%
int main(int argc,char **argv)
{
yyin=fopen(argv[1],"r");
yylex();
fclose(yyin);
}
这段代码很简单,但是什么东西都有。作用就是输出你输入文件当中的每一行,但是在每一行前面加上行号。yylineno是我定义用来记录行号的。yytext的定义是这样的:char*yytext,用来指向匹配字符串的指针。当然这类的东西还有很多,什么yyleng,yyout的,你自己去看吧!yyin的定义是FILE*yyin输入文件。yylex()笔者认为就是调用词法分析器的函数。都在强大的lex背后。好了。那么下面来用用它吧。
nano lex.l 然后就把上面的代码复制进去 ctrl+o,enter,ctrl+x。就这么愉快的搞定啦。写一个测试的test.txt。同样nano test.txt.然后随便写点东西,保存,退出。ctrl+o,enter,ctrl+x。
先用lex弄出我们的分析器来:lex lex.l
你会发现你的文件夹里面多了一个lex.yy.c没错,这就是lex生成的c代码。接下来我是在ubuntu下面编译的。
gcc -o lexy lex.yy.c -ll 后面加-ll我也不知到是什么意思,反正就要这么弄不然就会出错
/tmp/ccx4W13y.o: In function `yylex':
lex.yy.c:(.text+0x4b2): undefined reference to `yywrap'
/tmp/ccx4W13y.o: In function `input':
lex.yy.c:(.text+0x100b): undefined reference to `yywrap'
collect2: ld 返回 1
所以我们还是加上吧!
最后运行 ./lexy test.txt你就会看到愉快的输出啦。
千万别直接来lexy test.txt系统会提示你没有lexy这个命令。之前笔者就直接弄的lex,然后输入 lex test.txt 结果就是说我输入有问题。
申明哈,笔者linux刚开始,所以命令不是很熟悉,这是第一篇博客,就先写lex了,等我后续完成yacc之后再来。等我写完计算器就分享给大家源代码。
从零到有的lex学习的更多相关文章
- 零基础如何系统学习Java Web
零基础如何系统学习Java Web? 我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...
- C#区块链零基础入门,学习路线图 转
C#区块链零基础入门,学习路线图 一.1分钟短视频<区块链100问>了解区块链基本概念 http://tech.sina.com.cn/zt_d/blockchain_100/ 二.C#区 ...
- (转)零基础入门深度学习(6) - 长短时记忆网络(LSTM)
无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...
- 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建
salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建 VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...
- 【转载】salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable
salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable 本篇知识参考:https://developer.salesforce.com/trailhead/for ...
- 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解
salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解 建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schem ...
- 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL) salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...
- 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句
salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...
- 【转载】salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载
salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载 目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新 ...
随机推荐
- jquery.extend方法
jquery.extend()用来扩展jquery中方法,实现插件. 1.jQuery.extend函数详细用法! 扩展jQuery静态方法. 1$.extend({ 2test:function() ...
- C# xpath
XPath最通俗的教程(ZZ) 以下是本人找到的最完整最易懂的XPath教程,不敢私藏,拿出来与大家分享.帮我点旁边的google广告呀. 实例 1基本的XPath语法类似于在一个文件系统中定位文 ...
- Rally的敏捷小册子
来自为知笔记(Wiz)
- 关于discuz“终于解决“头像保存过程中发生网络错误,请重试"”的解决方法
1 php.ini里面allow_url_fopen = On2 将php.ini中的;upload_tmp_dir = 该行的注释符,即前面的分号“:”去掉,使该行在php.ini文档中起作用.up ...
- ASP.NET MVC中多种ActionResult用法总结
最近一段时间做了个ASP.NET MVC4.0的项目,项目马上就要结束了,今天忙里偷闲简单总结一下心得: 1. 如果Action需要有返回值的话,必须是ActionResult的话,可以返回一个Emp ...
- The Swift Programming Language 英文原版官方文档下载
The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...
- Object.observe
使用Object.observe 实现数据绑定
- CentOS 安装 Wine
1. 下载安装包 Wine的中文官网可以下载到最新稳定和开发版本的Wine安装包,根据不同需求可以自行下载 2. 解压安装包,编译前检查 根据不同的平台选择不同的编译选项: For 32-Bit Sy ...
- 【转】构建C1000K的服务器(1) – 基础
原文来自 ideawu 构建C1000K的服务器(1) – 基础 著名的 C10K 问题提出的时候, 正是 2001 年, 到如今 12 年后的 2013 年, C10K 已经不是问题了, 任何一个普 ...
- winfrom 限制文本框小数点后两位
private void numWeight_KeyPress(object sender, KeyPressEventArgs e) { if (char.IsNumber(e.KeyChar) | ...