资源描述:
《设计2词法分析之基于Lex实现词法分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、词法分析程序一、设计目的通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程屮,将其分解成各类单词的词法分析方法。二、设计要求要求将用模拟语言书写的源程序进行词法分析,输出源程序清单,Token文件和错误信息文件,若有错误,必须输出错误在源程序中行号和列号,并将符号表和字符串以文件的形式写出来。三、设计说明基于ParserGenarator的词法分析器构造方法。Lex输入文件由3个部分组成:定义集(definition),规则集(rule)和辅助程序集(auxiliaryroutine)或用户程序集(userroutine)□
2、这三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下{definitions}%%{rules}%%{auxiliaryroutines}而且第一部分用“%{”和“%}”括起来O第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。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、whileSpecialsymbol=+
15、-
16、*
17、/
18、<
19、<=
20、
21、>
22、>=
23、==
24、!=
25、=
26、;b
27、(
28、)
29、[
30、]
31、{
32、}
33、/*
34、*/Whitespace=""Enter二在lex中的构造letter[A-Za-z]digit[0-9]id({letter}
35、[J)({letter}
36、{digit}
37、[_])*error_id({digit})+({letter})+num{digit}+whitespace[t]+enter[]+3.2转换规则定义在Lex屮的规则定义构造定义识别保留字规则nint,T,else,T,return,T,void,T,ifT,whilen{Upper(yytext,yyleng
38、);printf("%d行H,lineno);printf("%sreservedwordH,yytext);}//保留字定义识别数字规则{num}{printf(H%d行"Jineno);printf(M%sNUMH,yytext);}〃数字定义识别专用符号规则{printf("%d彳亍"Jineno);printf("%sspecialsymbolu,yytext);}//特殊符号定义识别标识符规则{id}{printf("%d行n,lineno);printf("%sID”,yytext);}//标识符定义识别错误的字符串规则当开
39、头为数字的后面为字母的字符串吋,是错误的标识符。{error_id}{printf(nerror:%sn,yytext);}//以数字开头的字符自动报错定义忽略空格规则{whitespace}{/*skipwhitespace*/}//忽略空格定义忽略冋车规则{enter}{lineno++;}//遇到回车口动加行号忽略3.3辅助程序辅助程序集中包描主函数main()和辅助函数toupper()。3.3程序代码实现%{#incIude#incIude#inc丨ude〈string.h>intyywrap();i
40、ntIineno二1;%}deIim[t]ws{deIim}+letter[A-Za-z]digit[0-9]id{Ietter}({letter}
41、{digit})*number{digit}+error_id({digit})+({letter})+enter[]spchar(”{,TTTTTT‘m;U…)ariop(〃+〃
42、〃-〃
43、〃*'T7〃)reIop(〃〈〃
44、〃〈二〃
45、〃>〃
46、〃>二〃
47、〃=〃
48、〃!二〃)comment/*(*「/]
49、「*])**/reswd(int
50、eIse
51、return
52、void
53、if
54、whiIe)%%{
55、ws}{}{comment}{}{enter}{Iineno++;}{reswd}{fprintf(yyout,"%d行tkeywodt%s",Iineno,yytext);}{spchar}{fprintf(yyout,"%d行tspchart%s",Iineno,yytext);}{id}{fprintf(yyout,"%d行七identifiert%s",丨ineno,yytext);}{number}{fprintf(yyout,"%d行tnumbert%s",丨ineno,yytext)汀{error_id}{
56、fprintf(yyout,"%d行terror_idt%s",丨ineno,yyte