
LEX工具能够自动创建词法分析程序。
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
实验二 词法分析器一、实验目的旨在掌握词法分析器的内在构造逻辑,并熟悉手工编程或LEX编程两种方法之一。二、实验内容要求编写一个LEX源程序,使其能够将输入的源程序转化为一系列单词序列的输出结果。三、实验环境为Flex与VC6.0软件环境。四、实验注意事项:1. Id正则表达式:允许字母字符(letter) následane字母字符或数字字符(letter|digit)零次或多次出现。2. Num正则表达式:需要匹配一个或多个数字字符(digit)加上可选的小数部分(.{digit}+)?,小数部分可以包含一个可选的指数部分((E[+-]?{digit}+)?)。3. 注释:识别并处理多行注释,其格式为“/* ... */”。4. 关键字及其他字符的组合可以构成id,因此在词法分析过程中,id的判断应优先于关键字进行,以避免误判。5. 由于本程序仅用于简单地打印数字,因此并未考虑数字值的转换。6. >= 运算符比 > 运算符包含更多的字符,因此应在判断中将其置于前面。类似的符号也应按照这种方式进行排列。五、实验代码*******************************************************************************实验文件:lex.l、lex.yy.c实验结果:lex.exe运行方式:启动lex.exe程序后,会弹出input.txt窗口,在其中输入需要测试的源程序代码,保存并关闭该文件后,所得结果将显示在output.txt文件中*******************************************************************************%{void Install(char *type);%}%option noyywrapdelim [ \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);}{num} {Install(Num);}{key} {Install(Key);}{basic} {Install(Basic);}{op} {Install(Op);}; {Install(Comma);}{id} {Install(ID);}{comment} {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编译器,导致代码量相对较少。然而,Flex的正则表达式表达却颇具挑战性;由于参考网络教程时可能存在信息不完整的情况,导致表达式构建过程较为费力且并非所有表达式都能成功实现。例如括号相关的表达式“(\ ((.)*\ ))”或者“(\(.)*\)”在使用时均未能正常工作,因此被单独列出并编写出来显得有些突兀。其他表达式则相对简单易懂且顺利完成。
全部评论 (0)


