最近总是在忙各种事情,毕业设计要求写一个基于云计算的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学习的更多相关文章

  1. 零基础如何系统学习Java Web

    零基础如何系统学习Java Web?   我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...

  2. C#区块链零基础入门,学习路线图 转

    C#区块链零基础入门,学习路线图 一.1分钟短视频<区块链100问>了解区块链基本概念 http://tech.sina.com.cn/zt_d/blockchain_100/ 二.C#区 ...

  3. (转)零基础入门深度学习(6) - 长短时记忆网络(LSTM)

    无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...

  4. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  5. 【转载】salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable

    salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable   本篇知识参考:https://developer.salesforce.com/trailhead/for ...

  6. 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解

    salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解   建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schem ...

  7. 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

    salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)   salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...

  8. 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句

    salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...

  9. 【转载】salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载

    salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载   目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新 ...

随机推荐

  1. 关于Autorun.inf文件

    配置Autorun.inf文件可以使双击磁盘时,自动运行某一应用程序.但是现在只支持CD或者DVD媒体了(以前硬盘也可以) 关于Autorun.inf的组成部分可以参考https://msdn.mic ...

  2. Android 媒体存储服务(二)

    Android 媒体存储服务 简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套 ...

  3. swf格式文件如何修改里面的动作路径或者动作脚本(没有源文件的情况)

    一.UrlActionEditor汉化版,这个工具是非常的简单和使用,直接把你需要需要修改的swf格式的flash文件在这里面打开 二.如果需要更加详细的修改可以下载一个SWFDecompiler4. ...

  4. CSS外边距margin上下元素重叠

    CSS外边距margin上下元素重叠 转载:http://www.gaoyouyou.com/view/77.htm 两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大的值.如 ...

  5. OGRE的学习资源

    本文介绍从哪儿开始学习OGRE(Object-Oriented Graphics Rendering Engine的简称,又叫做OGRE 3D),如何在网上找寻OGRE的学习资源. 首先是wikipe ...

  6. java 读写properties

    网速不好:先贴上资料: Java配置文件Properties的读取.写入与更新操作 [Spring] - Property注入 http://www.360doc.com/content/14/073 ...

  7. 关于scrolltop 兼容 IE6/7/8, Safari,FF的方法

    1.各浏览器下 scrollTop的差异IE6/7/8:对于没有doctype声明的页面里可以使用  document.body.scrollTop 来获取 scrollTop高度 :对于有docty ...

  8. CLR via C# 3rd - 04 - Type Fundamentals

    1. System.Object        The runtime requires every type to ultimately be derived from the System.Obj ...

  9. 移动web开发和移动app开发的区分

    1.移动web开发 这部分跟web前端开发差别不大,使用的技术都是html+css+js.区别为手机浏览器是webkit的天下,pc端是IE的天 下.手机网页可以理解成pc网页的缩小版加一些触摸特性. ...

  10. APP邂逅即时通讯云,让你的手机APP聊起来

     #推荐活动# #线下沙龙# 明天下午在IC咖啡 —— <APP邂逅即时通讯云,让你的手机APP聊起来>, http://url.cn/Y8sYo5