1、(2)掌握词法分析程序的作用。3、实验要求(1)对任给的一个C语言源程序,能够滤掉空格、回车换行符、tab键及注释。(2)识别各类单词符号,如关键字、标识符、运算符、常数、界符,结果以二元式形式输出,并构造符号表。(3)输出有词法错误的单词及所在行号。(在此阶段只能识别有限的词法错误)4、实验原理根据扫描到的单词符号的第一个字符的种类,分别转到相应的程序进行处理。这些程序的功能就是识别以相应字符开头的各类单词符号。5、实验步骤(1)根据C语言各类单词的正规式,构造能识别各类单词的状态转换图。(2)根据状态转换图,构造识别各类单词的词法分析器。6、状态转换图及词法分析程序(1)状态转换图 否 能
2、 是 否是 (2)程序源代码#include #includeusing namespace std;#define MAX 22 char ch = ;string key15=begin,endifthenelsewhilewriteread,do, callconstcharuntilprocedurerepeat;int Iskey(string c) /关键字判断 int i; for(i=0;iMAX;i+) if(pare(c)=0) return 1; return 0;int IsLetter(char c) /判断是否为字母 if(ca)|(c0c9) return 1;v
3、oid analyse(FILE *fpin) string arr= while(ch=fgetc(fpin)!=EOF) arr= if(ch=|ch=tn) else if(IsLetter(ch) while(IsLetter(ch)|IsDigit(ch) if(ch) ch=ch+32; arr=arr+ch; ch=fgetc(fpin); fseek(fpin,-1L,SEEK_CUR); if (Iskey(arr)coutarrt$关键字endl; else coutt$普通标识符else if(IsDigit(ch) while(IsDigit(ch)|ch=.IsDig
4、it(fgetc(fpin) coutt$无符号实数 else switch(ch) case+:- :*/coutcht$运算符break;(),t$界符ch=fgetc(fpin);) cout= else cout)coutt$输入控制符 else if(ch=t$输出控制符 elsecoutin_fn; if(fpin=fopen(in_fn,r)!=NULL) break;文件路径错误!n*分析如下* analyse(fpin); fclose(fpin); getchar();7、测试及结果8、心得 通过本次试验我对编译原理这门课程有了一种不一样的感觉,我发现在编写程序之前应该要有一个整体的规划,然后在考虑细节问题,不断地发现问题,修改程序,使之精益求精。通过实验,我对词法分析有了更进一步的认识和了解,在实验中还遇到了许多问题,通过不断地解决遇到的问题,我的能力也得到了提高。另外,编写代码时一定要有耐心,不怕错,只要有了这种精神什么困难都可以克服。在实验过程中我遇到许多问题,衷心感谢在这过程中帮助我的老师和同学们,谢谢你们,我会更加努力学习这门课程,迎难而上,学好这门课程!