文档库 最新最全的文档下载
当前位置:文档库 › 递归下降分析程序设计及语法分析中的错误处理

递归下降分析程序设计及语法分析中的错误处理

递归下降分析程序设计及语法分析中的错误处理
递归下降分析程序设计及语法分析中的错误处理

#include

char a[80];

char sym;

int i=0;

void E();

void E2();

void T();

void T2();

void F();

void input();

void advance();

void E()

{

T();

E2();

}

void E2()

{

if(sym=='+'||sym=='-')

{

advance();

T();

E2();

}

else if (sym != ')' && sym != '#')

{

printf("error!");

exit(0);

}

}

void T()

{

F();

T2();

}

void T2()

{

if(sym=='*'||sym=='/')

{

advance();

F();

T2();

}

else if(sym!='+'&&sym!=')'&&sym!='#')

{

printf("error!");

exit(0);

}

}

void F()

{

if(sym=='(')

{

advance();

E();

if(sym==')')

advance();

else

{

printf("error!");

exit(0);

}

}

else if(sym>='0'||sym<='9')

{

advance();

}

else

{

printf("error!");

exit(0);

}

}

void input()

{

printf("请输入需识别的句子以#结束:");

scanf("%s",&a);

}

void advance()

{

sym=a[i];

i++;

}

void main()

{

system("graftable 936");

clrscr();

while(1)

{

input();

advance();

E(); /* 从首个推导式E开始*/ if (sym=='#')

printf("success\n");

else

printf("fail\n");

i=0; /* 重新输入时,下标置0 */ }

getch();

}

现代汉语 常见的语法错误

第十节常见的语法错误 我们在写作中出现的语法错误是各种各样的。有些语病,如“词类误用”、“复句组织中的毛病”、“虚词使用不当”等,我们已经在有关章节(分别在第二节、第八节、第九节)里谈得比较集中,比较充分,在这一节里就不再谈了。有些语病,如“搭配不当”、“残缺”、“词语位置不当”等,虽也已分别在前面几节里谈到过,但考虑到一般在写作中犯这些方面的毛病比较多,前面又是分散着谈的,这里有集中谈一下的必要,所以这里将不避重复,再作进一步的说明。此外,在这一节里我们还想谈谈在指代和数量表达方面的问题,因为这方面的毛病也比较常见。 一句法成分搭配不当 所谓句法成分搭配不当,是指句子中密切相关的句法成分,如主语和谓语、述语和宾语、定语和中心语、状语和中心语等,在组织句子时,由于没有注意照顾它们之间的配合,结果造成了搭配不当的毛病。 (一)主语和谓语搭配不当 主谓搭配不当是常见的毛病。请看下面的例子: (1)*修建高速公路是很必要的,但是应该看到,我们国家的经济基础还比较低,还不能一下子省与省之间都通高速公路。(报) (2)*生活告诉人们:急躁的人,事情一旦办不成,往往容易转化为灰心丧气。(刊)例(1)“经济基础”不能与“低”搭配。如果要保留“经济基础”,可以将“低”改为“薄弱”;如果要保留“低”,可以将“经济基础”改为“经济发展水平”。例(2)“人……转化为……灰心丧气”显然不通。“转化为”三个字完全是多余的,应删去。 有些主语与谓语搭配不当的毛病比较隐晦,需要作些分析才能发现。例如:(3)*你刚18岁,正值青春茂盛之时。(刊) (4)*这篇通讯的作者有很好的理论修养,所以立意很深。(书) 例(3)“你……正值……之时”没有错,但“之时”前一加上“青春茂盛”这个定语就使主语“你”与谓语“正值青春茂盛之时”就不搭配了。人怎么能像植物那样“茂盛”呢?把“茂盛”删去,句子当然通了,但念着还是别扭。比较好的改法是,将“青春茂盛之时”改为“青春年华”。例(4)是个因果复句,单就每个分句看,似没有语法错误;但读者读到后一个分句“立意很深”,总觉着别扭。“立意很深”是陈述那个成分的呀?从句子结构上看,“立意很深”该是说明“作者”的,因为后一个分句是承前省略了主语,那省略的主语该是“通讯的作者”;但从意思上说,“立意很深”该是用来陈述“这篇通讯”,因为“立意很深”只能用来形容作品内容,不能用来说明人。所以这个句子的毛病也属于主谓搭配不当的语法错误。 下面的例子是主谓搭配不当的另一种情况: (5)*理论正确是衡量文章好坏的重要标准。 (6)*汽车本身质量的好坏,也是保证行车安全的一个很重要的条件。 例(5)主语“内容正确”是从一个方面说的,而谓语“是衡量文章好坏的重要标准”则是从两方面说的,不搭配。宜将主语改成“内容是否正确”或“内容正确与否”。例(6)刚好相反,主语是从两个方面说的,而谓语是从一个方面说的,也不搭配。宜将谓语改成“也是能否保证行车安全的一个很重要的条件”。 当主语或谓语是联合词组时,更要注意主谓的配合。下面的句子都有问题: (7)*一年不见,她的身体,她的业务水平和思想水平都比先前提高了许多。(刊)(8)*由于该县领导严重忽视安全生产,以致劳动者生命和财产遭受巨大损失的事

递归下降语法分析程序设计

编译方法实验报告实验名称:简单的语法分析程序设计

实验要求 1.功能:对简单的赋值语句进行语法分析 随机输入赋值语句,输出所输入的赋值语句与相应的四元式 2.采用递归下降分析程序完成(自上而下的分析) 3.确定各个子程序的功能并画出流程图 4.文法如下:

5.编码、调试通过 采用标准输入输出方式。输入输出的样例如下: 【样例输入】 x:=a+b*c/d-(e+f) 【样例输出】(说明,语句和四元式之间用5个空格隔开) T1:=b*c (*,b,c,T1) T2:=T1/d (/,T1,d,T2) T3:=a+T2 (+,a,T2,T3) T4:=e+f (+,e,f,T4) T5:=T3-T4 (-,T3,T4,T5) x:=T5 (:=,T5,-,x) 【样例说明】程序除能够正确输出四元式外,当输入的表达式错误时,还应能检测出语法错误,给出相应错误提示。 6.设计3-5个赋值语句测试实例,检验程序能否输出正确的四元式;当输入错误 的句子时,检验程序能够给出语法错误的相应提示信息。 7.报告内容包括: 递归程序的调用过程,各子程序的流程图和总控流程图,详细设计,3-5个测试用例的程序运行截图及相关说明,有详细注释的程序代码清单等。

目录 1.语法分析递归下降分析算法............................... 错误!未定义书签。 背景知识............................................. 错误!未定义书签。 消除左递归........................................... 错误!未定义书签。 2.详细设计及流程图....................................... 错误!未定义书签。 函数void V( ) .|z ................................. 错误!未定义书签。 函数void A( ) 错误!未指定书签。错误!未指定书签。错误!未指定书签。错误!未指定书签。错误!未指定书签。试用例及截图........................ 错误!未定义书签。 测试用例1及截图..................................... 错误!未定义书签。 测试用例2及截图..................................... 错误!未定义书签。 测试用例3及截图..................................... 错误!未定义书签。 代码清单................................................. 错误!未定义书签。

递归下降分析法

《编译原理》课程实验报告 实验名称:递归下降分析法 一.实验目的 1.理解递归下降语法分析方法的主要原理 2.理解递归下降分析法对文法的要求 3.熟练掌握Predict集合的求法 4.熟练掌握文法变换算法(消除左递归和消除公共前缀) 二.实验内容 #include char token[20]; char sym; int p; void S(); void T(); void U(); void Scanner(); void Error(); void S() { if (sym == 'a' || sym == '^') Scanner(); else if (sym == '(') { Scanner(); T(); if (sym == ')') Scanner(); else Error(); } else Error();

} void T() { S(); U(); } void U() { if (sym == ',') { Scanner(); S(); U(); } else if(sym != ')') Error(); } void Scanner() { sym = token[p++]; } void Error() { //exit(0); } int main() { printf("输入: "); gets(token); p = 0; Scanner(); S(); if (sym == '$') printf("Success!"); else printf("Fail!"); return 0; } 三.实验步骤 调试程序的结果:

编译原理-编写递归下降语法分析器

学号107 成绩 编译原理上机报告 名称:编写递归下降语法分析器 学院:信息与控制工程学院 专业:计算机科学与技术 班级:计算机1401班 姓名:叶达成 2016年10月31日

一、上机目的 通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、基本原理和上机步骤 递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。 递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。 每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。 自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。 无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。 无回溯:对于任一非终结符号U的产生式右部x1|x2|…|x n,其对应的字的首终结符号两两不相交。 如果一个文法不含回路(形如P?+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。 三、上机结果 测试数据: (1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (2)输出结果:i+i*i#为合法符号串 (3)输入一符号串如i+i*#,要求输出为“非法的符号串”。 程序清单: #include #include char str[50]; int index=0; void E(); //E->TX; void X(); //X->+TX | e void T(); //T->FY void Y(); //Y->*FY | e void F(); //F->(E) | i int main() /*递归分析*/ { int len; int m;

递归下降分析法

编译原理课程实验报告 班级学号:姓名: 实验名称:递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验要求: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (3)输出结果:i+i*i#为合法符号串 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。 注意: 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 三、实验过程: 程序设计: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 程序编写: 1.定义部分:定义常量、变量、数据结构。 2.初始化:从文件将输入符号串输入到字符缓冲区中。 3.利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 四、实验结果

(1)程序流程图 主函数main( )流程图 E( )过程流程图 T( )过程流程图

G( )过程流程图 F( )过程流程图

实验三-递归下降法的语法分析器

魏陈强 204168 实验3 递归下降法的语法分析器 一、实验目的 学习用递归下降法构造语法分析器的原理,掌握递归下降法的编程方法。 二、实验内容 用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。 这里只要求实现部分产生式,文法的开始符号为program。(完整的源语言的文法定义见教材附录,p394) program→ block block→{stmts } stmts→stmt stmts | 。 stmt→id=expr; | if(bool)stmt | if( bool)stmt else stmt | while(bool)stmt | do stmt while(bool ) ; | break ; | block bool →expr < expr | expr <= expr | expr > expr | expr >= expr & | expr expr→ expr + term

| expr - term | term term→ term * factor | term / factor | factor factor→ ( e xpr ) | id| num 三、实验要求 1.个人完成,提交实验报告。 ( 2.实验报告中给出采用测试源代码片断,及其对应的最左推导过程(形式可以自行考虑)。 测试程序片断: { i = 2; while (i <=100) { sum = sum + i; i = i + 2; } } 对应的推导过程为: # program block {stmts } {stmt stmts} {id=expr;stmts } {id=num;stmts } {id=num;stmt stmts } {id=num;while(bool)stmt stmts } {id=num;while(e xpr<= expr)stmt stmts } {id=num;while(id<= expr)stmt stmts } {id=num;while(id<= num)stmt stmts } {id=num;while(id<= num)block stmts } , {id=num;while(id<= num){stmts }stmts } .......

编译原理-实验报告2-递归下降分析法

计算机硬件实验室实验报告 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验要求: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (3)输出结果:i+i*i#为合法符号串 备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。 注意: 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 三、实验过程:

程序设计: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 程序编写: 1.定义部分:定义常量、变量、数据结构。 2.初始化:从文件将输入符号串输入到字符缓冲区中。 3.利用递归下降分析法,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 四、实验结果 (1)程序流程图 (2)运行结果 示例程序: #include <> #include<> #include<> #include<> char a[50] ,b[50],d[500],e[10]; char ch; int n1,i1=0,flag=1,n=5; int E(); int E1(); int T(); int G();

报刊语法错误分析

重要报刊中出现的语法错误 一、主语残缺 1、当他第三次试跳时越过这个高度,动作干脆,腾跃时重心离横竿较高。(《解放日报》2011年3月17日第3版) 第一个分句的主语应该是“他”,但由于被置于介词结构“当……时”中,便造成了主语残缺。 2、《三只狼》写一个农人在路上遇见了三只狼,开始想给狼扔几块肉,甩掉它们。但后来知道狼贪得无厌,终于下决心想办法把狼打死了。(《文汇报》2008年6月2日第4版) “开始想给狼扔几块肉,甩掉它们。”,一句缺主语“他”。 二、宾语残缺 1、《三只狼》写一个农人在路上遇见了三只狼,开始想给狼扔几块肉,甩掉它们。但后来知道狼贪得无厌,终于下决心想办法把狼打死了。(《文汇报》2008年6月2日第4版) “《三只狼》写一个农人在路上遇见了三只狼”缺少宾语“的故事”。 2、菊花牌38支〔TK〕精梳本色棉毛衫具有手感柔软,弹性好,布面清晰,缝制考究,坚牢耐穿。(《解放日报》2000年2月10日第2版) 全句缺少宾语“等特点”。 三、搭配不当 1、山东聊城杨以增海源阁,为近代著名藏书家。(《人民日报》2011年8月30日第8版) 主语为“……海源阁”,宾语中心语是“藏书家”,主宾不搭配。 2、标题“四川、福建、北京、天津女排四强出线在望天津队夺魁希望最浓”。(《新民日报》2011年9月26日第4版) “希望”和“浓”不搭配。 四、词序不当 1、一家农民开办的大旅店在杭州市郊开业(标题)。(《光明日报》1981年3月5日第1版) 结合正文可知大旅店是公社办的,标题应改为“一家农民开办的大旅店在杭州市郊开业”。 2、蔡文治为什么说这气话呢?原来南京解放前的前半个月,也就是和谈刚刚破裂,黄绍肱从北京飞到香港去后,顾祝同主持召开了一次作战会议。(《解放日报》1984年第12期52页) “南京解放的前半个月”一般会理解为在南京解放以后的半个月,可后面明明讲到“和谈刚刚破裂”,可知说的是南京解放以前。应该把“的”与“前”的位置换一下。 五、重复累赘 1、但是,首要的也是最重要的原因就是职务犯罪主体身份的特殊性。(《人民日报》2011年7月28日第1版《贪官不入监缘何增多》) 其中“首要”、“最重要”含义重复。 2、他经历惊涛骇浪,不仅亲眼目睹了沿途岛屿的奇风异俗,也发现了船上一连串的惊天阴谋。(《光明日报》2010年7月26日第2版《瑞典王后从哥德堡

编译原理中处理语法错误问题的研究

编译原理中处理语法错误问题的研究 摘要:本文分析了编译系统以及其错误处理能力对于程序设计语言的重要性,对其中处理语法错误问题进行了深入研究,并从语法错误的诊察与报告,到利用递归下降分析法对错误进行恢复和纠正处理,直至最后的限制重复报告错误信息及其中涉及的关键技术进行了介绍,从而帮助学习者和开发者牢固掌握相关的理论和技术。 关键词:编译系统;语法错误处理;递归下降分析法 1 前言 在计算机应用领域,目前多数用户都是通过高级语言实现所需要的计算。而对于任何高级语言来说,其编译系统内容丰富,具有严密的逻辑性,对提高学习者和开发者的计算机软件素质具有很大作用,使其不但能认识计算机信息处理的实质,还可以综合运用所学的软件设计技术来分析解决问题[1]。因此,编译系统是计算机系统软件最重要的组成部分之一,也是用户最直接关心的工具之一,它不但要接受程序语言的所有标准定义,以便源代码实现跨平台的可移植性,还必须生成高效、正确的目标代码。因此编译系统本身是一个大而复杂的程序,值得我们深入分析研究。 我们知道,在编译原理的学习和编译系统的构建过程中,语法分析是其中最为重要的一个组成部分。而在实际的编译系统中,语法分析器的错误处理能力与其构造原理和技术一样重要,这通常是编译原理教学环节中容易忽视的地方,不利于学习者进行实际的编译系统的开发工作。因此,本文对C++编译系统中递归下降的语法分析过程进行了研究,找到了发现并纠正语法错误问题的有效方法。 2 语法错误 编程人员在编写程序时,很难一次就将程序写的完美无误,尤其是一些比较复杂的程序,往往会存在程序错误。程序错误的种类有很多,比如违反语言的语法和语义规定的错误,源程序超出了计算机系统的某种限制而引发的错误,等等。其中语法错误是指源程序中含有不符合语法规则的成分时所产生的错误,一般是有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。

实验三_递归下降法的语法分析器

魏陈强 23020092204168 实验3 递归下降法的语法分析器 一、实验目的 学习用递归下降法构造语法分析器的原理,掌握递归下降法的编程方法。 二、实验内容 用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。 这里只要求实现部分产生式,文法的开始符号为program。(完整的源语言的文法定义见教材附录 A.1,p394) program→ block block→{stmts } stmts→stmt stmts | stmt→id=expr; | if(bool)stmt | if( bool)stmt else stmt | while(bool)stmt | do stmt while(bool ) ; | break ; | block bool →expr < expr | expr <= expr | expr > expr | expr >= expr | expr expr→ expr + term | expr - term | term

term→ term * factor | term / factor | factor factor→ ( e xpr ) | id| num 三、实验要求 1.个人完成,提交实验报告。 2.实验报告中给出采用测试源代码片断,及其对应的最左推导过程(形式可以自行考虑)。 测试程序片断: { i = 2; while (i <=100) { sum = sum + i; i = i + 2; } } 对应的推导过程为: program?block ?{stmts } ?{stmt stmts} ?{id=expr;stmts } ?{id=num;stmts } ?{id=num;stmt stmts } ?{id=num;while(bool)stmt stmts } ?{id=num;while(e xpr<= expr)stmt stmts } ?{id=num;while(id<= expr)stmt stmts } ?{id=num;while(id<= num)stmt stmts } ?{id=num;while(id<= num)block stmts } ?{id=num;while(id<= num){stmts }stmts } ?....... 四、实验思路 之前编写的词法分析器,能够将语句中的每一个词素都识别出来,因此,在此基础上,定义一个二维字符串数组finaltable[100][20],用于存放由词法分析器提取出来的每个词素,比如,i=2,则finaltable[0]=”id”,

递归下降分析算术表达式

递归下降分析算术表达式 计算机092—07 邹芬芬 ●实验目的: (1)掌握自上而下语法分析的要求与特点。 (2)掌握递归下降语法分析的基本原理和方法。 (3)掌握相应数据结构的设计方法。 ●实验内容: 编程实现给定算术表达式的递归下降分析器。 算术表达式文法如下:E→E+T | T T→T*F | F F→(E) | i ●设计分析 题目所给的文法不为LL(1)文法,应改写成如下文法: E →TE2 E2→+TE2 |∑ T →FT2 T2→*FT2 | ∑ F →(E) | i 采用递归下降分析法时,需要求出E2和T2 的FOLLOW集: FOLLOW(E2)={),#} FOLLOW(T2)={+,),#} 递归下降分析法是确定的自上而下分析法,基本思想是,对文法中的每个非终结符编写一个函数,每个函数的功能是识别由该非终结符所表示的语法成分。因此需要分别构造E,E2,T,T2,F函数来执行自己的识别功能,根据文法的内容顺序决定函数的识别功能。advance函数用于字符串的推进,input函数用于字符串的输入。 ●程序代码 #include using namespace std; char a[80]; // 字符串的存入 char sym; // 单个的判断字符 int i=0; // 字符串下标 void E(); // 功能识别函数 void E2(); // 功能识别函数 void T(); // 功能识别函数 void T2(); // 功能识别函数 void F(); // 功能识别函数 void input(); // 输入函数

递归下降语法分析程序设计

编译方法实验报告 令狐采学 实验名称:简单的语法分析程序设计 实验要求 1.功能:对简单的赋值语句进行语法分析 随机输入赋值语句,输出所输入的赋值语句与相应的四元式 2.采用递归下降分析程序完成(自上而下的分析) 3.确定各个子程序的功能并画出流程图 4.文法如下: 5.编码、调试通过 采用标准输入输出方式。输入输出的样例如下: 【样例输入】 x:=a+b*c/d(e+f) 【样例输出】(说明,语句和四元式之间用5个空格隔开)

T1:=b*c (*,b,c,T1) T2:=T1/d (/,T1,d,T2) T3:=a+T2 (+,a,T2,T3) T4:=e+f (+,e,f,T4) T5:=T3T4 (,T3,T4,T5) x:=T5 (:=,T5,,x) 【样例说明】程序除能够正确输出四元式外,当输入的表达式错误时,还应能检测出语法错误,给出相应错误提示。 6.设计35个赋值语句测试实例,检验程序能否输出正确的四 元式;当输入错误的句子时,检验程序能够给出语法错误的相应提示信息。 7.报告内容包括: 递归程序的调用过程,各子程序的流程图和总控流程图,详细设计,35个测试用例的程序运行截图及相关说明,有详细注释的程序代码清单等。

目录 1.语法分析递归下降分析算法5 1.1背景知识5 1.2消除左递归6 2.详细设计及流程图6 2.1 函数void V( ) // V > a|b|c|d|e...|z6 2.2 函数void A( ) // A > V:=E7 2.3 函数void E() //E > TE'7 2.4函数void T( ) // T > FT'8 2.5函数void E1( ) //E'> +TE'|TE'|null8 2.6函数void T1() // T'> *FT'|/FT'|null9 3.测试用例及截图9 3.1测试用例1及截图9 3.2测试用例2及截图10 3.3测试用例3及截图11 代码清单11

递归下降分析器设计与实现

实验二递归下降分析器设计与实现 1、实验目的: (1)掌握自上而下语法分析的要求与特点。 (2)掌握递归下降语法分析的基本原理和方法。 (3)掌握相应数据结构的设计方法。 2、实验内容: 编程实现给定算术表达式的递归下降分析器。 算术表达式文法如下: E-->E+T|T T-->T*F|F F-->(E)|i 3、设计说明: 首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。4、设计分析 这个题目属于比较典型的递归下降语法分析。需要先将原算术表达式方法改写为LL(1)文法为: E-->TE' E'-->+TE'|ε T-->FT' T'-->*FT'|ε F-->(E)|i 然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。具体方法为: (1)当遇到终结符a时,则编写语句 If(当前读到的输入符号==a)读入下一个输入符号 (2)当遇到非终结符A时,则编写语句调用A()。 (3)当遇到A-->ε规则时,则编写语句 If(当前读到的输入符号不属于Follow(A))error() (4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导. 5、程序代码 #include void E(); void T(); void E1(); void T1(); void F();

char s[100]; int i, SIGN; int main() { printf("请输入一个语句,以#号结束语句(直接输入#号推出)\n"); while( 1 ) { SIGN = 0; i=0; scanf("%s",&s); if( s[0] == '#') return 0; E(); if(s[i]=='#') printf("正确语句!\n"); printf("请输入一个语句,以#号结束语句\n"); } return 1; } void E() { if(SIGN==0) { T(); E1(); } } void E1() { if(SIGN==0) {

编译原理课程设计---LL(1)递归下降分析器

编译原理课程设计课程设计题目:LL(1)递归下降分析器 姓名: 院(系): 专业班级: 学号: 指导教师: 设计日期:

目录 1、需求分析 (1) 2、概要设计 (2) 3、详细设计 (3) 4、测试分析 (8) 5、用户手册 (9) 6、课程总结 (9) 7、参考文献 (10)

题目:LL (1)递归下降分析器 1、需求分析 语法分析是编译过程的核心部分。语法分析器的任务是识别和处理比单词更大的语法单位。如:程序设计语言中的表达式,各种说明和语句乃至全部源程序,指出其中的语法错误;必要时,可生成内部形式,便于下一阶段处理。 我们知道,语言的语法结构是用上下文无关文法描述的。按照语法分析树的建立方法,我们可以粗略地把语法分析办法分成两类,一类是自上而下分析,另一类是自下而上分析法。而自上而下这种方法是带“回溯”的,且存在许多困难和缺点。 首先,是文法的左递归性问题。一个文法是含有左递归的,如果存在非终结符P 且αP P + ?,含有左递归的文法使上述的自上而下的分析过程陷入无限循环。即,当试图用P 去匹配输入串时,我们会发现,在没有识别任何输入符号的情况下,有得重新要求P 去进行新的匹配。因此,使用自上而下分析法必须消除文法的左递归性。 其次,由于回溯,就碰到一大堆麻烦问题。如果我们走了一大段错路,最后必须回头,那么,就应把已经做的一大堆语义工作(指中间代码产生工作和各种表格的簿记工作)推倒重来。这些事情既麻烦又费时间,所以,最好应设法消除回溯。 第三,在自上而下分析过程中,当一个非终结符用某一候选匹配成功时,这种成功可能仅是暂时的。 第四,当最终报告分析不成功时,我们难于知道输入串中出错的确切位置。 最后,由于带回溯的自上而下分析实际上采用了一种穷尽一切可能的试探法,因此,效率很低,代价极高。严重的低效使得这种分析法只有理论意义,而在实践上价值不大。 由于上述原因,我们需要把原算术表达式改写为LL(1)文法,LL(1)文法的文法条件如下: 文法不含左递归。 对于文法中每一个非终结符A 的各个产生式的候选首集符两两不相交。即,若n A ααα|||21 →,则()()φαα=?j i FIRST FIRST ()j i ≠ 对文法中的每个非终结符A ,若它存在某个候选首符集包含ε,则()()φ=?A F O L L O W A F I R S T LL(1)中的第一个L 表示从左到右扫描输入串,第二个L 表示最左推导,1表示分析时每

递归下降语法分析设计原理与实现技术实验报告

递归下降语法分析设计原理与实现技术 实验报告 变更说明 日期版本变更位置变更说明作者2014/4/16 1、0 初稿生成房皓

一、实验目的: 本实验的目的在于在教师的引导下以问题回朔与思维启发的方式,使学生在不断的探究过程中掌握编译程序设计与构造的基本原理与实现技术,启迪学生的抽象思维、激发学生的学习兴趣、培养学生的探究精神与专业素养,从而提高学生发现问题、分析问题与解决问题的能力。 二、实验内容: [实验项目] 完成以下描述算术表达式的LL(1)文法的递归下降分析程序 G[E]: E→TE′ E′→ATE′|ε T→FT′ T′→MFT′|ε F→ (E)|i A→+|- M→*|/ [设计说明] 终结符号i 为用户定义的简单变量,即标识符的定义。 [设计要求] (1)输入串应就是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果,输出为输入串就是否为该文法定义的算术表达式的判断结果; (2)递归下降分析程序应能发现输入串出错; (3)设计两个测试用例(尽可能完备,正确与出错),并给出测试结果。 三、实验环境: 操作系统:Windows 7 软件: VC++6、0 四、程序功能描述: ●提供了两种输入方式:键盘与文件,有文件输入时需为二元式序列; ●能够对输入的字符串做出正确的递归下降分析判断,并给出判断结果; ●能发现输入串中的错误,包含非法字符,输入不匹配等; ●能够处理一些可预见性的错误,如文件不存在,用户输入非法等。

五、数据结构设计: 全局: 局部(main()中): 六、程序结构描述: ●设计方法: 本程序采用从键盘输入或文件读取两种输入方式,其中文件的内容需为二元式序列,然后按照递归下降分析的方法对输入的字符串进行分析判断,并输出判断结果,程序通过对输入串的检查能够发现输入串中的错误。程序规定的单词符号及其种别码见下表: 单词符号种别码单词符号种别码 ( 1 * 5 ) 2 / 6 + 3 i 7 - 4 # 8 ● advance():将下一个字符送入current;

常见的汉语语法错误

常见的汉语语法错误 一句法成分搭配不当 所谓句法成分搭配不当,是指句子中密切相关的句法成分,如主语和谓语、述语和宾语、定语和中心语、状语和中心语等,在组织句子时,由于没有注意照顾它们之间的配合,结果造成了搭配不当的毛病。 (一)主语和谓语搭配不当 主谓搭配不当是常见的毛病。请看下面的例子: (1)*修建高速公路是很必要的,但是应该看到,我们国家的经济基础还比较低,还不能一下子省与省之间都通高速公路。 (2)*生活告诉人们:急躁的人,事情一旦办不成,往往容易转化为灰心丧气。 例(1)“经济基础”不能与“低”搭配。如果要保留“经济基础”,可以将“低”改为“薄弱”;如果要保留“低”,可以将“经济基础”改为“经济发展水平”。例(2)“人……转化为……灰心丧气”显然不通。“转化为”三个字完全是多余的,应删去。

有些主语与谓语搭配不当的毛病比较隐晦,需要作些分析才能发现。例如: (3)*你刚18岁,正值青春茂盛之时。 (4)*这篇通讯的作者有很好的理论修养,所以立意很深。 例(3)“你……正值……之时”没有错,但“之时”前一加上“青春茂盛”这个定语就使主语“你”与谓语“正值青春茂盛之时”就不搭配了。人怎么能像植物那样“茂盛”呢?把“茂盛”删去,句子当然通了,但念着还是别扭。比较好的改法是,将“青春茂盛之时”改为“青春年华”。例(4)是个因果复句,单就每个分句看,似没有语法错误;但读者读到后一个分句“立意很深”,总觉着别扭。“立意很深”是陈述那个成分的呀?从句子结构上看,“立意很深”该是说明“作者”的,因为后一个分句是承前省略了主语,那省略的主语该是“通讯的作者”;但从意思上说,“立意很深”该是用来陈述“这篇通讯”,因为“立意很深”只能用来形容作品内容,不能用来说明人。所以这个句子的毛病也属于主谓搭配不当的语法错误。 下面的例子是主谓搭配不当的另一种情况:

一种LR语法分析中的错误恢复方法_肖洋

—193— 一种LR 语法分析中的错误恢复方法 肖 洋,姜淑娟 (中国矿业大学计算机科学与技术学院,徐州 221008) 摘 要:语法分析中的错误恢复是现代编译器中智能感知功能的重要组成部分,错误恢复的效果直接影响到智能感知功能的性能。在分析LR 语法分析中LR 分析表特性的基础上,提出了一种对LR 分析表中的Goto 表项进行改造来进行语法错误的诊断和恢复的方法。该方法充分利用了LR 分析表中的空闲表项,在不增加空间需求的情况下,提高了语法错误的诊断和恢复的效率和准确率。 关键词:语法分析;编译器;智能;LR 语法分析表;Action-Goto 表 An Error Recovery Approach in LR Syntax Analysis XIAO Yang, JIANG Shujuan (School of Computer Science & Technology, China University of Mining & Technology, Xuzhou 221008) 【Abstract 】Error recovery in syntax analysis is one of the most important parts of the intelligence in the compiler. The effect of error recovery influences intelligence and syntax analysis. This paper presents a new method of modifying the items of Goto table in correcting syntax error based on analyzing the items of LR syntax analysis table. It uses the leisure items in LR syntax analysis table. It can improve the efficiency and precision in diagnosing and correcting syntax error without requiring more space. 【Key words 】Syntax analysis; Compiler; Intelligence; LR syntax analysis table; Action-Goto table 计 算 机 工 程Computer Engineering 第33卷 第4期 Vol.33 No.4 2007年2月 February 2007 ·人工智能及识别技术· 文章编号:1000—3428(2007)04—0193—03 文献标识码:A 中图分类号:TP311 编译器在进行语法分析时经常采用LR 分析法[1~5],传统的LR 分析表项比较稀疏,没有能够对语法错误进行有效的诊断和恢复。本文借鉴了对Action 表的改造方法[3],实现了对某些语法错误进行诊断和恢复,并结合智能感知,提出了对Goto 表进行改造的方法,从而进一步加强了对语法错误的诊断和恢复功能。 LR 语法分析过程首先要建立产生式的项目集和分析表(Action-Goto 表),分析程序每次从输入缓冲区读入一个符号,并使用栈来存储形如s0X1s1X2…XmSm 的串,其中Sm 在栈顶,Xi 是文法符号,Si 称为状态符号,每个状态符号概括了栈中位于它下面的信息。 LR 语法分析器在访问动作表时若遇到出错表项,就检测出一个错误,分析程序就会停止,然后对出现的语法错误进行诊断和恢复。诊断是将可能性比较大的错误原因呈现给开发人员,恢复的功能是要使语法分析程序能够继续执行下去的前提。 语法错误的恢复对语法分析产生重要影响,错误恢复要能够根据上下文准确地判断错误的原因、位置以及使用的错误恢复策略和具体方法。错误恢复不但要能使语法分析正常进行下去,而且要避免在后续的语法分析过程中出现更多的语法错误。通过分析发现,在进行语法分析时,对LR 语法分析表中的Goto 表进行改造可以较好地提高语法分析的 效率。 1 LR 语法分析中的错误恢复策略 LR(k)分析法是一种有效的自底向上的语法分析技术。它适用于一大类上下文无关文法的语法分析。LR 语法分析器是由输入、输出、栈、驱动程序以及包含动作(Action)和转移(Goto)两部分的语法分析表构成的。不同的LR 语法分析器的区别主要在于语法分析表的不同。 1.1 通常的错误恢复的策略 通常语法分析器可以采用的语法错误恢复策略主要有以下4种。 (1)紧急方式恢复策略 紧急方式恢复是最容易实现的方法,适用于多数语法分析方法。当发现错误时,语法分析器开始抛弃输入记号,每次抛弃一个记号,直到发现某个指定的同步记号为止。同步记号通常是定界符,如分号 ;或 大括号 } 。这种方法常常跳过大量的输入记号,而不检查其中是否有其它错误。这种方法比较简单,不会陷入死循环,但只合适于一个语句中出现的错误数较少的情况。 (2)短语级恢复策略 当发现错误时,语法分析器对剩余的输入字符串进行局部纠正,即用一个能使语法分析器继续工作的字符串来替代剩余输入的前缀。编译器的设计者必须仔细选择替换字符串,以免引起死循环。该方法首先被用于自顶向下的语法分析中, 其主要缺点是难以应付实际错误出现在诊断点之前的情况。 (3)出错产生式策略 如果对经常遇到的错误有很清楚的了解,可以扩充语言的文法,增加产生错误结构的产生式。然后用由这些错误产生式扩充的文法构造语法分析器。如果语法分析器使用了出错产生式,就可以产生适当的错误诊断信息,指出在输入字符串中识别出的错误结构。 (4)全局纠正策略 一个理想的编译器是在处理不正确的输入字符串时做尽 基金项目:中国矿业大学校基金资助项目(OD4527) 作者简介:肖 洋(1979-),男,硕士生,主研方向:程序设计语言,编译技术;姜淑娟,副教授 收稿日期:2006-03-08 E-mail :xiaoyang790722@https://www.wendangku.net/doc/ba16374188.html,

c++实现递归下降法的语法分析器

一、实习题目:递归下降分析 二、实习目的 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。另:程序开始变得复杂起来,需要利用到程序设计语言的知识和大量编程技巧,递归下降分析法是一种较实用的分析法,通过这个练习可大大提高软件开发能力。通过练习,掌握函数间相互调用的方法。 三、程序算法描述 1.递归下降分析法功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2.递归下降分析法前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法。 3.递归下降分析法算法 (1)若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 4.对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|-TG|ε (3)T->FS (4)S->*F S|/FS|ε (5)F->(E)|i 四、核心程序代码 #include #include #include using namespace std; char str[10]; int index = 0; int flag = 0; void E(); //E->TX; void E1(); //X->+TX | e void T(); //T->FY void T1(); //Y->*FY | e void F(); //F->(E) | i void E() { T(); E1(); } void E1()

相关文档