自顶向下的语法分析(实验报告一)
国开电大 编译原理 实验4:语法分析实验报告

国开电大编译原理实验4:语法分析实
验报告
1. 实验目的
本实验的目的是研究和掌握语法分析的原理和实现方法。
2. 实验内容
本次实验主要包括以下内容:
- 设计并实现自顶向下的LL(1)语法分析器;
- 通过语法分析器对给定的输入串进行分析,并输出相应的分析过程;
- 编写测试用例,验证语法分析器的正确性。
3. 实验步骤
3.1 设计LL(1)文法
首先,根据实验要求和给定的语法规则,设计LL(1)文法。
3.2 构建预测分析表
根据所设计的LL(1)文法,构建预测分析表。
3.3 实现LL(1)语法分析器
根据预测分析表,实现自顶向下的LL(1)语法分析器。
3.4 对输入串进行分析
编写程序,通过LL(1)语法分析器对给定的输入串进行分析,并输出相应的分析过程和结果。
3.5 验证语法分析器的正确性
设计多组测试用例,包括正确的语法串和错误的语法串,验证语法分析器的正确性和容错性。
4. 实验结果
经过实验,我们成功设计并实现了自顶向下的LL(1)语法分析器,并对给定的输入串进行了分析。
实验结果表明该语法分析器具有较好的准确性和容错性。
5. 实验总结
通过本次实验,我们对语法分析的原理和实现方法有了更深入的了解。
同时,我们也学会了如何设计并实现自顶向下的LL(1)语
法分析器,并验证了其正确性和容错性。
这对于进一步研究编译原理和深入理解编程语言的语法结构具有重要意义。
6. 参考资料
- 《编译原理与技术》
- 课程实验文档及代码。
4第四章 自顶向下语法分析法1

两类预测分析算法: (1)递归下降分析(recursive-descent parsing)很常 用,且最适合于手写的分析程序最为适合。 (2)LL(1)分析( LL(1) parsing)中第1个“L”指由左向 右地处理输入;第2个“L”指利用最左推导进行分析;括 号中的数字1仅向前查看一个符号进行预测分析。LL(k)分 析利用向前查看k个符号进行预测分析。
+
/\
+5
/\
34 构造过程: (1)对每个运算都实施语法树的生成 (2)对每个递归函数加上当前语法树树根的返回
syntaxTree exp ( )
{
syntaxTree temp, newtemp;
temp = term ( ) ;
while (token == ‘+’ || token = ‘-’){
• 请编写以下表达式文法的递归下降分析程序。
exp → exp addop term | term addop → + | term → term mulop factor | factor mulop → * factor → ( exp ) | number
识别factor → ( exp ) | number的递归下降子程序如下: void factor( ) {
G[E]={E→E+T|T, T→T*F|F, F→(E)|i },
符号串i+i*i自顶向下的分析过程:
• 自顶向下的分析程序有两类: (1)预测分析程序(predictive parser)试图利用超前 查看一个或多个记号来预测出该选择哪条规则。 (2)回溯分析程序(backtracking parser)则试着分析 所有的可能输入,当一种可能失败时就要求输入中备份任 意数量的字符。
自顶向下的语法分析

自顶向下的语法分析语法分析是语言学中一个重要的领域,它主要研究语言的结构,特别是句子的结构和语义。
自顶向下的语法分析是一种常用的语法分析方法,也称为“顶向句法”或“句法下行”。
它被定义为根据语言的上层构造来推断下层构造的一种策略。
自顶向下的语法分析的基本思想是,从一个句子的最顶层(或最外层)开始,从上而下逐层分解它,直至分解出个别单词或元素为止。
它通常利用语言语法的上下文无关性原则。
它允许类似于模糊推理,从而可以利用语言树结构来推测表达的额外信息和更深层次的意思。
自顶向下的语法分析的过程通常如下:首先,通过自动识别技术,识别语料中句子的成分,这是一个可以自动完成的过程;其次,从句子的最顶层,开始依次断出句子结构的层次,这是一个人工完成的过程;最后,根据推测出的层次,分析句子语义,并做出相应的判断。
自顶向下的语法分析也可用来处理句子中的歧义。
它也可用于处理复杂句子,比如复合句、从句等。
除此之外,它还可以处理冗余句,比如重复、拖尾等,从而进一步分解语句。
自顶向下的语法分析是一种非常有效的方法,也是计算机语言处理的基础。
近年来,随着计算机的发展,自顶向下的语法分析技术得到了进一步的改进和发展,应用于更多的领域,如自然语言处理、机器翻译、人机对话、智能搜索、智能问答等。
自顶向下的语法分析不仅可以用于机器理解,而且还可以用于人类理解。
它可以帮助人们更快、更全面地理解句子的结构,也可以加深人们对语言抽象类概念的理解。
此外,它还可以帮助学生和教师更有效地学习和教学,更好地掌握文法的规则,更好地掌握语言的抽象概念,并培养学生的语言素养。
自顶向下的语法分析方法确实具有重要的理论和实用价值,但它也存在一些缺点。
不同语言有不同的语法规则,而自顶向下的语法分析方法假定语言具有一些共同的规则,而这种规则可能不一定适用于所有语言。
此外,自顶向下的语法分析也不太灵活,往往不能很好地处理复杂的语句,也容易受到歧义的影响。
总的来说,自顶向下的语法分析是一种有效的语法分析方法,它不仅可以用于计算机语言处理,而且可以用于人类理解,帮助人们更好地理解语言结构,也可以加强人们对语言抽象概念的理解,有利于学习和教学。
递归下降程序实验报告

一、实验目的1. 理解递归下降分析法的原理和实现方法。
2. 掌握递归下降分析程序的设计和调试。
3. 加深对编译原理中语法分析部分的理解。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 递归下降分析法原理介绍2. 递归下降分析程序的设计与实现3. 递归下降分析程序的调试与测试四、实验步骤1. 递归下降分析法原理介绍递归下降分析法是一种自顶向下的语法分析方法,它将文法中的非终结符对应为分析过程中的递归子程序。
当遇到一个非终结符时,程序将调用对应的递归子程序,直到处理完整个输入串。
2. 递归下降分析程序的设计与实现(1)定义文法以一个简单的算术表达式文法为例,文法如下:E -> E + T| TT -> T F| FF -> ( E )| id(2)消除左递归由于文法中存在左递归,我们需要对其进行消除,消除后的文法如下:E -> T + E'E' -> + T E' | εT -> F T'T' -> F T' | εF -> ( E ) | id(3)设计递归下降分析程序根据消除左递归后的文法,设计递归下降分析程序如下:```cpp#include <iostream>#include <string>using namespace std;// 定义终结符const char PLUS = '+';const char MUL = '';const char LPAREN = '(';const char RPAREN = ')';const char ID = 'i'; // 假设id为'i'// 分析器状态int index = 0;string input;// 非终结符E的分析程序void E() {T();while (input[index] == PLUS) {index++;T();}}// 非终结符T的分析程序void T() {F();while (input[index] == MUL) {index++;F();}}// 非终结符F的分析程序void F() {if (input[index] == LPAREN) {index++; // 跳过左括号E();if (input[index] != RPAREN) {cout << "Error: Missing right parenthesis" << endl; return;}index++; // 跳过右括号} else if (input[index] == ID) {index++; // 跳过标识符} else {cout << "Error: Invalid character" << endl;return;}}// 主函数int main() {cout << "Enter an arithmetic expression: ";cin >> input;index = 0; // 初始化分析器状态E();if (index == input.size()) {cout << "The expression is valid." << endl;} else {cout << "The expression is invalid." << endl;}return 0;}```3. 递归下降分析程序的调试与测试将以上代码编译并运行,输入以下表达式进行测试:```2 +3 (4 - 5) / 6```程序输出结果为:```The expression is valid.```五、实验总结通过本次实验,我们了解了递归下降分析法的原理和实现方法,掌握了递归下降分析程序的设计与调试。
自顶向下的语法分析

自顶向下的语法分析自顶向下的语法分析是指一种从上至下地分析文法的方法,它的分析处理过程将从最高层的语法约束开始,并以不断的递归方式来拆解语法结构,直到最底层的语言符号细节为止。
这种从上而下的语法分析方法主要以文法规则为基础,特别是非确定的文法规则,它们描述了一系列可能的文法分析解决方案。
自顶向下的语法分析可以用于解决自然语言处理问题,其中包括机器翻译、自动问答、语义分析等。
在自然语言处理中,自顶向下的语法分析可以提供有用的线索,帮助我们建立起自然语言与其他形式的信息之间的对应关系,使之能够按照特定的语义规则进行理解和解释。
另外,自顶向下的语法分析可以帮助我们建立起文本与自然语言之间的框架,用以理解文本的结构组合、词语的意义及句子的表达方式,以及表达者如何把握文本的实际内容。
自顶向下分析会包括一些基本步骤,其中最主要的是首先分析出句子的语法结构。
除此之外,还需要对语法结构进行句法编码,以便识别各个句子的具体结构、词性分类、词语语义,以及句子的整体表达意义。
基于自顶向下的语法分析,可以提出一些结构性的文法抽象,以便更好地分析文本。
如果我们对文本分析进行抽象,可以找出共性的结构,从而使得文本的语义分析和翻译更加准确和快速。
此外,自顶向下分析还可以帮助我们构建一些文法模型,这些模型可以更加精确地描述语言,以及句子或文本在特定环境下的用法。
自顶向下的语法分析还可以在语言学习中使用,它可以用来帮助语言学习者更好地理解语言及其结构。
从句法的角度看,学习者可以把句子分解为一系列的结构性单元,从而使他们更容易地理解其中的语法结构、句子的表达和词语的意义,以及句子或文本在特定环境下的用法。
由于自顶向下的语法分析在自然语言处理中有着重要的应用,因此,在研究者和工程师们经常采用它来开发一些有用的应用程序,帮助人们更好地理解自然语言,提高自然语言处理的效率。
然而,自顶向下的语法分析也有一些缺点,例如从复杂的结构性内容中提取出有用的信息和线索可能会很困难,并且需要大量的数据来适配各种不同的语言形式。
自顶向下的语法分析(实验报告一)

武汉轻工大学编译原理实验报告姓名朱春桃院(系)数学与计算机学院班级软件工程1203学号 1205110605指导教师李禹生2014 年11 月10 日一、实验目的完成自顶向下语法分析算法的程序设计。
二、实验内容设计、调试并测试自顶向下语法分析算法程序。
三、设计思路根据课堂讲授的自顶向下语法分析方法,可以根据递归下降子程序方法设计语法分析程序,也可以根据LL(1)算法设计语法分析程序,针对文法:G[E]E→E+T | TT→T*F | FF→( E ) | i(1)由于文法G[E]不满足LL(1)文法条件,需要进行必要的等价文法变换。
变换后的等价文法为:H[E]E→TAA→+TA | εT→FBB→*FB | εF→( E ) | i(2)等价文法H[E]不含左递归,可以证明文法H[E]满足LL(1)文法条件(3)根据递归下降子程序方法设计语法分析程序①递归程序清单②调试过程说明③测试语句设计④测试结果列表⑤测试结论分析(4)根据LL(1)算法设计语法分析程序①预测分析表②预测分析程序清单③调试过程说明④测试语句设计⑤测试结果列表⑥测试结论分析四、程序清单/*E->TA,A->+TA|ε,T->FB,B->*FB|ε,F->i|(E).*/#include<stdio.h>void E(char str[80],int &i,int &err or);void A(char str[80],int &i,int &error);void T(char str[80],int &i,int &error);void B(char str[80],int &i,int &error);void F(char str[80],int &i,int &error);void main(){int i=0,j=0,error=0;char str[80];printf("请输入字符串('#'为结束字符):");while ((str[j]=getchar())!='#')j++;str[j]='#';E(str,i,error);if(error)printf("error\n");elseprintf("right\n");}void E(char str[80],int &i,int &error){printf("E->TA\n");T(str,i,error);A(str,i,error);}void A(char str[80],int &i,int &error){if(str[i]=='+'){printf("A->+TA|ε\n");i++;T(str,i,error);A(str,i,error);else if (str[i]=='#'||str[i]==')'){}elseerror++;}void T(char str[80],int &i,int &error) {printf("T->FB\n");F(str,i,error);B(str,i,error);}void B(char str[80],int &i,int &error) {if (str[i]=='*'){printf("B->*FB|ε\n");i++;F(str,i,error);B(str,i,error);}}void F(char str[80],int &i,int &error) {if (str[i]=='('){printf("F->i|(E)\n");i++;E(str,i,error);if(str[i]==')'){i++;}elseerror++;}else{if(str[i]=='i'){printf("F->i|(E)\n");i++;}elseerror++;}五、测试结果六、实验总结实验在老师提前给出的算法指导下,完成自顶向下语法分析的程序实际上是不困难的。
语法分析器实验报告
语法分析器的设计实验报告一、实验内容语法分析程序用LL(1)语法分析方法。
首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。
对于文法:G[E]:E->E+T|TT->T*F|FF->i|(E)分析句子i+i*i是否符合文法。
二、基本思想1、语法分析器实现语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。
这里采用自顶向下的LL(1)分析方法。
语法分析程序的流程图如图5-4所示。
语法分析程序流程图该程序可分为如下几步:(1)读入文法(2)判断正误(3)若无误,判断是否为LL(1)文法(4)若是,构造分析表;(5)由句型判别算法判断输入符号串是为该文法的句型。
三、核心思想该分析程序有15部分组成:(1)首先定义各种需要用到的常量和变量;(2)判断一个字符是否在指定字符串中;(3)读入一个文法;(4)将单个符号或符号串并入另一符号串;(5)求所有能直接推出&的符号;(6)求某一符号能否推出‘ & ’;(7)判断读入的文法是否正确;(8)求单个符号的FIRST;(9)求各产生式右部的FIRST;(10)求各产生式左部的FOLLOW;(11)判断读入文法是否为一个LL(1)文法;(12)构造分析表M;(13)句型判别算法;(14)一个用户调用函数;(15)主函数;下面是其中几部分程序段的算法思想:1、求能推出空的非终结符集Ⅰ、实例中求直接推出空的empty集的算法描述如下:void emp(char c){ 参数c为空符号char temp[10];定义临时数组int i;for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找{if 产生式右部第一个符号是空符号并且右部长度为1,then将该条产生式左部符号保存在临时数组temp中将临时数组中的元素合并到记录可推出&符号的数组empty中。
递归下降分析实验报告
一、实验目的通过本次实验,加深对递归下降分析法的理解,掌握递归下降分析法的原理和应用,并能够根据给定的文法编写相应的递归下降分析程序。
二、实验原理递归下降分析法是一种自顶向下的语法分析方法,它将文法中的每个非终结符对应一个递归过程(函数),分析过程就是从文法开始符触发执行一组递归过程(函数),向下推到直到推出句子。
递归下降分析法的前提是文法应满足以下条件:1. 消除二义性:确保文法中每个产生式都只有一个确定的意义。
2. 消除左递归:避免产生式出现如A -> A...A的形式。
3. 提取左因子:将产生式中的左因子提取出来,避免出现左递归。
4. 判断是否为LL(1)文法:LL(1)文法是指文法满足左递归和右递归的文法。
三、实验内容1. 根据给定的文法编写递归下降分析程序。
2. 对输入的符号串进行分析,判断其是否属于该文法。
3. 输出分析过程和结果。
四、实验步骤1. 阅读相关资料,了解递归下降分析法的原理和应用。
2. 根据给定的文法,设计递归下降分析程序的结构。
3. 编写递归下降分析程序,实现分析过程。
4. 编写测试用例,验证递归下降分析程序的正确性。
5. 分析实验结果,总结实验经验。
五、实验结果与分析1. 实验结果根据给定的文法,编写了递归下降分析程序,并进行了测试。
以下为部分测试用例及结果:(1)输入:eBaA输出:分析成功,属于该文法。
(2)输入:abAcB输出:分析成功,属于该文法。
(3)输入:dEdaC输出:分析成功,属于该文法。
(4)输入:edc输出:分析成功,属于该文法。
2. 实验分析通过本次实验,我们深入了解了递归下降分析法的原理和应用。
在编写递归下降分析程序的过程中,我们学会了如何根据文法设计程序结构,以及如何实现分析过程。
同时,我们还掌握了如何对输入的符号串进行分析,并输出分析结果。
实验过程中,我们遇到了一些问题,如消除二义性、消除左递归、提取左因子等。
通过查阅资料和不断尝试,我们成功解决了这些问题。
语法分析(自上而下分析)实验报告
实习二语法分析-自上而下分析一、实验目的使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。
二、实验内容1.设计表达式的语法分析器算法(使用预测分析)2.编写一段代码并上机调试查看其运行结果三、实验要求使用LL(1)分析算法设计表达式的语法分析器LL(1)文法是一个自上而下的语法分析方法,它是从文法的开始符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看一个字符,确定当前应该选择的产生式。
实现LL(1)分析的另一种有效方法是使用一张分析表和一个栈进行联合控制。
预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前a的输入符号行事的。
对于任何(X,a),总控程序每次都执行三种可能的动作之一。
1.若X=a=“#”,则宣布分析成功,停止分析过程2.若X=a≠“#”,则把X从STACK栈顶逐出,让a指向下一个输入符号。
3.若X是一个非终结符,则查看分析表。
四、运行结果(本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析)五、源程序实现/*LL(1)分析法源程序,只能在VC++中运行*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<dos.h>char A[20];char B[20];char v1[20]={'i','+','*','(',')','#'};/*终结符*/char v2[20]={'E','G','T','S','F'};/*非终结符*/int j=0,b=0,top=0,l;/*L为输入串长度*/typedef struct type{char origin;/*大写字符*/char array[5];/*产生式右边字符*/int length;/*字符个数*/}type;type e,t,g,g1,s,s1,f,f1;/*结构体变量*/ type C[10][10];/*预测分析表*/void print()/*输出分析栈*/{int a;/*指针*/for(a=0;a<=top+1;a++)printf("%c",A[a]);printf("\t\t");}/*print*/void print1()/*输出剩余串*/{int j;for(j=0;j<b;j++)/*输出对齐符*/printf(" ");for(j=b;j<=l;j++)printf("%c",B[j]);printf("\t\t\t");}/*print1*/void main(){int m,n,k=0,flag=0,finish=0;char ch,x;type cha;/*用来接受C[m][n]*//*把文法产生式赋值结构体*/e.origin='E';strcpy(e.array,"TG");e.length=2;t.origin='T';strcpy(t.array,"FS");t.length=2;g.origin='G';strcpy(g.array,"+TG");g.length=3;g1.origin='G';g1.array[0]='^';g1.length=1;s.origin='S';strcpy(s.array,"*FS");s.length=3;s1.origin='S';s1.array[0]='^';s1.length=1;f.origin='F';strcpy(f.array,"(E)");f.length=3;f1.origin='F';f1.array[0]='i';f1.length=1;for(m=0;m<=4;m++)/*初始化分析表*/for(n=0;n<=5;n++)C[m][n].origin='N';/*全部赋为空*/ /*填充分析表*/C[0][0]=e;C[0][3]=e;C[1][1]=g;C[1][4]=g1;C[1][5]=g1;C[2][0]=t;C[2][3]=t;C[3][1]=s1;C[3][2]=s;C[3][4]=C[3][5]=s1;C[4][0]=f1;C[4][3]=f;printf("请输入要分析的字符串:");do/*读入分析串*/{scanf("%c",&ch);if ((ch!='i') &&(ch!='+') &&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#')){printf("输入串中有非法字符\n");exit(1);}B[j]=ch;j++;}while(ch!='#');l=j;/*分析串长度*/ch=B[0];/*当前分析字符*/A[top]='#'; A[++top]='E';/*'#','E'进栈*/printf("步骤\t\t分析栈\t\t剩余字符\t\t所用产生式\n");do{x=A[top--];/*x为当前栈顶字符*/ printf("%d",k++);printf("\t\t");for(j=0;j<=5;j++)/*判断是否为终结符*/ if(x==v1[j]){flag=1;break;}if(flag==1)/*如果是终结符*/{if(x=='#'){finish=1;/*结束标记*/printf("acc!\n");/*接受*/getchar();getchar();exit(1);}/*if*/if(x==ch){print();print1();printf("%c匹配\n",ch);ch=B[++b];/*下一个输入字符*/flag=0;/*恢复标记*/}/*if*/else/*出错处理*/{print();print1();printf("%c出错\n",ch);/*输出出错终结符*/exit(1);}/*else*/}/*if*/else/*非终结符处理*/{for(j=0;j<=4;j++)if(x==v2[j]){m=j;/*行号*/break;}for(j=0;j<=5;j++)if(ch==v1[j]){n=j;/*列号*/break;}cha=C[m][n];if(cha.origin!='N')/*判断是否为空*/{print();print1();printf("%c->",cha.origin);/*输出产生式*/for(j=0;j<cha.length;j++)printf("%c",cha.array[j]);printf("\n");for(j=(cha.length-1);j>=0;j--)/*产生式逆序入栈*/ A[++top]=cha.array[j];if(A[top]=='^')/*为空则不进栈*/top--;}/*if*/else/*出错处理*/{print();print1();printf("%c出错\n",x);/*输出出错非终结符*/exit(1);}/*else*/}/*else*/}while(finish==0);}/*main*/。
自顶向下的语法分析
自顶向下的语法分析语法分析是自然语言处理中的一个重要组成部分,它的目的是将输入的文本归类为句法成分,并建立句法结构,从而实现对输入文本对句子中实体的抽取和理解。
为了解决自然语言处理中句法分析的问题,目前主要有两种常用技术:自顶向下技术(Top-Down)和自底向上技术(Bottom-Up)。
自顶向下技术指的是从句子的原始形式出发,通过层层分解直至分解完毕,或者说从大的结构框架出发,向下逐步分解,最终分析细节的技术。
该方法类似于程序设计中的自顶向下的程序设计方法,根据结构语法,句子可以被分解为更小的句子,句子又可以被分解为词语,而词语可以被分解为不同的词类。
通过分解和分析,可以建立语句的句法树形结构,从而得到词语、句子的结构等信息。
自顶向下句法分析的思想,即从整体分析向小部分分析,继而从整个句子到语法结构的分析,再从宏观结构到微观结构的分析。
自顶向下的语法分析有许多优点值得赞赏,其中一个优点就是它可以用相对简单的算法实现。
由于不需要存储较多句子结构,因此使用自顶向下语法分析可以节省存储空间,也更容易实现。
另外,在某些语法结构上,自顶向下语法分析也会比自底向上更加准确和可靠。
但是,它存在一些缺点,一是该方法只能处理少量的结构,无法处理复杂句法结构,二是它的分析速度很慢,不易开发。
要实现自顶向下的语法分析,首先要定义一个语言和句子的结构,这样才能将句子拆分成各个成分。
这里可以使用一些语法抽象的概念来描述抽象语法结构,或者使用终结符和非终结符表示句子的组成要素。
之后,可以建立一个语法分析树,对语句进行自顶向下的递归分析,最终得到抽象语法结构。
自顶向下的语法分析在自然语言处理中发挥着重要作用,它有助于理解输入文本的句子结构,从而提取实体信息。
在计算机科学里,语法分析使用自顶向下技术是一个有效的办法,可以帮助程序员更好地理解程序,更容易开发程序。
因此,自顶向下的语法分析技术可以为我们提供解决自然语言处理问题的方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉轻工大学
编译原理实验报告
姓名朱春桃
院(系)数学与计算机学院
班级软件工程1203
学号 1205110605
指导教师李禹生
2014 年11 月10 日
一、实验目的
完成自顶向下语法分析算法的程序设计。
二、实验内容
设计、调试并测试自顶向下语法分析算法程序。
三、设计思路
根据课堂讲授的自顶向下语法分析方法,可以根据递归下降子程序方法设计语法分析程序,也可以根据LL(1)算法设计语法分析程序,针对文法:G[E]
E→E+T | T
T→T*F | F
F→( E ) | i
(1)由于文法G[E]不满足LL(1)文法条件,需要进行必要的等价文法变换。
变换后的等价文法为:
H[E]
E→TA
A→+TA | ε
T→FB
B→*FB | ε
F→( E ) | i
(2)等价文法H[E]不含左递归,可以证明文法H[E]满足LL(1)文法条件(3)根据递归下降子程序方法设计语法分析程序
①递归程序清单
②调试过程说明
③测试语句设计
④测试结果列表
⑤测试结论分析
(4)根据LL(1)算法设计语法分析程序
①预测分析表
②预测分析程序清单
③调试过程说明
④测试语句设计
⑤测试结果列表
⑥测试结论分析
四、程序清单
/*
E->TA,
A->+TA|ε,
T->FB,
B->*FB|ε,
F->i|(E).
*/
#include<stdio.h>
void E(char str[80],int &i,int &err or);
void A(char str[80],int &i,int &error);
void T(char str[80],int &i,int &error);
void B(char str[80],int &i,int &error);
void F(char str[80],int &i,int &error);
void main()
{
int i=0,j=0,error=0;
char str[80];
printf("请输入字符串('#'为结束字符):");
while ((str[j]=getchar())!='#')
j++;
str[j]='#';
E(str,i,error);
if(error)
printf("error\n");
else
printf("right\n");
}
void E(char str[80],int &i,int &error)
{
printf("E->TA\n");
T(str,i,error);
A(str,i,error);
}
void A(char str[80],int &i,int &error)
{
if(str[i]=='+')
{
printf("A->+TA|ε\n");
i++;
T(str,i,error);
A(str,i,error);
else if (str[i]=='#'||str[i]==')'){}
else
error++;
}
void T(char str[80],int &i,int &error) {
printf("T->FB\n");
F(str,i,error);
B(str,i,error);
}
void B(char str[80],int &i,int &error) {
if (str[i]=='*')
{
printf("B->*FB|ε\n");
i++;
F(str,i,error);
B(str,i,error);
}
}
void F(char str[80],int &i,int &error) {
if (str[i]=='(')
{
printf("F->i|(E)\n");
i++;
E(str,i,error);
if(str[i]==')')
{
i++;
}
else
error++;
}
else
{
if(str[i]=='i')
{
printf("F->i|(E)\n");
i++;
}
else
error++;
}
五、测试结果
六、实验总结
实验在老师提前给出的算法指导下,完成自顶向下语法分析的程序实际上是不困难的。
但是老师的目的应该不在程序,而是让我们通过此次实验对课堂的理论知识有个深层次的理解。
所以通过本次实验,我对自顶向下的语法分析过程有了更深的了解,结合课堂知识打下了学习其他语法分析方法的基础。