编译原理实验词法语法分析附源代码Word格式文档下载.docx
- 文档编号:16936320
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:22
- 大小:71.04KB
编译原理实验词法语法分析附源代码Word格式文档下载.docx
《编译原理实验词法语法分析附源代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验词法语法分析附源代码Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
过程调用语句>
|<
复合语句>
读语句>
写语句>
空>
表达式>
=BEGIN<
{;
}END
关系运算符>
|ODD<
=[+|-]<
项>
加法运算符>
因子>
乘法运算符>
|‘(’<
‘)’
=+|-
=*|/
==|#|<
=|>
|>
=
=IF<
条件>
THEN<
=CALL标识符
=WHILE<
DO<
=READ‘(’<
{,<
}‘)’
=WRITE‘(’<
¥
=a|b|…|X|Y|Z
=0|1|…|8|9
【预处理】
对于一个pl0文法首先应该进行一定的预处理,提取左公因式,消除左递归(直接或间接),接着就可以根据所得的文法进行编写代码。
【实验一】词法分析
【实验目的】给出PL/0文法规范,要求编写PL/0语言的词法分析程序。
【实验内容】已给PL/0语言文法,输出单词(关键字、专用符号以及其它标记)。
@
【实验要求】
1.确定编译中使用的表格、标识符与关键字的区分方法等。
2.把词法分析器设计成一个独立一遍的过程。
3.词法分析器的输出形式采用二元式序列,例如:
(ident,a)
(plus,+)
(number,15)
(times,*)
(ident,b)
【输入输出】
(
输入:
PL/0源程序。
例:
a+15*b
输出:
【实验结果】
实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,到达句柄时,则采取LL
(1)文法进行规约。
—
实验结果如下:
实验结果用文本来进行输入输出,所以在工程目录下还会有一个文本输入,输出文件。
分别为
【实验体会】
在编写这段代码的过程中,比较麻烦得还是之前的语法预处理阶段,将不满足ll
(1)文法的语法转化为标准的ll
(1)文法。
程序在处理词法分析的过程就是不断通过getsym()这个函数来条用getch(),不断形成一个一个的词汇,供下面语法分析时使用。
记录词汇类型的sym是一个枚举类型。
使用起来会方便许多,比较系统。
其中还用到了文本输入输出的技巧,把读出的词汇保存起来。
词法分析还是比较简单,在编写代码的时候没有太大的阻碍。
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;
熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。
另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。
、
【实验二】语法分析
【实验目的】给出PL/0文法规范,要求编写PL/0语言的语法分析程序。
【实验内容】已给PL/0语言文法,构造表达式部分的语法分析器。
1.将实验一“词法分析”的输出结果,作为表达式语法分析器的输入,进行语法解析,对于语法正确的表达式,报告“语法正确”;
对于语法错误的表达式,报告“语法错误”,指出错误原因。
2.把语法分析器设计成一个独立一遍的过程。
3.语法分析器的编写方法采用递归子程序法。
`
PL/0表达式,用实验一的输出形式作为输入。
例如:
对于PL/0表达式,a+15*b用下列形式作为输入:
(number,15)
对于语法正确的表达式,报告“语法正确”;
"
实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,对输入的一个语句进行判断,判断语法的正误,采用对算法的判断,若全为数字则进行最后的计算
|
通过语法分析可以判断当前输入语句是否正确,实验通过对数学式的处理来进行对语句的判断是否正确,若正确则只要输入“语句正确”即可,若语句错误则需要根据错误的原因输出错误的理由,以方便编译员修改自己的代码。
实现方法是通过对文本文件的输入,当前数据与即将输入的字符串进行匹配,若不符合LL
(1)文法则判定为错误,若符合则继续向下完成语法分析。
【源代码】
#include<
>
iostream>
stack>
-
string>
fstream>
usingnamespacestd;
ifstreamfin("
);
ofstreamfout("
enumsymbol
{]=period;
ssym['
#'
]=neq;
//notequal
'
]=semicolon;
strcpy(&
symwork[plus][0],"
plus"
symwork[minus][0],"
minus"
symwork[times][0],"
times"
symwork[slash][0],"
slash"
symwork[lparen][0],"
lparen"
symwork[rparen][0],"
rparen"
symwork[eql][0],"
eql"
symwork[comma][0],"
comma"
…
symwork[neq][0],"
neq"
symwork[period][0],"
period"
symwork[semicolon][0],"
semicolon"
word[0][0],"
begin"
//关键字小写字母
word[1][0],"
call"
word[2][0],"
const"
word[3][0],"
do"
word[4][0],"
end"
word[5][0],"
if"
word[6][0],"
odd"
word[7][0],"
procedure"
word[8][0],"
read"
word[9][0],"
then"
word[10][0],"
var"
word[11][0],"
while"
word[12][0],"
write"
wsym[0]=beginsym;
wsym[1]=callsym;
wsym[2]=constsym;
wsym[3]=dosym;
wsym[4]=endsym;
wsym[5]=ifsym;
wsym[6]=oddsym;
wsym[7]=procsym;
wsym[8]=readsym;
wsym[9]=thensym;
wsym[10]=varsym;
wsym[11]=whilesym;
wsym[12]=writesym;
voidWordAnalyse()
{
switch(sym)
{
case<
("
nul"
"
ID<
)"
endl;
]
break;
caseident:
fout<
ident"
cout<
break;
casenumber:
number"
num<
caseplus:
caseminus:
casetimes:
~
caseslash:
caseoddsym:
oddsym"
caselss:
lss"
lsst"
caseeql:
caseneq:
。
caseleq:
leq"
casegtr:
gtr"
casegeq:
geq"
geqt"
caselparen:
lparent"
caserparen:
rparent"
casecomma:
casesemicolon:
caseperiod:
casebecomes:
becomes"
casebeginsym:
beginsym"
caseendsym:
endsym"
caseifsym:
ifsym"
casethensym:
thensym"
casewhilesym:
whilesym"
casewritesym:
writesym"
\
casereadsym:
readsym"
casedosym:
dosym"
casecallsym:
callsym"
caseconstsym:
constsym"
strcpy(ID,"
casevarsym:
varsym"
)
caseprocsym:
procsym"
default:
}
intgetch()
if(cc==ll)
{
if())
cout<
programincpmplete!
!
return-1;
ll=cc=0;
(line,81);
ll=strlen(line);
ch='
'
return0;
}
if(cc==0)cout<
line<
ch=line[cc];
cout<
ch<
cc++;
nn=cc;
return0;
#definegetchdoif(-1==getch())return-1
//词法分析部分实验1
intgetsym()//读符号大写字母不要出现
inti,j,k;
//用于循环等辅助计数
while(ch=='
||ch==9||ch==10)//////////////////////////////////////////
getchdo;
}
if(ch>
='
a'
&
z'
k=0;
while(ch>
||ch>
0'
9'
)//名字或保留字以开头
if(k<
al)
{
ID[k]=ch;
k++;
}
getchdo;
}
ID[k]=0;
i=0;
j=norw;
do/*搜索当前符号是否为保留字*/
k=(i+j)/2;
if(strcmp(ID,word[k])<
=0)j=k-1;
if(strcmp(ID,word[k])>
=0)i=k+1;
}while(i<
=j);
if(i-1>
j)sym=wsym[k];
elsesym=ident;
/*搜索失败,则是名字或数字*/
else
if(ch>
/
k=0;
num=0;
sym=number;
do{
ID[k]=ch;
num=num*10+ch-'
getchdo;
}while(ch>
if(flg==1){
num=-num;
flg=0;
ID[k]=0;
k--;
if(k>
nmax)
//error(30);
;
%
else
if(ch=='
if(ch=='
{
sym=becomes;
strcpy(ID,"
="
getchdo;
}
else
sym=nul;
NULL"
else
*
if(ch=='
{
sym=geq;
strcpy(ID,"
getchdo;
}
else
sym=gtr;
}
else
if(ch=='
{
sym=leq;
strcpy(ID,"
getchdo;
}
else
sym=lss;
sym=ssym[ch];
strcpy(ID,&
ch);
//if(sym!
=period)
}
return1;
//语法分析部分实验2
in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 词法 语法分析 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)