最近总是在忙各种事情,毕业设计要求写一个基于云计算的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. Python学习感悟

    学习任何新知识,我自己偏向于在实践中学习,这样效率更高:如果只是学习基本概念,会很枯燥. 现在的问题是:不是所有的新知识都可以在实践中学习!

  2. python之变量篇

    列表:a=['a',112,'bss']元组:只读列表,不能二次赋值str=('s','t',1.5)元字典:用"{ }"标识,键值对存储dic={}dic['s']='test' ...

  3. 深入解析Javascript中this关键字的使用

    深入解析Javascript中面向对象编程中的this关键字 在Javascript中this关键字代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function TestFun ...

  4. awk(2)-模式(pattern)

    在上文 awk(1)-简述我们将简要描述了awk的主要使用方向和构成(由一个或多个模式-动作组成),本小节主要讲述awk的各种模式. ps:例子中使用的输入文件(如countries)内容可由awk( ...

  5. 十分钟了解分布式计算:Spark

    Spark是一个通用的分布式内存计算框架,本文主要研讨Spark的核心数据结构RDD的设计思路,及其在内存上的容错.内容基于论文 Zaharia, Matei, et al. "Resili ...

  6. 使用sublime编写c/c++ 总结

    大块头IDE Visual studio太大了,记事本也能写代码但无疑是装逼过分了.写一些轻量级的c/c++代码使用sublime来写是个很好的选择. 三步走: 编译器(win下安装了vs就使用cl, ...

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

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

  8. 使用navigator.geolocation来获取用户的地理位置信息

    使用navigator.geolocation来获取用户的地理位置信息 W3C 中新添加了一个名为 Geolocation的 API 规范,Geoloaction API的作用就是通过浏览器获取用户的 ...

  9. linux部署不同版本mysql

    测试环境部署过程中经常会遇到同一个服务器上部署两个不同版本的mysql数据库,在部署过程中也会有各种各样的问题,现将部署多版本mysql的方法总结如下: 1.下载mysql版本 http://down ...

  10. S3C2440的Linux启动过程分析(一)——SC2440处理器结构

    1.1.     S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MM ...