本研究提出了一种基于LEX工具的词法分析程序自动生成方法,旨在简化编译器设计过程中的词法分析模块开发工作。通过优化LEX规则配置,实现高效、准确地生成源代码词汇单元识别功能。
实验二 词法分析器
一、实验目的:
掌握词法分析器的构造原理,并学习手工编程或使用LEX的方法之一。
二、实验内容:
编写一个LEX源程序,使它能够生成可以将输入的源代码转换为单词序列输出的词法分析器。
三、实验环境
Flex+VC6.0
四、实验注意事项:
1.Id正则表达式:{letter}({letter}|{digit})*
2.Num正则表达式:{digit}+(\.{digit}+)?(E[+-]?{digit}+)?
3.注释格式为 (\/\*(.*)*\*\/)
4.当关键字后面加上其他字符时,可以编程id。因此,在词法分析过程中,判断ID应在判断关键字之前进行。
5.因为本程序仅用于简单的打印数字,所以未考虑数字的转换问题。
6.>= 比 > 多一个字符,在判定时应先处理 >=, 其他类似的情况也需如此安排。
五、实验代码
%{
void Install(char *type);
%}
%%
delim [ \t]
newline [\n]
digit [0-9]
num {digit}+(\.{digit}+)?(E[+-]?{digit}+)?
letter [A-Za-z]
id {letter}({letter}|{digit})*
key (if|while|do|break|true)
basic (int|float|bool|char)
op (>=|<=|==|>|<|=|!=|+|-*/)
comment (\/\*(.)*\*\/)
%%
delim {;}
newline {printf(\n);}
{Install(Num);}
{Install(Key);}
{Install(Basic);}
{Install(Op);}
; {Install(Comma);}
id {Install(ID);}
{Install(Comment);}
( | [ | { { Install (lbracket) ; }
) | ] | } { Install (rbracket) ; }
%%
void Install(char *s) {
fprintf(yyout, %s:%s , s, yytext);
}
int main() {
printf(请输入测试程序到input.txt中\n);
system(input.txt);
yyin = fopen(input.txt, r);
yyout = fopen(output.txt,w);
yylex();
fclose(yyout); fclose(yyin);
printf (分析结果在 output.txt 中 \n);
system (output.txt) ;
return 0; }
六、实验小结
本次的实验由于使用了flex,所以代码较短。主要难点在于正则表达式的编写规则较为复杂,在仅有的简单介绍下找到合适的规则比较费力。例如bracket的(\ ((.)*\ ))或者(((.)*))在实际应用中没有成功,因此单独写出这些规则显得有些不协调。其他部分相对比较简单,实验顺利完成。