编译原理实验词法分析报告实验报告材料Word下载.docx
- 文档编号:22472857
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:15
- 大小:37.92KB
编译原理实验词法分析报告实验报告材料Word下载.docx
《编译原理实验词法分析报告实验报告材料Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验词法分析报告实验报告材料Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
〈赋值语句〉∷=〈标识符〉∶=〈表达式〉
〈复合语句〉∷=BEGIN〈语句〉{;
〈语句〉}END
〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉
〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉}
〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}
〈因子〉∷=〈标识符〉|〈无符号整数〉|'
('
〈表达式〉'
)'
〈加法运算符〉∷=+|-
〈乘法运算符〉∷=*
〈关系运算符〉∷=<
>
|=|<
|<
=|>
|>
=
〈条件语句〉∷=IF〈条件〉THEN〈语句〉
〈字母〉∷=a|b|…|X|Y|Z
〈数字〉∷=0|1|2|…|8|9
实现PL0的词法分析
三、实验分析与设计
PL0词法分析程序是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析。
其主要方法步骤为从源程序扫描下一个字符,忽略空格、换行、TAB和注释并识别单词,再将不同类别的单词归类输出。
四、实验的实现
#include<
stdio.h>
#include<
stdlib.h>
string.h>
ctype.h>
stdbool.h>
#definenorw11//norw-1个关键字
#defineal20//最长的关键字的长度
#defineIDnorw
#defineINTnorw+1
#defineCOMMAnorw+2
#defineENDFnorw+3
#defineCOLONnorw+4
#defineSEMICnorw+5
#defineADDnorw+6
#defineMINUSnorw+7
#defineMULTInorw+8
#defineEVALUnorw+9
#defineLEnorw+10
#defineNEnorw+11
#defineLTnorw+12
#defineEQnorw+13
#defineGEnorw+14
#defineGTnorw+15
#defineFLOATnorw+16
charTOKEN[20];
//字符数组用来依次存放单词词文的各个字符
externintlookup(char*);
//以TOKEN字符串查保留字表
externvoidreport_error(char);
//报告程序中的词法错误
boolisalpha(char);
//判断接收字符是否为字母
boolisalnum(char);
//判断接收字符是否为字母或者数字
boolisdigit(char);
//判断接收字符是否为数字
boolisannotation(char);
//判断接收字符是否为注释
externcharletter(charc);
//用来将大写字母转化成小写字母
FILE*fin;
FILE*fout;
voidscanner()
{//词法分析的主体程序,对输入的文本文件进行词法分析
charch;
inti,c;
interror=0;
//记录文件中词法错误的个数
ch=fgetc(fin);
//从输入文件中读取一个字符
while(ch!
=EOF)
{//当从输入文件接收的字符不是文件结束符时,执行循环
if(isalpha(ch))
{//如果从输入文件接收的第一个字符是字母
ch=letter(ch);
TOKEN[0]=ch;
ch=fgetc(fin);
i=1;
while(isalnum(ch))
{ch=letter(ch);
TOKEN[i]=ch;
i++;
ch=fgetc(fin);
}
TOKEN[i]='
\0'
;
c=lookup(TOKEN);
//查保留字表
if(c==0){fprintf(fout,"
(%d,%s)\n"
ID,TOKEN);
}//输出标识符
elsefprintf(fout,"
c,TOKEN);
//输出接收单词为保留字
}
if(isdigit(ch))//如果从输入文件接收的第一个字符是数字
{
intcdot=0;
//统计小数点个数
while(isdigit(ch)||ch=='
.'
)
{//从第二个接收字符开始,当是数字或者是小数点时,执行循环
if(ch=='
cdot++;
//重复接收字符,直到接收到非数字
if(cdot>
=2)
{
error++;
TOKEN[i]='
printf("
%siserror\n"
TOKEN);
break;
}
if(isalpha(ch))//如果第二个字符是字母
{
while(isalpha(ch))//接收完所有的字母,跳出循环
{
TOKEN[i]=ch;
ch=fgetc(fin);
}
TOKEN[i]='
error++;
printf("
elseif(cdot==0)//当接收的字符为整型单词时
fseek(fin,-1,1);
inta,temp=0,c;
for(c=0;
c<
i;
c++)
a=TOKEN[c]-'
0'
if(c!
=0)
temp=temp*10;
temp=temp+a;
else
temp=a;
fprintf(fout,"
(%d,%d)\n"
INT,temp);
//输出接收单词为整数
elseif(cdot==1)
fseek(fin,-1,1);
inta,part1=0,jc,b=0;
//b用来确定小数点所在的位置
floatc=0.1,part2=0.0;
while(TOKEN[b]!
='
b=b+1;
for(jc=0;
jc<
b;
jc++)
a=TOKEN[jc]-'
if(jc!
part1=part1*10;
part1=part1+a;
part1=a;
for(jc=b+1;
a=TOKEN[jc]-'
part2=a*c+part2;
c=c*0.1;
(%d,%f)\n"
FLOAT,part1+part2);
//输出接收单词为小数
}elseif(cdot==2)
else//如果从输入文件接收的第一个字符既不是字母又不是数字
switch(ch)
{//将所接收到的符号字符进行分类,采取一符一类
case'
'
ch=fgetc(fin);
if(ch=='
)fprintf(fout,"
(%d,:
=)\n"
EVALU);
//输出接收符号为赋值号
else
{ch=fgetc(fin);
fseek(fin,-1,1);
//文件接收字符回推一个字符
fprintf(fout,"
(%d,'
)\n"
COLON);
//输出冒号
break;
'
fprintf(fout,"
COMMA);
//输出逗号
ENDF);
break;
//输出句号
SEMIC);
//输出分号
+'
ADD);
//输出加号
-'
MINUS);
//输出减号
*'
MULTI);
//输出乘号
<
)fprintf(fout,"
LE);
//输出小于或等于号
elseif(ch=='
NE);
//输出不等于号
else
{
fseek(fin,-1,1);
fprintf(fout,"
LT);
//输出小于号
}
break;
EQ);
//输出等于号
GE);
//输出大于或等于号
else
{
GT);
//输出大于号
}
'
\n'
\t'
/'
//检查是否为单行注释
if(ch=='
){
while(ch!
else{
/iserror\n"
);
case'
{'
while
(1){
if(ch=='
}'
)break;
if(ch==EOF){
{iserror\n"
default:
printf("
%ciserror\n"
ch);
//接收非上述字符程序报告词法错误
error++;
ch=fgetc(fin);
//继续从文件中读取下一个单词,直到文件结束
}//while循环结束
共发现%d个词法错误!
"
error);
return;
}
intlookup(char*token)
{
intj;
charword[norw][al];
strcpy(&
(word[1][0]),"
begin"
);
(word[2][0]),"
end"
(word[3][0]),"
var"
(word[4][0]),"
integer"
(word[5][0]),"
while"
(word[6][0]),"
do"
(word[7][0]),"
if"
(word[8][0]),"
then"
(word[9][0]),"
procedure"
(word[10][0]),"
else"
for(j=1;
j<
=norw-1;
j++)if(strcmp(token,word[j])==0)returnj;
//以TOKEN字符串查保留字表,若查到返回保留字类别码
return0;
//TOKEN不是保留字,返回0
boolisalpha(charc)
{//判断接收字符是否为字母
if((c>
a'
&
z'
)||(c>
A'
Z'
))return1;
elsereturn0;
boolisalnum(charc)
{//判断接收字符是否为字母或者数字
9'
boolisdigit(charc)
{//判断接收字符是否为数字
if(c>
)return1;
charletter(charc)//将大写字母转换成小写字母,即不区分大小写
if(c>
c=c+32;
returnc;
intmain()
charfilename[20];
请输入文件名:
scanf("
%s"
filename);
if((fin=fopen(filename,"
r"
))==NULL)//打开要读取的文本文件
不能打开文件.\n"
exit(0);
请输入保存分析结果的文件名:
if((fout=fopen(filename,"
w"
))==NULL)
printf("
exit(0);
scanner();
//调用词法分析程序
//getchar();
getchar();
fclose(fin);
fclose(fout);
return0;
五、运行的结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 词法 分析 报告 材料
![提示](https://static.bdocx.com/images/bang_tan.gif)