编译原理实验报告词法分析 联系客服

发布时间 : 星期六 文章编译原理实验报告词法分析更新完毕开始阅读

d d 1 4 l|_ 6 . 7 d d l|_|. l|_|. 8 10 非l|d|_|.|e e 9 +|- d d 12 非+|-|l|_|.|e d l|_|e|. 14 e 非+|-|l|_|.|e|d +|- 17 d l|_|e|.|+|-

解释一下上面图的终结状态:

d l|_|e|.|+|- d 15 16 +|-|l|_|.|e 13 11 +|-|l|_|.|e 6 非l|d|_|.|e 5 状态5:表示整数,如123,78等

状态6:表示错误,包括以数字开头字母结尾的错误标识符,有多个小数点的数字,有多个E或e的数字等,这些都是词法错误。 状态10:表示小数,如12.34,7.1等

状态13:表示带有指数前面是小数的数,比如1.2e+12,2.34e14等

状态16:表示带有指数前面是整数的数,如:2e+12,4e11等

上述图中还省略了以小数点或字母e开头的DFA,但是这和上面所画的大同小异,所以在这里就不在重复的给出。画图确实比较麻烦。

至于有符号数,和上面的图实际上相差的也不多,就是在1号状态之前多了一个加号和减号的判断,这里也不再画出。 4.

运算符和界符:本次实验设计的运算符和界符很多,基本将所有的运算符都设

计进去了。其中包括

+,++,+=, -,-=,->,--, *,*=,

/,/=,<,<=, > , >= ,=,==,>>,>>=,<<,<<=,!=,&,&&,&=,~,|,||,|=,%,%=,! 但是还是有个别的运算符没有设计进去,比如?:,这是个三目的运算符,设计起来很麻烦,没设计,还有就是强制类型转换(类型),取地址&,指针*,指针的.运算都没有很好的设计思考,都是直接忽略了。 而关于界符,由于没有深入的思考,直接就将下列符号当作一个界符,并没有去考虑他是否还有其余的作用,显得很是粗糙。以下九个符号,都是当作一般符号处理:” , : , ? , [ , ] , { , } , ? , \\ 。没有具体的去考虑单个字符如 ?a?表示的实际上是一个数,”0123asd”表示的是字符串(虽然没错,但是自己写的程序却会报错,因为将0123asd当成了一个错误的数字),\\n表示的是换行符等等,都没有考虑,所以程序的功能很是简陋。 虽然设计的很简陋,但是除了一般的功能外,还是增加了一些功能的。对于C语言中的两种注释,自己还是花了点功夫的。行注释//与段注释/* */都能识别出来,并将注释的内容屏蔽,而不保存到输出文件中去。 由于设计的粗糙性,事实上,这里的所有运算符与界符,在设计中所用到的DFA都是大同小异的,因为原理都是一模一样的,所以在这里就简单举几个比较典型的例子,既能说明问题,又不会显得理论不足。

+ 1 2 + = 3此处与前面所画的无符号数判断完全相同,这里不再画出 4 d 5 6 非+|=|d — 8 = — 9 7 10 d 11 此处与前面所画的无符号数判断完全相同,这里不再画出 12 非—|=|d|> 13 > 14 * 15 = 16 非= 17 / = 18 19 非= 20 ! = 21 22 非= 23

= 24 = 25 非= 26 ^ = 27 28 非= 29 < = 30 31 = < 32 33 非= 34 非=|< 35 > 36 = 37 = > 38 39 非= 40 非=|> 41 % 42 = 43 非= 44