- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                第二次 语法分析实验报告
                    编译原理实验报告
  
实验名称:     编写语法分析程序       
实验类型:        设计型试验          
指导教师:                  
专业班级:                  
姓    名:                  
学    号:              
实验地点:                 
实验成绩:____________________________
    
             
 
            日期:2014年  6月 8日
    
实验二 编写语法分析程序
一、实验目的
通过设计、编、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握语法分析方法。
(一)设计原理
递归下降分析程序的实现思想是:(1) 分析程序由一组子程序组成,每个子程序对应于一个非终结符号。(2) 每一个子程序的功能:选择正确的产生式右部,扫描相应的字符;产生式右部有非终结符号时,调用该非终结符号对应的子程序来完成。
自顶向下分析过程中,如果带回溯,则分析过程穷举所有可能的推导,看是否能推导出待检查的符号串,分析速度慢。而无回溯的自顶向下分析技术,选择某非终结符的产生式时,可根据输入串的当前符号以及各产生式右部FIRST集合完成选择,效率高,且不易出错。
无回溯的自顶向下分析要求文法是LL(1)文法。
满足LL(1)文法的条件:
   (1)文法不含左递归;
        (2)文法的任何一个非终结符A的各个产生式的右部符号串的FIRST集两两不相交,即:
           若有A→α1|α2|…|αn  ,则  
		   FIRST (ai)∩ FIRST (aj) = φ   (i ≠ j,1≤i,j≤n)
   (3)文法的任何一个非终结符A,
  若有A→α1|α2|…|αn且存在ai ,有 ε∈FIRST (αi),则
            FIRST (αj)∩ FOLLOW (A) = φ ( i ≠ j, j=1,2,. . .,n )
将产生式变成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代码测试编写的递归下降分析程序(先使用实验一的词法分析程序进行词法分析)报告词法错误及其位置。
{
int a;
int i;
int b,c;
for (i=1; i = 10; i=i+1)
{
;
a=a+i
b=b*i;
{
c=a+b;
}
}
if (ab) 
{
write a;
}
else 
{
write b;
}
}
write c
}
 
  
三、实验过程
 (1) 改造文法,使之满足无回溯的递归下降分析条件
1、改写后的文法如下:
1 program→{declaration_liststatement_list}
2 declar
                
原创力文档
                        

文档评论(0)