第二次 语法分析实验报告Word格式.docx
- 文档编号:19624781
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:15
- 大小:56.40KB
第二次 语法分析实验报告Word格式.docx
《第二次 语法分析实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《第二次 语法分析实验报告Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
将产生式变成LL
(1)文法的方法:
1、消除直接左递归(将左递归改为右递归):
直接左递归形式:
U→Ux|y;
其中:
x,y∈(VN∪VT)*,y不以U打头。
直接左递归的消除:
U→yU’
U’→xU’|ε
直接左递归的一般形式:
U→Ux1|Ux2|…|Uxm|y1|y2|…|yn;
xi≠ε,yi都不以U打头。
一般形式直接左递归的消除:
U→y1U’|y2U’|…|ynU’
U’→x1U’|x2U’|…|xmU’|ε
2、消除间接左递归:
要求无环路(形如A⇒+A的推导)和无ε-产生式。
(1)把非终结符按某一顺序排序为A1,A2…An。
(2)for(i=1;
i<
=n;
i++)
{
for(j=1;
j<
=i-l;
j++)
if(Aj→δ1|δ2|…|δk,Ai→Ajγ)
把Ai→Ajγ改写成
Ai→δ1γ|δ2γ|…|δkγ;
}
消除关于Ai产生式的直接左递归;
}
(3)化简由
(2)所得到的文法。
(4)化简改写之后的文法,删除多余产生式。
3、提取左公因子
A→1|2……|n|γ1……|γm
改写成:
A→A’|γ1……|γm
A’→1|2……|n
(二)设计方法:
通过将文法变成LL
(1)文法,求出每个产生式右部的FIRST集,如果右部有ε,则求其FOLLOw集,根据产生式及FIRST集、FOLLOW集画出流程图,写出相应程序。
(三)设计过程:
1)改写文法,消除二义性;
2)消除左递归、提取左因子;
3)求FIRST集、FOLLOW集;
4)检查是不是LL
(1)文法,若不是LL
(1),说明文法的复杂性超过自顶向下方法的分析能力;
5)直接根据产生式设计相应的程序;
6)对下面的TEST代码测试编写的递归下降分析程序(先使用实验一的词法分析程序进行词法分析)报告词法错误及其位置。
{
inta;
inti;
intb,c;
for(i=1;
i<
=10;
i=i+1)
;
a=a+i
b=b*i;
c=a+b;
}
if(a>
b)
writea;
else
writeb;
writec
三、实验过程
(1)改造文法,使之满足无回溯的递归下降分析条件
1、改写后的文法如下:
1>
<
program>
→{<
declaration_list>
<
statement_list>
2>
→<
declaration_stat>
|ε
3>
→intID;
4>
statement>
5>
→<
if_stat>
|<
while_stat>
for_stat>
read_stat>
|<
write_stat>
command_stat>
|<
expression_stat>
6>
→if(<
expr>
)<
statement>
'
=else<
statement>
|ε
7>
→while(<
expr>
8>
→(<
)<
9>
→write<
expression>
10>
→readID;
11>
compound_stat>
12>
expression>
|;
13>
→ID=<
bool_expr>
14>
additive_expr>
=(>
|>
=|<
=|==|!
=)<
additive_expr>
)|ε
15>
term>
→(+<
|-<
|ε
16>
factor>
→(*<
|/<
17>
)|ID|NUM
2、由改写后的文法求出的FIRST集、FOLLOW集如下:
FIRST({<
})={int}
FIRST(<
)={int}
FOLLOW(<
)={if,while,(,read,write,ID,NUM,;
FIRST<
intID>
={int}
)={if,while,(,read,write,ID,NUM,;
)={#}
)={if};
)={while};
)={(};
)={read};
)={write};
};
)={ID,NUM,;
(}
FIRST(if(<
(else<
|ε))={if}
FIRST(while(<
)={while}
FIRST((<
)={(}
FIRST(write<
)={write}
FIRST(readID)={read}
FIRST({<
})={if,while,(,read,write,ID,NUM,;
FIRST(<
)={ID,NUM,(}
FIRST(;
)={;
FIRST(ID=<
)={ID}
)={(,ID,NUM}
((>
|ε))={(,ID,NUM}
FIRST((+<
)={+,-}
)={<
>
=,<
=,==,!
=}
FIRST((*<
)={*,/}
=,+,-}
))={(}
FIRST(ID)={ID}
FIRST(NUM)={NUM}
(2)根据改写的文法和first,follow集编写递归下降分析程序;
实验中遇到问题:
1:
错误虽然能找出来但是所在行数却不准确。
解决方案:
因为找到错误后会读取下一行,此时行数就比错误所在行多了1,在现有基础上-1就能得到正确行数。
2.程序在最后倒数第四行就结束,分析成功。
不能把后面多余的3行当成错误显示出来。
在开始设置一个条件,必须读到文件最后才结束。
3:
语法分析程序在分析一行中单独的“;
”时,不能识别;
在statement()函数里加入“;
”判断,如果符合让程序进入expression()函数里;
四、实验结果
测试数据:
词法分析后文件:
找到第一个错误:
改正后查找第二个错误:
继续改正后继续查找错误:
查找错误完成。
四、讨论与分析
对于语法分析,理解递归下降分析程序的实现思想,最重要的是知道怎么使TEST语言语法规满足无回溯的递归下降分析条件。
掌握将文法转化成LL
(1)文法的条件,将其转化成LL
(1)文法的方法,能够有效的化简,并求出FIRST集以及当存在空时的FOLLOW集,画出相应的流程图,根据流程图并写出程序。
在这次的实验中,让我更加明白了LL
(1)文法的所要满足的条件以及如何求FIRST集和FOLLOW集的方法。
5、附录:
关键代码(给出适当注释,可读性高)
intdeclaration_list()
intes=0;
if(strcmp(token,"
int"
)==0)
es=declaration_stat();
if(es>
0)return(es);
es=declaration_list();
elseif(strcmp(token,"
if"
)==0||strcmp(token,"
for"
)==0||
strcmp(token,"
write"
read"
while"
{"
ID"
"
}"
else"
("
NUM"
))
return0;
return(es);
intstatement_list()
if(strcmp(token,"
{
es=statement();
es=statement_list();
if(strcmp(token,"
intstatement()
if(es==0&
&
strcmp(token,"
)==0)
es=if_stat();
//<
IF语句>
es=while_stat();
while语句>
es=for_stat();
for语句>
es=read_stat();
read语句>
es=write_stat();
write语句>
es=compound_stat();
复合语句>
(strcmp(token,"
)==0)||strcmp(token,"
es=expression_stat();
表达式语句>
intexpression_stat()
fscanf(fp,"
%s%s%s\n"
token,token1,r);
printf("
return(es);
es=expression();
if(es>
}else
es=4;
//少分号
intexpression()
intes=0,fileadd;
chartoken2[20],token3[40];
fileadd=ftell(fp);
//记住当前文件位置
&
token2,&
token3,r);
if(strcmp(token2,"
="
)==0)//'
='
{
fscanf(fp,"
es=bool_expr();
}
else
fseek(fp,fileadd,0);
//若非'
则文件指针回到'
前的标识符
if(es>
else
es=bool_expr();
intbool_expr()
es=additive_expr();
if(es>
>
)==0||strcmp(token,"
)==0
||strcmp(token,"
=="
!
printf("
es=additive_expr();
if(es>
)"
return;
intadditive_expr()
es=term();
while(strcmp(token,"
+"
-"
es=term();
intterm()
es=factor();
*"
/"
fscanf(fp,"
es=factor();
6、实验者自评
通关这次的实验,强化了我对FIRST集和FOLLOW集的求法,我对语法分析的过程有了进一步的了解与认知,我知道了递归下降分析程序的实现思想,以及递归下降分析程序应满足的条件,而且掌握了LL
(1)文法所满足的条件和方法,但是在实验中也遇到了很多问题,不过经过各种查找也解决了问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二次 语法分析实验报告 语法分析 实验 报告