编译原理词法分析器实验报告Word下载.docx
《编译原理词法分析器实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器实验报告Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
保留字和分隔符则采取一词一类。
(2)符号表的建立。
可事先建立一保留字表,以备在识别保留字时进行查询。
变量名表及常数表则在词法分析过程中建立。
(3)单词串的输出形式。
所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。
对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段则是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;
常数表登记项中则存放该整数的二进制形式。
)。
对于保留字和分隔号,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。
不过,为便于查看由词法分析程序所输出的单词串,也可以在CLASS字段上直接放置单词符号串本身。
(4)可以仿照书上图3.3的实现程序的结构来编写上述词法分析程序,但其中的若干语义过程有待于具体编写。
2.能对任何S语言源程序进行分析
在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。
3.能检查并处理某些词法分析错误
词法分析程序能给出的错误信息包括:
总的出错个数,每个错误所在的行号,错误的编号及错误信息。
4.本实验要求处理以下两种错误(编号分别为1,2):
1:
非法字符:
单词表中不存在的字符处理为非法字符,处理方式给出错误信息,“xxiserror”。
2:
源程序文件结束而注释未结束。
注释格式为:
/*……*/
三、实验程序设计说明
1.实验方案设计
2.程序源代码
#include<
stdio.h>
string.h>
ctype.h>
stdlib.h>
intlen,locate;
intMAXLEN=10;
intMAXDLG=9;
charstr[100];
charremain[10][10]={"
if"
"
else"
int"
while"
do"
return"
break"
continue"
};
chargetche()
{
//str[locate]=fgetc(fp);
//获取字符,指针fp自动指向下一个字符
returnstr[locate];
}
intsearch(char*temp)//是否为保留字
inti;
for(i=0;
i<
8;
i++)
{
if(strcmp(remain[i],temp)==0)
printf("
(%s,%d)\n"
temp,1);
return1;
}
return0;
voidread()
chartemp[100];
intcnt=0;
charch;
while(ch=getche(),ch=='
'
||ch==9||ch=='
\0'
)//去除单词前面多余的空格和制表符
if(ch=='
)
return;
//如果读取结束还没出现有用的字符则返回
locate++;
if(isalpha(ch))//如果是英文开头的
do
temp[cnt++]=ch;
locate++;
}while(ch=getche(),isalpha(ch)||isdigit(ch)||ch=='
_'
);
//读入到非字母数字下划线为止
temp[cnt]='
;
if(cnt>
MAXLEN)
%sistoolong\n"
temp);
elseif(!
search(temp))
(%s,%d)\n"
temp,2);
}
elseif(isdigit(ch))//如果是数字开头,则必然不是标示符
{
}while(ch=getche(),isdigit(ch));
MAXDLG)
%sisbigerthanthemaxnumber\n"
else
(%s,%d)\n"
temp,3);
elseif(ch=='
'
||ch=='
'
('
)'
{'
}'
)//如果是分隔符
(%c,%d)\n"
ch,5);
+'
-'
*'
/'
='
>
<
!
)//运算符
)//判断是否为++
ch=getche();
{
++4\n"
}
}
)//判断是否为-
--4\n"
else//否则的话,任意运算符后面都能跟上=
)//判断是否为两个字符构成的运算符
if(strcmp(temp,"
"
)==0)
iserrorinput!
\n"
else
(%s,%d)\n"
temp,4);
%ciserrorinput!
ch);
voidmain()
intlinecnt=0;
charchoice;
flushall();
请输入字符串:
gets(str);
第%d行\n"
++linecnt);
len=strlen(str);
locate=0;
while(locate<
len)
read();
Doyouwanttocontinuetoinput?
Pleaseselectone:
(YorN)\n"
scanf("
%c"
&
choice);
}while(choice=='
Y'
3.程序的执行结果
图1程序输入文件内容
图2输出结果
4.实验程序的优点和特色
本程序分类清楚,出错处理能力强,任何非法字符输入,将会报错,而且可以多次输入
四、实验中出现的问题及解决方法
本程序的缺点就是没有用文件存储,需要每次运行手动输入,给用户带来不方便
五、体会、意见或建议
通过本次试验了解了词法分析程序的设计方法,以及编译程序,在设计之前首先要构思好设计方法,可事先建立一关键字表,以备在识别关键字时进行查询。
而且深切体会到学习过的东西要是长期不用就会淡忘,就像C语言一样,大一学过的,但之后就几乎没用过,忘记了好多,所以我们要温故而知新。