预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共38页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

温故知新Lex是LEXicalcompiler的缩写,是Unix环境下非常著名的工具,主要功能是生成一个词法分析器的C源码,描述规则采用正规式。描述词法分析器的文件*.l,经过lex编译后,生成一个lex.yy.c的文件,然后由C编译器编译生成一个词法分析器。 LEX源程序经过LEX处理,并经过编译,可以生成一个词法分析器。这个词法分析器的作用就好像有限自动机一样,可以用来识别和产生单词符号。 2.5词法分析器的生成器2.5词法分析器的生成器2.5词法分析器的生成器2.5词法分析器的生成器2.5词法分析器的生成器2.5词法分析器的生成器用Lex定义常规表达式2.5词法分析器的生成器2.5词法分析器的生成器Lex中识别规则二义性处理Lex中识别规则二义性处理2.5词法分析器的生成器2.5词法分析器的生成器2.5词法分析器的生成器上机作业1、编写一个词法分析器,它针对输入文件,实现以下功能: 1)每遇到你的学号,就输出你的名字,对于其他的串原样输出。 2)统计输入文件中字母的数目。下载“第二次上机作业_词法分析”文档本章要点作业答案1、DFA,接受0和1的个数都是偶数的字符串00最初的划分是{0,1,2,3}和{4}。 1.状态集合的进一步划分是: {1,2},{0,3}和{4} 2.忽略了死状态的影响,会认为它们都不需要再分5、为正规式(a|b)*a(a|b)构造最简DFA(课后习题(2.12(a)) 解:三种方法: 方法一: (1)根据算法2.4构造NFA (2)根据算法2.2将NFADFA (3)根据算法2.3将DFA简化方法二: (1)直接构造NFA(3)根据算法2.3将DFA简化 划分状态集{A,B},{C,D}; {A,B}面临字母a时转到{B,C},由于B,C分属于不同的状态集,故此状态集{A,B}需要进一步划分成{A}{B}; 考虑{C,D},它面临字母a时转到{B,C},而B,C分属于不同的状态集,故此状态集{C,D}需要进一步划分成{C}{D}; 由上面可以知道,最简的DFA包含四个状态集{A}{B}{C}{D},这样前面的DFA就是最简的DFA。方法三: (1)直接构造DFA按照课堂所讲述的号外方法,直接构造DFA:任意的a,b串可以分属于以下几种情况: 长度为1:a,b; 长度大于等于1,末尾两位为ab,aa,ba,bb; 画出DFA,其中1:a,2:b,3:aa,4:ab,5:ba,6:bb. (2)根据算法2.3将DFA简化 6、(习题2.17)一个C语言编译器编译下面的函数时,报告parseerrorbefore‘else’。这是因为else的前面少了一个分号。但是如果第一个注释 /*thenpart*/ 误写成 /*thenpart 那么该编译器发现不了遗漏分号的错误。这是为什么? longgcd(p,q) longp,q; { if(p%q==0) /*thenpart*/ returnq else /*elsepart*/ returngcd(q,p%q); }【答案】此时编译器认为 /*thenpart returnq else /*elsepart*/ 是程序的注释,因此它不可能再发现else前面的语法错误。 分析这是注释用配对括号表示时的一个问题。注释是在词法分析时忽略的,而词法分析器对程序采取非常局部的观点。当进入第一个注释后,词法分析器忽略输入符号,一直到出现注释的右括号为止,由于第一个注释缺少右括号,所以词法分析器在读到第二个注释的右括号时,才认为第一个注释处理结束。人有了知识,就会具备各种分析能力, 明辨是非的能力。 所以我们要勤恳读书,广泛阅读, 古人说“书中自有黄金屋。 ”通过阅读科技书籍,我们能丰富知识, 培养逻辑思维能力; 通过阅读文学作品,我们能提高文学鉴赏水平, 培养文学情趣; 通过阅读报刊,我们能增长见识,扩大自己的知识面。 有许多书籍还能培养我们的道德情操, 给我们巨大的精神力量, 鼓舞我们前进。