当前位置:文档之家› 编译原理词法分析器的构造

编译原理词法分析器的构造

四、实验小结(包括问题和解决方法、心得体会、意见
与建议等)
这次实验让我们更加了解词法分析程序的原 理,熟悉了书上词法分析程序构建的步骤,也强 化了我们的编程能力,比如说文件读写操作。在 我的程序中,思考了很久也没能实 现”<=””>=”和”!=”的词法分析。拿”>=”举例来 说,CHAR读了”>”之后,进行判断如果是”=”就 输出“(4,’>=’)”。但是如果接下来的字符不 是”=”,就需要判断这个CHAE字符是否为字母、 数字、分隔符、其他运算符,这样就会和之前的 判断进入一个死循环(因为在保留字判断的时候 也要多读一个字符,判断为否定后要比较这个字 符是否为数字,分隔符,运算符)。总的来说就 是我不能将文件指针前移,导致这里写不出来,
} bool REAERVE(char *a) {
//判断标识符是否为保留字
if(strcmp(a,"if")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"int")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"for")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"while")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"do")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"return")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"break")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"continue")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"main")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} return false; }
return true; else return false; } bool DIGIT (char A) { if(A>='0'&&A<='9')
return true; else
return false; } bool REAERVE(char *a) {
if(strcmp(a,"if")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"int")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"for")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"while")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"do")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"return")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"break")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"continue")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} if(strcmp(a,"main")==0) {cout<<"(1,'"<<a<<"')"<<endl;return true;} return false; } bool zimu(char A) {
实验报告
(2014 / 2015 学年 第 一 学期)
课程名 称
实验名 称
实验时 间
指导单 位
指导教 师
编译原理 词法分析器的构造
2015 年 4 月 10 日 南京邮电大学 蒋凌云
学生姓名 孙雪禄
学院(系) 计算机学 院、软件 学院
班级学 号
专业
B12041213
软件工程 (服务外
包)
实验名 称
TOKEN[i]='\0';
if(!REAERVE(TOKEN))
cout<<"(3,'"<<TOKEN<<"')"<<endl;
}
if(CHAR=='+'||CHAR=='-
'||CHAR=='*'||CHAR=='/'||CHAR=='>'||CHAR=='<'||CHAR=='=') //运?算?符?
else if(A>='A'&&A<='Z') return true;
else return false; } bool DIGIT (char A)
//判断字符是否是字母 //判断字符是否是数字
{ if(A>='0'&&A<='9') return true; else return false;
while((CHAR=fgetc(f))!=EOF)
{
while(CHAR!=' ')
{
if(zimu(CHAR))
//标括?识?符?
{
int k=0;
do{
TOKEN[k]=CHAR;
k++;
}while((CHAR=fgetc(f))!=EOF&&CHAR!=' '&&zimu(CHAR));
(1)首先讲和书上一样分成5类
分类号 分类内容
1
保留字
2
标识符
3
整数
4
运算符(+,-,*,/,>,<,=等)
5
分隔符(,,;,{,},(,))
(2)、接着写出用到的简单文法并转换成状态转换图
<标识符>::=字母|字母<标识符>|<标识符>数字
<整数>::=数字|数字<整数>
<运算符>::=+|-|*|<|>|=
cin>>CHAR;
return 0; }
测试结果:
文件存储在code.txt文件中
0 ⑤ ⑥ 3 1 ② ④ 字母 非数字或字母 字母或数字 数字 数字 非数字 +-*/=>< ,;( ){} 0 ⑤ ⑥ 3 1 ② ④ 字母
非数字或字母 字母或数字 数字 数字 非数字 +-*/=>< ,;( ){}
<分隔符>::=,|;|(|)|{|}
保留字是一种特殊的标识符,不独立写出其文法
状态转换图如下:
(3) 按照书上的步骤写程序
相关主题