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)中存储变量. 为了使得计算器更加有用 ...
随机推荐
- Jasper_crosstab_group_dataset_Error incrementing crosstab dataset
Error detail: net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.JRRuntimeExceptio ...
- Sawgger框架
简介详情:https://blog.csdn.net/sanyaoxu_2/article/details/80555328
- ZOJ Saddle Point 数学思维题
http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5564 根据它的定义是行最小,列最大. 可以证明鞍点是唯一的. ...
- 【持续更新】HTML5 基础知识
文档类型声明 <!DOCTYPE html> 必不可少,位于文件第一行. 字符编码 <meta charset="UTF-8"> 语义化标记元素 heade ...
- js实现接口的几种方式
Javascript模仿接口可以有三种方式:1.注释法 2.检查属性法 3.鸭式辨形法 1.注释法:此方法属于程序文档范畴,对接口的继承实现完全依靠程序员自觉 /* interface People{ ...
- centos 7下Hadoop 2.7.2 伪分布式安装
centos 7 下Hadoop 2.7.2 伪分布式安装,安装jdk,免密匙登录,配置mapreduce,配置YARN.详细步骤如下: 1.0 安装JDK 1.1 查看是否安装了openjdk [l ...
- 绘制surfaceView 基础类
public class SurfaceViewTempalte extends SurfaceView implements Callback, Runnable { private Surface ...
- org.springframework.beans.factory.BeanCreationException: Could not autowire
由于我在项目中引用了如下代码,增加了 @Configurationpublic class Connection { public @Bean HttpClientConfig httpClie ...
- fluent_python2
字典和集合 泛映射类型, 继承自collections.abc, Mapping和MutableMapping 标准库里的所有映射类型都是利用 dict 来实现的,因此它们有个共同的限制,即只有可散列 ...
- iOS 随机数(Fixed)
ios 有如下三种随机数方法: 1. srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; 2. ...