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规范的更多相关文章

  1. Lex与Yacc学习(一)之环境配置篇

    Abstract 在开发程序的过程中经常会遇到文本解析的问题,例如:解析 C 语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用 C 或者 C++直接编写解析程序,这 ...

  2. Lex与Yacc学习(九)之Yacc语法

    Yacc语法 本文讨论yacc语法的格式并描述可用的各种特征和选项 yacc语法结构 yacc语法包括三部分:定义段.规则段和用户子例程段 ...定义段... %% ...规则段... %% ...用 ...

  3. Lex与Yacc学习(十)之Yacc库

    Yacc库 每个实现都需要有用的例程库,在UNIX系统中,可以通过cc命令行尾端给出-ly标志(或通过其他系统下的等价物)来包含库. 库的内容在不同的实现之间是不同的,但总是包括main()和yyer ...

  4. Lex与Yacc学习(六)之lex & yacc (简单计算器程序) 运行

    词法分析程序ch3-01.l %{ #include "ch3-01.tab.h" extern int yylval; %} %% [0-9]+ { yylval = atoi( ...

  5. Lex与Yacc学习(五)之正则表达式篇

    正则表达式语法 lex模式是由编辑程序和实用程序使用的正则表达式的扩展版本.正则表达式由常规字符(代表它们本身)和元字符(在一种模式中具有特殊含义)组成. 元字符 . . 匹配除了换行符 \n 之外的 ...

  6. Lex与Yacc学习(三)之符号表

    符号表 列举单词表的方式虽然简单但是不全面,如果在词法分析程序运行时可以构建一个单词表,那么就可以在添加新的单词时不用修改词法分析程序. 下面示例便利用符号表实现,即在词法分析程序运行时从输入文件中读 ...

  7. Lex与Yacc学习(二)之第一个Lex程序

    用lex识别单词 构建一个识别不同类型英语单词的简单程序.先识别词性(名词,动词等),然后再扩展到处理符合简单英语语法的多个单词的句子. 先列出要识别的一组动词: is    am   are   w ...

  8. Lex与Yacc学习

    http://www.cnblogs.com/shine-yr/p/5214976.html

  9. Lex与Yacc学习(八)之变量和有类型的标记(扩展计算器)

    变量和有类型的标记 下一步扩展计算器来处理具有单个字母名字的变量,因为只有26个字母 (目前只关心小写字母),所以我们能在26个条目的数组(称它为vbltable)中存储变量. 为了使得计算器更加有用 ...

随机推荐

  1. Jasper_crosstab_group_dataset_Error incrementing crosstab dataset

    Error detail: net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.JRRuntimeExceptio ...

  2. Sawgger框架

    简介详情:https://blog.csdn.net/sanyaoxu_2/article/details/80555328

  3. ZOJ Saddle Point 数学思维题

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5564   根据它的定义是行最小,列最大. 可以证明鞍点是唯一的. ...

  4. 【持续更新】HTML5 基础知识

    文档类型声明 <!DOCTYPE html> 必不可少,位于文件第一行. 字符编码 <meta charset="UTF-8"> 语义化标记元素 heade ...

  5. js实现接口的几种方式

    Javascript模仿接口可以有三种方式:1.注释法 2.检查属性法 3.鸭式辨形法 1.注释法:此方法属于程序文档范畴,对接口的继承实现完全依靠程序员自觉 /* interface People{ ...

  6. centos 7下Hadoop 2.7.2 伪分布式安装

    centos 7 下Hadoop 2.7.2 伪分布式安装,安装jdk,免密匙登录,配置mapreduce,配置YARN.详细步骤如下: 1.0 安装JDK 1.1 查看是否安装了openjdk [l ...

  7. 绘制surfaceView 基础类

    public class SurfaceViewTempalte extends SurfaceView implements Callback, Runnable { private Surface ...

  8. org.springframework.beans.factory.BeanCreationException: Could not autowire

    由于我在项目中引用了如下代码,增加了 @Configurationpublic class Connection {    public @Bean HttpClientConfig httpClie ...

  9. fluent_python2

    字典和集合 泛映射类型, 继承自collections.abc, Mapping和MutableMapping 标准库里的所有映射类型都是利用 dict 来实现的,因此它们有个共同的限制,即只有可散列 ...

  10. iOS 随机数(Fixed)

    ios 有如下三种随机数方法: 1.    srand((unsigned)time(0));  //不加这句每次产生的随机数不变         int i = rand() % 5; 2.     ...