Lex与Yacc学习(四)之Lex规范
Lex规范的结构
lex程序由三部分组成:定义段、规则段和用户子例程序段
...定义段...
%%
...规则段...
%%
...用户子例程序段...
这些部分由以两个百分号组成的行分隔开。尽管某一部分可以为空,但前两部分是必须的,第三部分和前面的%%行可以忽略。
定义段
定义段包括文字块、定义、内部表声明、起始条件和转换。
以空白开头的行被逐字拷贝到C文件中,通常,这用于包含包围在/*和*/中的注释,一般前面有空白。
规则段
规则段包含模式行和C代码,以空白开始的行或者包围在%{和%}中的内容是C代码。以任何其他形式开始的行是模式行。
C代码被逐字拷贝到生成的C文件中。
当lex扫描程序运行时,它把输入与规则段的模式进行匹配。每次发现一个匹配(被匹配的输入称为标记(token))时就执行与那种模式相关的C代码。如果模式后面跟着|符号,则该模式将使用与文件中下一个模式相同的C代码。当输入字符不匹配模式时,词法分析程序的动作就好像它匹配上了代码ECHO的模式,ECHO将标记的拷贝写到输出。
用户子例程序段
用户子例程序段的内容被lex逐字拷贝到C文件,这一部分通常包括从规则中调用的例程。如果重新定义input()、unput()、output()、或者yywrap(),新的版本或者支持子程序,都可以放在这里。
lex库
大多数lex实现都需要有用的例程库,通过在UNIX系统的cc命令行的结尾(或其它系统的等价物上)给出-ll 标志来链入库。库的内容根据实现的不同有所改变,但它总是包含main()。
main()
lex的所有版本都有最小的main()程序,它对于简短程序和测试都是很有用的。它非常简单,内容如下:
main(argc,argv)
int argc;
char **argv;
{
yylex();
return 0;
}
int yywrap()
{
return 1;
}
yyleng()
只要是在扫描程序匹配标记时,标记的文本就被存储在以空字符终止的字符串yytext中,而它的长度存在yyleng中, yyleng()返回的值与strlen(yytext)返回的值是相同的。
yylex()
由lex创建的扫描程序有入口点yylex()。调用yylex()启动或重新开始扫描。如果lex动作执行将数值传递给调用程序的return,那么yylex()的下次调用就从它停止的地方继续。
yywrap()
当词法分析程序遇到文件结尾时,它调用例程yywrap()来找出下一步要做什么,如果yywrap()返回0,则扫描程序就继续扫描,如果返回1,则扫描程序就返回报告文件结尾的零标记。
lex库中的yywrap()的标准版本总是返回1,但是可以用自己的值来替代它,如果yywrap()返回指示有更多输入的0,那么它首先需要调整指向新文件的yyin,可能需要使用fopen()。
Lex与Yacc学习(四)之Lex规范的更多相关文章
- Lex与Yacc学习(一)之环境配置篇
Abstract 在开发程序的过程中经常会遇到文本解析的问题,例如:解析 C 语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用 C 或者 C++直接编写解析程序,这 ...
- Lex与Yacc学习(九)之Yacc语法
Yacc语法 本文讨论yacc语法的格式并描述可用的各种特征和选项 yacc语法结构 yacc语法包括三部分:定义段.规则段和用户子例程段 ...定义段... %% ...规则段... %% ...用 ...
- Lex与Yacc学习(十)之Yacc库
Yacc库 每个实现都需要有用的例程库,在UNIX系统中,可以通过cc命令行尾端给出-ly标志(或通过其他系统下的等价物)来包含库. 库的内容在不同的实现之间是不同的,但总是包括main()和yyer ...
- Lex与Yacc学习(六)之lex & yacc (简单计算器程序) 运行
词法分析程序ch3-01.l %{ #include "ch3-01.tab.h" extern int yylval; %} %% [0-9]+ { yylval = atoi( ...
- Lex与Yacc学习(五)之正则表达式篇
正则表达式语法 lex模式是由编辑程序和实用程序使用的正则表达式的扩展版本.正则表达式由常规字符(代表它们本身)和元字符(在一种模式中具有特殊含义)组成. 元字符 . . 匹配除了换行符 \n 之外的 ...
- Lex与Yacc学习(三)之符号表
符号表 列举单词表的方式虽然简单但是不全面,如果在词法分析程序运行时可以构建一个单词表,那么就可以在添加新的单词时不用修改词法分析程序. 下面示例便利用符号表实现,即在词法分析程序运行时从输入文件中读 ...
- Lex与Yacc学习(二)之第一个Lex程序
用lex识别单词 构建一个识别不同类型英语单词的简单程序.先识别词性(名词,动词等),然后再扩展到处理符合简单英语语法的多个单词的句子. 先列出要识别的一组动词: is am are w ...
- Lex与Yacc学习
http://www.cnblogs.com/shine-yr/p/5214976.html
- Lex与Yacc学习(八)之变量和有类型的标记(扩展计算器)
变量和有类型的标记 下一步扩展计算器来处理具有单个字母名字的变量,因为只有26个字母 (目前只关心小写字母),所以我们能在26个条目的数组(称它为vbltable)中存储变量. 为了使得计算器更加有用 ...
随机推荐
- Qt 2D绘图之三:绘制文字、路径、图像、复合模式
一.绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::font ...
- python-函数进阶-动态传参,名称空间,作用域的问题
一.函数的动态的动态参数 动态参数分为两种:动态接收位置参数.动态接收关键字参数. 1.*args 位置参数动态传参 # 顺序: 位置参数=>*args(arguments) => 默认 ...
- Lock简介
digest synchronized已经提供了锁的功能,而且还是Java的内置特性,那为什么还要出现lock呢? 用一句话来讲就是——synchronized可以实现同步,但太死板了它的同步机制:l ...
- PS基础知识学习
PS学习视频(全) https://ke.qq.com/webcourse/index.html#course_id=28554&term_id=100014572&taid=1349 ...
- Java基础教程(25)--I/O
一.I/O流 I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等. 流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据 ...
- HTTP 三次握手 建立连接 和 四次握手断开连接
三次握手建立连接 第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机: 第二次握手:主机B收到请求后要确 ...
- Python 字符编码问题的处理
python中的字符编码问题往往是初学者容易弄不明白的问题, 要想将这个问题搞清楚,需要先弄明白以下的概念 decode 和 encode 函数的作用 字符串字面量的编码格式 decode(str) ...
- 1898 ERROR nova.compute.manager
2018-06-10 21:03:54.045 1898 ERROR nova.compute.manager [instance: 15a6c26f-b8af-4a3e-a3df-8552c16e0 ...
- 如何解决源码安装软件中make时一直重复打印configure信息
在通过源码安装软件时,会出现执行./configure后再make时总是重复打印configure的信息,无法进入下一阶段的安装. 主要原因是系统当前的时间与实际时间不一致,特别是在虚拟机上经常会出现 ...
- 二级域名绑定ECS
关于阿里云域名的绑定,下面是个人的理解,如有错误请指出. 首先,任何域名都需要在阿里云备案后才可以使用, 如果是二级域名,不能单独备案,需要其顶级域名在阿里云备案. http://help.aliyu ...