最近总是在忙各种事情,毕业设计要求写一个基于云计算的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. redis 原子增一的妙用

    有这样一个需求,插入数据库之前需要了解数据库ID号,考虑到不同的主机怎么去协同这个ID呢 同时要保证每个主机分到不同的ID号,这个比较麻烦,如果独立开一个服务来一个C/S操作比较麻烦,幸好REDIS提 ...

  2. Atom 安装 Packages 的笨办法

    在终端里输入下面的命令打开 Atom 的 packages 的安装目录. open ~/.atom/packages 然后找到需要安装的 Atom packages ,比如我需要安装的这个 atom- ...

  3. JavaScript+HTML,简单的计算器实现

    成功进化到程序猿快一年多了, 还没写过计算器, 正好今天比较闲,随手写了个计算器,最简单的实现,核心是eval()方法,把字符串作为JS代码处理,把输入的信息拼接成字符串,点等号执行代码得到结果,出异 ...

  4. SQL_函数

    五毛叶 — SQL_函数: 如下: 1 SQL_Aggregate函数 AVG() - 返回平均值 COUNT() - 返回行数 FIRST() - 返回第一个记录的值 LAST() - 返回最后一个 ...

  5. 带日期的bean转为json(bean->JSON)

    示例代码: JsonBean bean = new JsonBean();bean.setName("NewBaby");bean.setAge(1);bean.setBorn(n ...

  6. JSWindow对象

    Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外 ...

  7. 2013/10/24初学BOOST

    今天第一次接触学习boost库,虽然以前也听过boost,但是没有用心学习和使用此库. 学习的材料是:Boost_c++库.pdf RAII 智能指针的原理基于一个常见的习语叫做RAII:资源申请即初 ...

  8. quartz(1)

    关于定时任务的操作方法,java语言本身具有 Timer 来解决,但Timer 作用起来不是特别的舒服,由于项目的需要,使用了Quartz 这个调度框架,现把学习过程记录下来,方便以后查阅. 本教程是 ...

  9. Eclipse动态web工程(Dynamic Web Project)添加jar文件的正确方法

    Eclipse中,创建了动态web工程之后,如果需要添加新的jar文件,有两种方法.第一种是配置工程的“build path”,第二种则是将jar文件放在工程目录下的“/WebContent/WEB- ...

  10. Linux跨服务器拷贝文件详解

    要实现跨服务器拷贝文件,只需执行以下命令就可以: scp /temp/FastDFS_v3..tar.gz root@ip:/temp 拷文件夹如下: scp -r /webapps/xxx root ...