定义识别错误的字符串规则
当开头为数字的后面为字母的字符串时,是错误的标识符。 {error_id}
{printf(\以数字开头的字符自动报错 定义忽略空格规则 {whitespace}
{/* skip whitespace */}//忽略空格 定义忽略回车规则 {enter}
{lineno++;}//遇到回车自动加行号忽略
? 辅助程序集中包括
主函数main ()和辅助函数toupper()。
? 程序代码实现 Lex代码
//定义集,包括头文件和变量定义 %{
#include
//定义正则表达式 letter [A-Za-z] //字母 digit [0-9] //数字
id ({letter}|[_])({letter}|{digit}|[_])* //开头为字母的标识符 error_id ({digit})+({letter})+ //开头为数字的错误标识符 num {digit}+ //数字集合 whitespace [ \\t]+ //空格 enter [\\n]+ //回车 //定义识别规则 %%
//识别保留字
\
{Upper(yytext,yyleng);
printf(\行\打印行号
printf(\输出保留字 //识别数字 {num}
{printf(\行\打印行号
printf(\输出数字 //识别专用符号
\|\
{printf(\行\打印行号
printf(\输出特殊符号 //识别标识符 {id}
{printf(\行\打印行号
printf(\打印标识符 //识别错误的标识符 {error_id} {printf(\行\
printf(\以数字开头的字符自动报错 //识别空格
{whitespace}
{/* skip whitespace */}//忽略空格 //识别回车
{enter}
{lineno++;}//遇到回车自动加行号忽略 %%
//转换大小写
Upper(char *s,int l){ int i;
for(i=0;i }//将保留字变为大写 //主函数 main(void) { //定义输入文件名变量 char infilename[400]; printf(\输入文件名:\ scanf(\ yyin = fopen(infilename,\读取文件 printf(\开始词法分析: \\n\ return yylex(); } 五、测试过程及结果 (1)Win7下lex 与 yacc的安装配置 测试安装是否成功,测试结果如图所示,当前文件夹多了两个文件,安装成功: (2)利用Parser Genarator的词法分析器构造 六、实验总结: 通过本实验,我了解了Lex的用法,并构造了Parser Genarator编译器。成功将实例程序中的Token识别出来,并记录其value值。在学习的过程中,感觉理解起来比较困难,所以操作过程中出现了很多错误。但是,最终在老师和同学的帮助下完成了此次实验。 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2015年12月23日