编译原理实践.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LEX源程序结构
LEX源程序是用LEX语言编写的词法规则说明,即用LEX语言 对表示高级程序设计语言的单词集的正则表达式进行描述。 LEX源程序分三个部分: 1.说明部分 2.识别规则 3.辅助过程。 各部分之间用%%隔开。即: 说明部分 %% 识别规则 %% 辅助过程
LEX源程序结构:说明部分
用LEX语言表达正则表达式
LEX的输入是LEX源程序. 首先介绍如何表示正则 表达式. LEX表示正则表达式时采用一些元字符* + ( ) \ [ ] | { } “ “等,表示方法如下. (1)对于单个的字母a,就直接表示成a,如a,+,-等 . (2)[abc]表示字符a,b,或c中的任一个,如[01] 表示0或1 (3)[a-d]表示字符a,b,c或d中的任一个. (4)[^ab]表示除了a或b外的任一个字符.
LEX源程序 YYLEX.C 字符串源程序 LEX C编译器 YYLEX.EXE YYLEX.C YYLEX.EXE 符号串源程序
LEX源程序是使用LEX语言编写的词法规则说明,经过LEX 翻译后形成目标文件YYLEX.C;再用C编译器对YYLEX.C进 行翻译,生成目标程序YYLEX.EXE,它就是词法分析程序,用 YYLEX.EXE就可以将字符串源程序转换成符号串源程序.
1 说明部分:
用于定义识别规则中要用到的正则表达式名,包括:
变量说明、 标识符常量说明、 正则定义, C语言的说明信息
(C语言的说明部分必须用分介符%和%括起来)。
LEX源程序结构:说明部分
说明部分由如下形式的LEX语句组成: D1 D2 …… Dn Rn 其中,R1,R2,…Rn使用LEX语言表示的正则表达式;D1 R1 R2
LEX简单的介绍
3 LEX能根据给定的正则表达式自动生成 相应的词法分析程序. LEX的输入是用LEX 语言写的源程序, 生成一个用C语言描述的词法分析程器, 所以LEX本身就相当于LEX语言写的编译 程序. LEX生成的目标程序包含一个状态转换 矩阵和一个控制执行程序.
LEX使用流程
使用LEX的流程如图:
用LEX语言表达正则表达式
例: 1)二进制数 (0|1)* 2)以aa或bb开头的由a和b任意组成的字符串 (aa|bb)(a|b)*或(aa|bb)[ab]*
3) 任何一个从0~9的数字:
[0-9] 4)长度不超过8的小写字符串 [a-z]{1,8}
用LEX语言表达正则表达式
5) 无符号整数
[0-9]+
6)可带小数点的有符号数 (“+”|”-”)?[0-9]+(“.”[0-9]+)? 7) 可带指数的有符号数 (“+”|”-”)?[0-9]+(“.”[0-9]+)?(E(“+”|”-”)?[0-9]+)?
8)标识符:字母或_开头,后跟字母数字、下划线等Fra Baidu bibliotek符
[a-zA-Z_]([a-zA-Z_]|[0-9])* 9)空白区 [ \t\n]+
LEX有一个重要的元字符约定是用大括号指出正则表 达式的名字。在前面已经提到过可以为正则表达式起 名,这些名字也可使用在其他的正则表达式中,而为 了将正则表达式名和普通的字符序列区分开来,将正 则表达式放在大括号中。 例如,无符号整数定义为:num=[0-9]+ 其中,num为正则表达式名。 在有符号的整数的定义中,可以引用正则表达式名 num: signedNum=(+|-)?{num} 注意:在定义正则表达式名时并不写大括号,只有在 使用正则表达式名时才加上大括号。
用LEX语言表达正则表达式
LEX有个特征,在方括号(表示字符类)中,大多数的 元字符都丧失了其特殊状况,且不必用引号括起来。甚 至如果可以首先将连字符列出来的话,则也可以将其看 作字符。因此,可将前一个数字的正则表达式(“+”|”-”) 写作[-+],但不能写成[+-],这是因为元字符“-”用于 表示字符的一个范围。又例如:[.”?]表示了句号、引号 和问号3个字符中的任一个字符,此时,这三个字符在 方括号中都丧失了它们元字符的含义。但是有一些字符 即使是在方括号中也仍是元字符,如\和^。如果要得到 像反斜杠\这种真正的字符就必须在字符前加一个反斜 杠。由于引号在方括号内已失去了它们的元字符的含义, 所以不能用引号,因此[\^\\]就表示了真正的字符^和\。
LEX简单的介绍
1 LEX(lexical ananlyzer generator) 一个词法分析程序的自动生成器. LEX是1972年贝尔实验室首先在 UNIX上实现的. 2 FLEX(fast lexical ananlyzer generator) 是对LEX的扩充,它可在 MS-DOS下运行. 我们这里实际使用 的是FLEX,但仍称呼为LEX.
用LEX语言表达正则表达式
(5). 表示除了换行符之外的任一个字符. (6)”text”表示双引号里的每个字符(包括元字符)都按 字符处理,如”ab[01]”就是表示ab[01]是字符串,其中 的[和]不是元字符 (7) \ 转义字符 (8){xxx}名字xxx表示的正则表达式。 (9)r|s表示正则表达式r或正则表达式s。
(10)rs表示正则表达式r与正则表达式s的连接。
用LEX语言表达正则表达式
(11)(r)表示()内的优先级高于括号外。
(12)r*表示正则表达式r可重复零次或多次。
(13)r+表示正则表达式r可重复一次或多次。 (14)r?表示r是一个可选的正则表达式。 (15)r{m,n}其中m,n是正整数,表达正则表达式r的 m~n次重复。 (16)r{m}表示正则表达式r的m次重复。 (17)r{m,}表示正则表达式r的m到多次的重复。 (18)^行的开始,$行的结尾
编译原理实践 --词法分析程序的自动生成器LEX
由于各种高级程序设计语言的单词形式 基本上可以用一组正规式来描述,人们 就希望能否构造一个自动生成系统,只 要给出程序设计语言的各类单词描述以 及识别出各类单词后应输出的结果,这 种自动系统便能自动产生此程序设计语 言的词法分析程序 Lex就是这样一个工具,他将正规式转换 为一个NFA,进而转换为相应的DFA, 这个DFA可以识别该正规式所表示的语 言的句子