最新编译原理实验报告2词法分析程序的设计Word下载.docx
- 文档编号:15239977
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:12
- 大小:93.27KB
最新编译原理实验报告2词法分析程序的设计Word下载.docx
《最新编译原理实验报告2词法分析程序的设计Word下载.docx》由会员分享,可在线阅读,更多相关《最新编译原理实验报告2词法分析程序的设计Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
其中单词种类用整数表示:
0:
标识符
1:
十进制整数
2:
八进制整数
3:
十六进制整数
运算符和界符,关键字采用一字一符,不编码
其中单词属性表示如下:
标识符,整数由于采用一类一符,属性用单词表示
运算符和界符,关键字采用一字一符,属性为空
3、编写测试程序,反复调用函数scan(),输出单词种别和属性。
四、实验环境
PC微机
DOS操作系统或Windows操作系统
TurboC程序集成环境或VisualC++程序集成环境
五、实验步骤
1、根据正规式,画出状态转换图;
2、根据状态图,设计词法分析算法;
观察状态图,其中状态2、4、7、10(右上角打了星号)需要回调一个字符。
声明一些变量和函数:
ch:
字符变量,存放最新读进的源程序字符。
strToken:
字符串变量,存放构成单词符号的字符串。
GetChar():
子函数,将下一输入字符读到ch中,搜索指示器前移一字符位置。
GetBC():
子函数,检查ch中的字符是否为空白。
若是,则调用GetChar()直至ch中进入一个非空白字符。
Concat():
子函数,将ch中的字符连接到strToken之后。
IsLetter():
布尔函数,判断ch中的字符是否为字母。
IsDigit():
布尔函数,判断ch中的字符是否为数字。
Reserve():
整型函数,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0。
SearchOp():
整型函数,对ch查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0。
Retract():
子函数,将搜索指示器回调一个字符位置,将ch置为空白字符。
ProError():
错误处理函数。
关键字保存在字符数组中,定义编码为相对数组首地址的位置+1。
保留子表顺序如下:
{if,then
else
while,
do},则相应编码为:
1,2,3,4,5。
运算符和界符保存在字符数组中,编码定义与关键字相同,顺序如下:
{+,-,*,/,>
<
=,(,),;
},编码为:
1~10。
二元表
单词
单词种类
属性
单词自身
1
2
3
运算符和界符
-
关键字
算法如下:
ch=’‘;
strToken=””;
GetBC();
if(IsLetter()){
while(IsLetter()||IsDigit())
{Concat();
GetChar();
}
Retract();
If(Reserve())printf("
<
%s,->
"
strToken);
elseprintf("
0,%s>
}
elseif(‘1’<
=ch&
&
ch<
=’9’){
while(IsDigit())
{Concat();
printf("
1,%s>
strToken);
}
elseif(ch==’0’){
GetChar();
if(ch>
=‘1’&
=‘7’){
while(ch>
=‘0’&
=‘7’)
{Concat();
Retract();
2,%s>
elseif(ch==’x’){
while(IsDigit()||ch>
=‘a’&
ch<
=’f’)
3,%s>
else{
printf(“<
1,0>
“);
elseif(SearchOp())printf("
%c,->
ch);
elseProError();
3、采用C或C++语言,设计函数scan(),实现该算法;
charGetChar(FILE*fp){//读取文件中的一个字符
charch;
ch=fgetc(fp);
returnch;
charGetBC(FILE*fp){//读取文件的字符直至ch不是空白
charch;
do{
ch=GetChar(fp);
}while(ch=='
'
||ch=='
\t'
\n'
);
returnch;
voidConcat(charch,charstrToken[]){//将ch中的字符连接到strToken之后
charstr[2];
str[0]=ch;
str[1]='
\0'
;
strcat(strToken,str);
intIsLetter(charch){//布尔函数,判断ch中的字符是否为字母,是返回1,否则返回0
intflag=0;
if(ch>
='
a'
&
z'
)
flag=1;
returnflag;
intIsDigit(charch){//布尔函数,判断ch中的字符是否为数字,是返回1,否则返回0
0'
9'
intReserve(charstrToken[]){//整型函数,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则返回0
intcode=0,i;
charkeyWord[6][6]={"
if"
"
then"
else"
while"
do"
};
for(i=0;
i<
5;
i++){
if(strcmp(strToken,keyWord[i])==0){
code=i+1;
break;
returncode;
intSearchOP(charch){//整型函数,对strToken中的字符串查找运算符和界符,若它是一个运算符或界符,则返回它的编码,否则返回0
intcode=0,i;
charOP[11]={'
+'
'
-'
*'
/'
'
>
='
('
)'
10;
if(ch==OP[i]){
charRetract(FILE*fp,charch){//子函数,将搜索指示器回调一个字符位置,将ch置为空白字符
ch='
fseek(fp,-1L,1);
voidProError(){//错误处理函数
printf("
输入错误!
\n"
return;
FILE*scan(FILE*fp){//输出单个二元式
charstrToken[10];
strToken[0]='
//置strToken为空串
ch=GetBC(fp);
//先读取一个非空白的字符
if(feof(fp))returnfp;
//判断文件尾,是则返回调用程序
if(IsLetter(ch)){//判断标识符
while(IsLetter(ch)||IsDigit(ch)){
Concat(ch,strToken);
ch=GetChar(fp);
ch=Retract(fp,ch);
if(Reserve(strToken)){//判断关键字
printf("
%s,->
else
0,%s>
elseif(ch>
1'
){//判断十进制整数
while(IsDigit(ch)){
ch=Retract(fp,ch);
printf("
1,%s>
elseif(ch=='
){
if(ch>
7'
){//判断八进制整数
while(ch>
){
Concat(ch,strToken);
ch=GetChar(fp);
}
ch=Retract(fp,ch);
2,%s>
elseif(ch=='
x'
){//判断十六进制整数
while(IsDigit(ch)||ch>
f'
3,%s>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 编译 原理 实验 报告 词法 分析 程序 设计