资源描述:
《基于lex的c语言词法分析器》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验二C-语言的词法分析器(基于Lex)1.课程设计目标1.构造基于lex的词法分析器,以掌握编译原理的基本理论为基础,理解编译程序的基本结构,熟悉编译各阶段的基本理论和技术,掌握编译程序设计的基本理论和步骤,同时增强编写和调试高级语言源程序的能力,掌握词法分析的基本概念和实现方法,最终能开发出一个可以使用的稳定的面向saas基于lex的词法分析器。2.分析与设计基于ParserGenarator的词法分析器构造方法Lex输入文件由3个部分组成:定义集(definition),规则集(rule)和辅助程序集(auxiliaryroutine)或用户程序集(userroutine)。这
2、三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下{definitions}%%{rules}%%{auxiliaryroutines}而且第一部分用“%{”和“%}”括起来。第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。定义正则表达式如下ID=letterletter*NUM=digitdigit*Letter=a
3、…
4、z
5、A
6、…
7、ZDigit=0
8、…
9、9Keyword=else
10、if
11、int
12、return
13、void
14、whileSpecialsymbol=+
15、-
16、*
17、/
18、<
19、<=
20、>
21、>=
22、==
23、!=
24、=
25、;
26、,
27、(
28、)
29、[
30、]
31、{
32、}
33、/*
34、
35、*/Whitespace=“”Enter=在lex中的构造letter[A-Za-z]digit[0-9]id({letter}
36、[_])({letter}
37、{digit}
38、[_])*error_id({digit})+({letter})+num{digit}+whitespace[t]+enter[]+在Lex中的规则定义构造定义识别保留字规则"int"
39、"else"
40、"return"
41、"void"
42、"if"
43、"while"{Upper(yytext,yyleng);printf("%d行",lineno);printf("%sreservedword",yyte
44、xt);}//保留字定义识别数字规则{num}{printf("%d行",lineno);printf("%sNUM",yytext);}//数字定义识别专用符号规则","
45、";"
46、"("
47、")"
48、"{"
49、"}"
50、"*"
51、"/"
52、"+"
53、"-"
54、">"
55、"<"
56、">="
57、"<="
58、"=="
59、"!="
60、"="
61、"/*"
62、"*/"{printf("%d行",lineno);printf("%sspecialsymbol",yytext);}//特殊符号定义识别标识符规则{id}{printf("%d行",lineno);printf("%sID",yytext);}//标识符
63、定义识别错误的字符串规则当开头为数字的后面为字母的字符串时,是错误的标识符。{error_id}{printf("error:%s",yytext);}//以数字开头的字符自动报错定义忽略空格规则{whitespace}{/*skipwhitespace*/}//忽略空格定义忽略回车规则{enter}{lineno++;}//遇到回车自动加行号忽略辅助程序集中包括主函数main()和辅助函数toupper()。3.程序代码实现Lex代码//定义集,包括头文件和变量定义%{#include#include#include#in
64、cludeintlineno=1;//定义行号%}//定义正则表达式letter[A-Za-z]//字母digit[0-9]//数字id({letter}
65、[_])({letter}
66、{digit}
67、[_])*//开头为字母的标识符error_id({digit})+({letter})+//开头为数字的错误标识符num{digit}+//数字集合whitespace[t]+//空格enter[]+//回车//定义识别规则%%//识别保留字"int"
68、"else"
69、"return"
70、"void"
71、"if"
72、"while"{Upper(yytext,yylen
73、g);printf("%d行",lineno);//打印行号printf("%sreservedword",yytext);}//输出保留字//识别数字{num}{printf("%d行",lineno);//打印行号printf("%sNUM",yytext);}//输出数字//识别专用符号","
74、";"
75、"("
76、")"
77、"{"
78、"}"
79、"*"
80、"/"
81、"+"
82、"-"
83、">"
84、"<"
85、">="
86、"<="
87、"=="
88、"!="
89、"="
90、"/*"
91、"*