资源描述:
《词法编译器报告.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理——C语言词法分析器学号姓名黎红波1、实验内容与要求基于C语言的字符集,编写C语言的词法分析器;要求能检查出输入程序中的不合法字符,输出该非法字符并显示所在行号;要求输出词法分析后的结果,并显示对应Token所在程序中的行号;要求能够过滤掉注释内容;2、实验方法利用flex工具进行分词,写出各种单词分类的正则表达式,利用flex工具自带的功能在linux下通过编写.l文件生成相应具有C语言词法分析功能的程序;3、分析与设计单词分类保留字:if
2、then
3、else
4、int
5、float
6、double
7、bool
8、char
9、printf
10、scanf
11、ret
12、urn
13、main
14、while
15、do
16、for
17、struct
18、void
19、break
20、const
21、static
22、auto
23、short
24、long
25、union
26、enum
27、typedef
28、unsigned
29、signed
30、extern
31、register
32、volatile
33、switch
34、case
35、goto
36、continue
37、default
38、sizeof
39、include标识符:[a-z_A-Z][a-z_A-Z0-9]*常量:1)字符串常量:"[^"]+"2)整型常量:([-+]?[1-9][0-9]*)
40、03)浮点常量:[-+]?[0-9]*.[0-9]+4)字
41、符常量:'[^']+'特殊符号:([=+-*/&!
42、%.])
43、([+-*/%<>=][=])限界符:[{}[](),;]注释判断://[^]*/*(.)**/利用yylineno来记录程序分析时所在行号,yytext记录当前正在分析的串;Analyse.l文件编写思路:当遇到上述分类中的匹配就输出对于行号和正在分析的串,当遇到空格、Tab及注释就直接跳过;没遇到一次’’则yylineno就增加1,如果都没有匹配成功则最后可以输出该字符不是C语言字符集里面的符号。4、实验结果
44、与分析对程序data.c进行分析:data.c:#includeintmain(){inta=0;intb+=a;//这是注释,编译期间会被忽略itnc=3.14;c=a+b;d="helloworld";c='c';return0;}测试截图如下:5、不足1、程序中略过了已#开头的行,对include和宏定义没有进行分析;2、对于/**/格式的注释,利用yylineno记录行数时只能记录在程序中的行号,没有包括注释中所包括的行号;6、源码展示(仅展示.l文件里面的内容)analyse.l:%{#include"stdio.h"#incl
45、ude"stdlib.h"%}INTEGER([-+]?[1-9][0-9]*)
46、0FLOAT[-+]?[0-9]*.[0-9]+STR"[^"]+"CHAR'[^']+'ID[a-z_A-Z][a-z_A-Z0-9]*SPEC([=+-*/&!
47、%.])
48、([+-*/%<>=][=])LIM[{}[](),;]%%#[^]*{}//[^]*{}/*(.)**/{}{INTEGER}{printf("Line%d:(Integer,%s)",yyline
49、no,yytext);}{FLOAT}{printf("Line%d:(Float,%s)",yylineno,yytext);}if
50、then
51、else
52、int
53、float
54、double
55、bool
56、char
57、printf
58、scanf
59、return
60、main
61、while
62、do
63、for
64、struct
65、void
66、break
67、const
68、static
69、auto
70、short
71、long
72、union
73、enum
74、typedef
75、unsigned
76、signed
77、extern
78、register
79、volatile
80、switch
81、case
82、goto
83、continue
84、def
85、ault
86、sizeof
87、include{printf("Line%d:(KeyWords,%s)",yylineno,yytext);}{STR}{printf("Line%d:(Str,%s)",yylineno,yytext);}{CHAR}{printf("Line%d:(Char,%s)",yylineno,yytext);}{ID}{printf("Line%d:(Id,%s)",yylineno,yytext);}{SPEC}{printf("Line%d:(Special,%s)",yylineno,yytext);}{L
88、IM}{printf("Line%d:(LimitDomain,%