从零到有的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,但是国内相关的资料确是少之又少.上个月末跳槽去了新 ...
随机推荐
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- PC端和手机访问调用不同的页面,JS和PHP不同方法
js方法: var urlqr = location.href; urlqr = urlqr.replace(/iphoneF_/, "pc")这里写正则替换页面地址 if( ...
- HTML5新增标签及具体用法
html5自从推广普及以来,迅速被各大浏览器支持.采用html5设计的网页逐渐成为网页设计的时尚.下面就温习下html5的新增标签. HTML 5 中的新特性包括了嵌入音频.视频和图形的功能,客户端数 ...
- cocos2d-x iOS真机下载非根目录文件提示下载失败解决办法
在使用cocos api的Downloader或者AssetsManager下载文件到真机Document目录时,如果是直接下载到document根目录,是没问题的,如果是下载存放到了某个不存在的子目 ...
- 简单的射击游戏HTML+JS实现
一直想自己写一个游戏玩,时间和精力都不太允许,最近几天刚好有空闲时间,就琢磨了这个小游戏. 刚开始想着计算图片重叠事件,然后让炮弹和飞机消失,傻乎乎写了一天,越整越乱.今天一大早晕过来了,改用数组以后 ...
- javax.el.PropertyNotFoundException:
javax.el.PropertyNotFoundException: Property 'ContextPath' not found on type org.apache.catalina.cor ...
- XSS跨站脚本小结
XSS漏洞验证经常遇到一些过滤,如何进行有效验证和绕过过滤呢,这里小结一下常见的一些标签,如<a><img>等. 参考链接:http://www.jb51.net/tools/ ...
- EXTJS4.2中neptune主题的使用
原文地址:http://blog.csdn.net/xieguojun2013/article/details/8880519 最近在在sencha.com官网了解到EXTJS的最新版本里增加了新的主 ...
- 我们还是太NAive
蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡蛤鸡
- Xcode LLDB Debug教程
开胃小菜--简单的断点调试 在xcode中打开一个app,在想要break的行号上单击,即可生成一个深色的箭头标识--断点.如下图,在viewDidLoad:中设置了断点. 运行app,等待...就可 ...