资源描述:
《设计2 词法分析之基于Lex实现词法分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、山东科技大学学生课程设计词法分析程序一、设计目的通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将其分解成各类单词的词法分析方法。二、设计要求要求将用模拟语言书写的源程序进行词法分析,输出源程序清单,Token文件和错误信息文件,若有错误,必须输出错误在源程序中行号和列号,并将符号表和字符串以文件的形式写出来。三、设计说明基于ParserGenarator的词法分析器构造方法。Lex输入文件由3个部分组成:定义集(definition),规则集(rule)和辅助程序集(auxiliaryroutine)或用户程序集(use
2、rroutine)。这三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下{definitions}%%{rules}%%{auxiliaryroutines}而且第一部分用“%{”和“%}”括起来。第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。9山东科技大学学生课程设计3.1正规式定义定义正则表达式如下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、whileSpecialsymbo
15、l=+
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[]+3.2转换规则定义在Lex中的规则定义构造定义识别保留字规则"int"
39、"else"
40、"return"
41、"void"
42、"if"
43、"while"{Upp
44、er(yytext,yyleng);9山东科技大学学生课程设计printf("%d行",lineno);printf("%sreservedword",yytext);}//保留字定义识别数字规则{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("%ss
63、pecialsymbol",yytext);}//特殊符号定义识别标识符规则{id}{printf("%d行",lineno);printf("%sID",yytext);}//标识符定义识别错误的字符串规则当开头为数字的后面为字母的字符串时,是错误的标识符。{error_id}{printf("error:%s",yytext);}//以数字开头的字符自动报错定义忽略空格规则{whitespace}{/*skipwhitespace*/}//忽略空格定义忽略回车规则{enter}{lineno++;}//遇到回车自动加行号忽略9山东科技大学学
64、生课程设计3.3辅助程序辅助程序集中包括主函数main()和辅助函数toupper()。3.3程序代码实现%{#include#include#includeintyywrap();intlineno=1;%}delim[t]ws{delim}+letter[A-Za-z]digit[0-9]id{letter}({letter}
65、{digit})*number{digit}+error_id({digit})+({letter})+enter[]spchar("{"
66、"}"
67、"["
68、"]"
69、
70、"("
71、")"
72、";"
73、"="
74、",")ariop("+"
75、"-"
76、"*"
77、"/")relop("<"
78、"<="
79、">"
80、">="
81、"=="
82、"!=")comment/*(*[^/]
83、[^*])**/reswd(int
84、else
85、return
86、void
87、if
88、while)%%{ws}{}{comment}{}{enter}{lineno++;}{reswd}{fprintf(yyout,"%d行tkeywodt%s",lineno,yytext);}{spchar}{fprintf(yyout,"%d行tspchart%s",li
89、neno,yytext);}{id}{fprintf(yyout,