语法分析器实验报告

合集下载

编译原理语法分析试验报告

编译原理语法分析试验报告

编译原理语法分析试验报告语法分析是编译原理中的重要内容之一,主要用于对源程序进行语法检查,判断其是否符合给定的语法规则。

本次试验通过使用ANTLR工具,对C语言的子集进行了语法分析的实现。

一、实验目的:1.了解语法分析的基本概念和方法;2.使用ANTLR工具生成语法分析器;3.掌握ANTLR工具的基本使用方法;4.实现对C语言子集的语法分析。

二、实验内容:本次试验主要内容是使用ANTLR工具生成C语言子集的语法分析器,并对给定的C语言子集进行语法分析。

三、实验步骤:1.学习ANTLR工具的基本概念和使用方法;2.根据C语言子集的语法规则,编写ANTLR的语法文件(.g文件);3.使用ANTLR工具生成语法分析器;4.编写测试代码,对给定的C语言子集进行语法分析。

四、实验结果:经过以上的步骤,得到了一个完整的C语言子集的语法分析器,并且通过测试代码对给定的C语言子集进行了语法分析。

五、实验总结:通过本次实验,我对语法分析有了更深入的了解,掌握了使用ANTLR工具生成语法分析器的基本方法,同时也巩固了对C语言的基本语法规则的理解。

在实验过程中,遇到了一些问题,例如在编写ANTLR的语法文件时,对一些特殊语法规则的处理上有些困惑,但通过查阅资料和与同学的探讨,最终解决了这些问题。

本次试验对于我的学习有很大的帮助,我了解到了编译原理中的重要内容之一,也更深入地理解了语法分析的基本原理和方法。

通过实验,我发现使用ANTLR工具能够更方便地生成语法分析器,大大提高了开发效率。

总之,本次试验让我对编译原理中的语法分析有了更深入的了解,并且提高了我的编程能力和分析问题的能力。

在今后的学习和工作中,我将继续深入研究编译原理相关的知识,并应用到实际项目中。

编译原理语法分析实验报告

编译原理语法分析实验报告

编译原理语法分析实验报告第一篇:编译原理语法分析实验报告实验2:语法分析1.实验题目和要求题目:语法分析程序的设计与实现。

实验内容:编写语法分析程序,实现对算术表达式的语法分析。

要求所分析算术表达式由如下的文法产生。

E→E+T|E-T|TT→T*F|T/F|F F→id|(E)|num实验要求:在对输入表达式进行分析的过程中,输出所采用的产生式。

方法1:编写递归调用程序实现自顶向下的分析。

方法2:编写LL(1)语法分析程序,要求如下。

(1)编程实现算法4.2,为给定文法自动构造预测分析表。

(2)编程实现算法4.1,构造LL(1)预测分析程序。

方法3:编写语法分析程序实现自底向上的分析,要求如下。

(1)构造识别所有活前缀的DFA。

(2)构造LR分析表。

(3)编程实现算法4.3,构造LR分析程序。

方法4:利用YACC自动生成语法分析程序,调用LEX自动生成的词法分析程序。

实现(采用方法1)1.1.步骤:1)对文法消除左递归E→TE'E'→+TE'|-TE'|εT→FT'T'→*FT'|/FT'|εF→id|(E)|num2)画出状态转换图化简得:3)源程序在程序中I表示id N表示num1.2.例子:a)例子1 输入:I+(N*N)输出:b)例子2 输入:I-NN 输出:第二篇:编译原理实验报告编译原理实验报告报告完成日期 2018.5.30一.组内分工与贡献介绍二.系统功能概述;我们使用了自动生成系统来完成我们的实验内容。

我们设计的系统在完成了实验基本要求的前提下,进行了一部分的扩展。

增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。

从而使得我们的实验结果呈现的更加清晰和易懂。

三.分系统报告;一、词法分析子系统词法的正规式:标识符(|)* 十进制整数0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==;对于标识符和关键字: A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε综上正规文法为: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|εE1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|εC2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|εA4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε状态图流程图:词法分析程序的主要数据结构与算法考虑到报告的整洁性和整体观感,此处我们仅展示主要的程序代码和算法,具体的全部代码将在整体的压缩包中一并呈现另外我们考虑到后续实验中,如果在bison语法树生成的时候推不出目标的产生式时,我们设计了报错提示,在这个词的位置出现错误提示,将记录切割出来的词在code.txt中保存,并记录他们的位置。

语法法分析实验报告

语法法分析实验报告

一、实验目的1. 理解语法分析的基本概念和原理。

2. 掌握语法分析器的构建方法。

3. 培养实际操作能力,提高编程水平。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容1. 语法分析概述2. 词法分析3. 语法分析4. 实验实现四、实验步骤1. 语法分析概述(1)了解语法分析的定义、作用和意义。

(2)掌握语法分析的基本原理和流程。

2. 词法分析(1)编写词法分析器代码,将源代码分解成单词序列。

(2)实现词法分析器的各个功能,如:识别标识符、关键字、运算符等。

3. 语法分析(1)设计语法分析器,将单词序列转换为抽象语法树(AST)。

(2)实现语法分析器的各个功能,如:识别表达式、语句、函数等。

4. 实验实现(1)创建Python项目,导入相关库。

(2)编写词法分析器代码,实现单词序列的分解。

(3)编写语法分析器代码,实现抽象语法树的构建。

(4)测试语法分析器,验证其正确性。

五、实验结果与分析1. 词法分析结果实验中,我们成功地将源代码分解成单词序列,包括标识符、关键字、运算符等。

词法分析器的输出结果如下:```identifier: akeyword: intoperator: +identifier: boperator: =integer: 5```2. 语法分析结果通过语法分析器,我们将单词序列转换成抽象语法树。

以下是一个示例的抽象语法树:```Program├── Declaration│ ├── Type│ │ ├── Identifier│ │ └── Integer│ └── Identifier│ └── a└── Statement├── Expression│ ├── Identifier│ └── a└── Operator└── =└── Expression├── Identifier└── b└── Integer└── 5```从实验结果可以看出,我们的语法分析器能够正确地将源代码转换为抽象语法树。

国开电大 编译原理 实验4:语法分析实验报告

国开电大 编译原理 实验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. 参考资料
- 《编译原理与技术》
- 课程实验文档及代码。

编译原理实验报告(语法分析器)

编译原理实验报告(语法分析器)

.编译原理实验专业:13级网络工程语法分析器1一、实现方法描述所给文法为G【E】;E->TE’E’->+TE’|空T->FT’T’->*FT’|空F->i|(E)递归子程序法:首先计算出五个非终结符的first集合follow集,然后根据五个产生式定义了五个函数。

定义字符数组vocabulary来存储输入的句子,字符指针ch指向vocabulary。

从非终结符E函数出发,如果首字符属于E的first集,则依次进入T函数和E’函数,开始递归调用。

在每个函数中,都要判断指针所指字符是否属于该非终结符的first集,属于则根据产生式进入下一个函数进行调用,若first集中有空字符,还要判断是否属于该非终结符的follow集。

以分号作为结束符。

二、实现代码头文件shiyan3.h#include<iostream>#include<cstdio>#include<string>using namespace std;#define num 100char vocabulary[num];char *ch;void judge_E();void judge_EE();void judge_T();void judge_TT();void judge_F();源文件#include"shiyan3.h"void judge_E(){if(*ch==';'){cout<<"该句子符合此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}elseif(*ch=='('||*ch=='i'){judge_T();judge_EE();}else{cout<<"该句子不匹配此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}}void judge_EE(){if(*ch==';'){cout<<"该句子符合此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}if(*ch=='+'){ch++;judge_T();judge_EE();}elseif(*ch=='#'||*ch==')')return;else{cout<<"该句子不匹配此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}}void judge_T(){if(*ch==';'){cout<<"该句子符合此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}if(*ch=='('||*ch=='i'){judge_F();judge_TT();}else{cout<<"该句子不匹配此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}}void judge_TT(){if(*ch==';'){cout<<"该句子符合此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}if(*ch=='*'){ch++;judge_F();judge_TT();}elseif(*ch==')'||*ch=='+'||*ch=='#')return;else{cout<<"该句子不匹配此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}}void judge_F(){if(*ch==';'){cout<<"该句子符合此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}if(*ch=='('){ch++;judge_E();if(*ch==')'){ch++;}else{cout<<"该句子不匹配此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}}elseif(*ch=='i'){ch++;//cout<<*ch;}else{cout<<"该句子不匹配此文法!"<<endl;int a=0;cout<<"按1结束程序"<<endl;cin>>a;if(a==1)exit(0);}}void main(){//char *ch;cout<<"**********************欢迎使用语法分析器************************"<<endl;cout<<"请输入一个句子:"<<endl;cin.getline(vocabulary,15);ch=vocabulary;judge_E();cout<<endl;cout<<"************************结束使用,再见!**************************"<<endl;}三、运行结果四、心得体会此次实验使用的是递归子程序法,用这个方法最大的问题就是函数里的递归调用,一不小心就把人绕糊涂了。

语法分析器实验报告

语法分析器实验报告

语法分析器一.需求分析1.1 题目背景描述编译器实现技术是一大宝库,一方面以编译器的实现为背景可以实践几乎全部在数据结构与算法分析课程中学到的主要数据结构与算法;另一方面,编译器设计中使用的问题求解方法、处理问题的思路被广泛地用于自动数据处理(转换)及其它一些新的研究领域。

没有编译器的出现就没有现代数字计算机的发展。

本次课设即以“语法规则的存储与显示”、“句子的生成”、“语法(分析)树的建立”等等这些编译器中的一些基本功能的实现为题,对高级程序设计语言在计算机中的表达和相关的处理有一个初步认识,提前领略“数据的自动转换与处理”这一计算机问题求解的核心技术。

尽管这些功能的实现并不涉及较深入的编译技术,但也需要带着问题预先学习、掌握有关形式语言、编译原理与技术的若干基本概念。

1.2 课程设计任务给定若干描述某种高级程序设计语言组成部分的语法规则及测试用例:1、设计恰当的数据结构实现语法规则的计算机存储并加以显示;2、对于给定语法规则的句子,能动态显示“句子的生成”;3、对于给定语法规则的句子(或句型),完成该句子(句型)的“语法(分析)树的建立”,并用图形界面显示;1.3 输入形式本程序用到的输入形式有键盘、鼠标和文件。

各输入说明及输入值范围说明如下:1.3.1 键盘输入可在“建立推导”窗口通过键盘输入任意句子建立推导,两符号间需要空格。

1.3.2 鼠标输入可在“文法管理系统”界面通过鼠标点击任意菜单选项,实现对应功能。

当文法或推导过长时,点击对应文本域滚动滚轮可查看余下全文。

1.3.3 文件输入可输入任意存储了正确文法的txt文件,默认有Pascal风格的文法和C语言风格的文法,格式如下:Pascal风格:St::=Assign|IfS|WhSAssign::=id := EE::=E + E|E - E|E * E|E / E|( E )|idIfS::=if BE then St|if BE then St else StBE::=id > id|id == id|id < idWhS::=while BE do StC语言风格:S::=assignS|ifS|whileSassignS::=id = E|id += E|id -= EE::=E + T|E - T|TT::=T * F|T / F|FifS::=if BE S|if BE S else SBE::=E > E|E == E|E < E|E >= E|E != E|E <= EwhileS::=while BE S1.4 输出形式输出到显示器。

语法分析器设计实验报告

语法分析器设计实验报告一、引言语法分析器是编译器中的重要组成部分,其主要功能是根据给定的文法规则,对输入的程序代码进行语法分析,判断其是否符合语法规范。

本实验旨在设计一个简单的语法分析器,通过实际实现一个基于LL(1)文法的语法分析器,深入了解语法分析的原理和实现方法。

二、实验目标本实验的目标是设计一个能够接受一个输入的程序代码并进行语法分析的程序。

具体而言,需要实现以下功能:1. 构建一个文法规则集合,用于描述程序代码的语法规范;2. 设计并实现一个LL(1)分析表,用于存储语法分析所需的预测分析表;3. 实现语法分析器,能够根据输入的程序代码,逐步地进行语法分析,并输出相应的结果。

三、实验环境本实验使用的是Java语言进行实现,操作系统环境为Windows 10。

使用的集成开发环境为Eclipse。

四、实验步骤1. 设计文法规则集合在语法分析器设计中,首先需要设计一个文法规则集合,用于描述需要分析的程序代码的语法规范。

文法规则集合的设计要符合LL(1)文法的要求,即每个非终结符的产生式至多有一个与输入符号串首符号相关的产生式。

2. 构建LL(1)分析表根据文法规则集合,构建一个LL(1)分析表,用于存储语法分析所需的预测分析表。

LL(1)分析表是一个二维表,其中行表示非终结符,列表示终结符。

表中的每个元素表示相应的产生式编号,用于指示语法分析器在分析过程中应该使用哪个产生式。

构建LL(1)分析表的方法包括:- 遍历文法规则集合,计算每个非终结符的FIRST集合和FOLLOW集合;- 根据计算得到的FIRST集合和FOLLOW集合,填充LL(1)分析表。

3. 实现语法分析器根据LL(1)分析表,实现一个语法分析器。

语法分析器的输入是一个程序代码,输出是语法分析器的分析结果。

实现语法分析器的主要过程包括:- 初始化分析栈,将文法规则的开始符号入栈;- 从输入的程序代码中读取下一个终结符;- 如果分析栈的栈顶是非终结符,根据LL(1)分析表中对应的产生式编号,将产生式右部的符号依次入栈;- 如果分析栈的栈顶是终结符,并且与输入的终结符相同,则将该终结符出栈,并继续读取下一个终结符;- 重复上述过程,直到分析栈为空或者无法继续推导。

语法分析实验报告

语法分析实验报告一: 实验内容:编写语法分析程序, 实现对算术表达式的语法分析, 要求所分析的算术表达式由如下的文法产生。

E->E+T|E-T|TT->T*F|T/F|FF->id|(E)|num二: 实验要求:在对表达式进行分析的同时, 输出所采用的产生式。

1.编写LL(1)语法分析程序, 要求:编程实现算法4.2, 为给定的文法自动构造预测分析表编程实现算法4.1, 构造LL(1)预测分析程序,2.编写语法分析程序, 实现自底向上的分析, 要求:构造识别所有活前缀的DFA构造LR分析表编程实现算法4.3, 构造LR分析程序1.三: 实验分析:2.方法二(编写LL(1)语法分析程序)1.步骤:(1)根据题目所给出的文法构造相应的无左递归文法, 并求出该文法各非终结符的FIRST、FOLLOW集合;(2)构造文法的LL(1)分析表;(3)由此构造LL分析程序。

2.实现方法:1.输入缓冲区为一个字符型数组, 读入输入的算术表达式并保存在此, 以’$’结束;2.为构造文法的LL(1)分析表, 构建一个相对应的字符串数组;3.在实际程序中P代表E', Q代表T', e代表ε,i代表id, n代表num;4.处理输入表达式中代表id和num的子串, 分别将它们转化为'i'和'n'进行分析;5.LL(1)预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a做哪种过程的。

对于任何(X,a),总控程序每次都执行下述三种可能的动作之一:(1)若X = a =‘$’, 则宣布分析成功, 停止分析过程。

(2)若X = a!=‘$’, 则把X从STACK栈顶弹出, 让a指向下一个输入符号。

①如果是终结符合, 则栈不加入新符号②如果是非终结符合, 则把表达式右边入栈(3)若M[A, a]中存放着“出错标志”, 则调用出错诊断程序ERROR。

语法分析器实验报告

语法分析器的设计实验报告一、实验内容语法分析程序用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中。

语法分析实验报告

语法分析实验报告一、实验目的语法分析是编译原理中的重要环节,本次实验的目的在于深入理解和掌握语法分析的基本原理和方法,通过实际操作和实践,提高对编程语言语法结构的分析能力,为进一步学习编译技术和开发相关工具打下坚实的基础。

二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。

三、实验原理语法分析的任务是在词法分析的基础上,根据给定的语法规则,将输入的单词符号序列分解成各类语法单位,并判断输入字符串是否符合语法规则。

常见的语法分析方法有自顶向下分析法和自底向上分析法。

自顶向下分析法包括递归下降分析法和预测分析法。

递归下降分析法是一种直观、简单的方法,但存在回溯问题,效率较低。

预测分析法通过构建预测分析表,避免了回溯,提高了分析效率,但对于复杂的语法规则,构建预测分析表可能会比较困难。

自底向上分析法主要包括算符优先分析法和 LR 分析法。

算符优先分析法适用于表达式的语法分析,但对于一般的上下文无关文法,其适用范围有限。

LR 分析法是一种功能强大、适用范围广泛的方法,但实现相对复杂。

四、实验内容(一)词法分析首先,对输入的源代码进行词法分析,将其分解为一个个单词符号。

单词符号包括关键字、标识符、常量、运算符、分隔符等。

(二)语法规则定义根据实验要求,定义了相应的语法规则。

例如,对于简单的算术表达式,可以定义如下规则:```Expression > Term | Expression '+' Term | Expression ''TermTerm > Factor | Term '' Factor | Term '/' FactorFactor >'(' Expression ')'| Identifier | Number```(三)语法分析算法实现选择了预测分析法来实现语法分析。

首先,根据语法规则构建预测分析表。

然后,从输入字符串的起始位置开始,按照预测分析表的指导进行分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

语法分析器试验报告姓名:学号:班级:一、实验内容与要求:(1)实验内容描述:对某特定语言A ,构造其语法规则。

该语言的语法单位如下(2)实现识别该语言的语法分析器, 可以选用:细化的递归下降程序,或者预测分析程序等。

* 按语法单位出现的顺序,返回识别出的语法单位序列* 出现的语法错误,可以指出错误位置,及错误原因。

* 出现的标识符存放在标识符表,整型常数存放在常数表(3)测试语法分析程序。

如以下示例:二、实验过程:(1)程序设计语言文法的形式化描述:1. <程序> → Program <程序名> ;<定义语句序列> <复合语句>2. <定义语句序列> → <定义语句> 定义语句序列|定义语句3. <定义语句> →var int变量{,变量};| var bool变量{,变量};4. <复合语句> → begin {<赋值语句> | <分支语句> | <循环语句>}end5. <赋值语句> →变量 := <表达式> ;6. <表达式> →一元运算符标识符{二元运算符一元运算符标识符 }7. <标识符> →变量 |常量8. <一元运算符> →非 | 空串9. <二元运算符 > → + | * | >= | <= | > | < | <> | 与 | 或10. <分支语句> → if(表达式) then <复合语句> E11. E → else <复合语句> | 空串12. <循环语句> → while(表达式) do <复合语句>(2) 单词种别定义;then 10 < 25 else 11 = 26 while 12 >= 27 do 13 <= 28 标识符 14 <> 29 整型常量 15 - 30(3)程序运行环境:硬件:intel i3处理器 内存2GB软件:操作系统 Windows 7 运行平台 MyEclipse 8.5 (4)关键算法流程图以及解释:A 、程序主体结构:主体包含词法分析器程序、语法分析器程序两部分:产出二元组读入二元组B 、语法分析程序流程图:开始进入主程序main ()调用词法分析器程序调用语法分析器程序ArrayList 存储队列结束注明:程序调用语法分析函数时同时把词法分析函数产生的二元组作为公共静态变量交给其使用。

分析函数每次读取一个二元组,判断二元组的序号与所预期的是否相同。

在函数中,首先进行三次读取判断,分析程序具正确的格式:program title ;,然后在读入进行句子的语法分析。

C、语法分析关键函数S()流程图:(5)与词法程序的衔接主程序main()处理此法及语法分析程序,首先调用词法分析程序,产生相应的二元组序列,存储于一个公共的静态队列里面,在main()调用语法分析程序的时候,将该产生的队列传入语法分析程序。

简言之,先调用词法分析程序扫描一遍,在调用语法程序扫描第二遍。

一共扫描两遍。

衔接代码部分:图存储队列数据结构图主程序调用分析函数部分(6)测试报告(测试用例,测试结果)测试结果:三、实验总结:通过本次试验,对语法分析有了进一步的了解。

在实验过程中,复习了课本的知识,巩固了语法分析的自顶下下的分析方法。

但是在实验中,存在了一些未解决的问题。

有以下几点:(1)报错处理不准确,只能准确报出第一个错误附:实验代码:C.javapackage Analysis;import java.util.ArrayList;public class C {public static B ch=new B();public static int index =0;public static ArrayList<B> r;public static void advance(){c h=r.get(index++);}//IF语句分析static boolean SIF(){b oolean flag = B();i f(ch.type == 10){advance();flag = flag&S();}//thene lse{System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少关键字 \"then\"");flag = false;}i f(ch.type == 11){advance();flag = flag&S();}//elser eturn flag;}//定义语句static boolean SDE(){b oolean flag;i f(ch.type == 5){advance();flag = true;}//数据类型声明e lse{System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少数值的类型");flag = false;}i f(ch.type == 14){advance();}//变量名e lse{System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少变量名字");flag = false;}d o{if(ch.type == 20){//逗号advance();if(ch.type == 14)advance();else{System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少变量的名字");flag = false;break;}}else if(ch.type !=21){System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少分号");flag =false;break;}//不是分号时应该报错}while(ch.type != 21);//分号结束a dvance();r eturn flag;}//赋值语句static boolean SA(){b oolean flag = true;i f(ch.type == 22)advance();//赋值号e lse {System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少赋值符号:=");flag = false;}f lag = flag&E();//数值表达式i f(ch.type == 21)advance();//分号结束e lse {System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少分号");flag = false;}r eturn flag;}//循环语句static boolean SW(){b oolean flag = B();i f(ch.type == 13){advance();flag = flag&S();}//doe lse{System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少关键字 do");flag = false;}r eturn flag;}//复合语句,由bigin和end围起来,中间可以有0到多个句子,static boolean SC(){b oolean flag = true;w hile(ch.type != 3){flag = flag&S();}//不是end,认为复合语句未结束a dvance();r eturn flag;}/////////////////////////////布尔表达式static boolean B(){b oolean flag = b();w hile((ch.type == 6)||(ch.type == 7)||(ch.type==8)){advance();flag = flag&b();}//and ,or,notr eturn flag;}//布尔表达式的子项static boolean b(){b oolean flag = E();i f((ch.type > 22)&&(ch.type < 30)&&(ch.type!=27))advance();//比较符号e lse {System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少布尔运算符号");flag = false;}f lag = flag&E();r eturn flag;}/////////////////////////////////////数值表达式static boolean E(){b oolean flag = T();w hile((ch.type == 16)){advance();flag = flag&T();}//加号r eturn flag;}static boolean T(){b oolean flag = F();w hile(ch.type == 17){advance();flag = flag&F();}//乘号r eturn flag;}static boolean F(){i f((ch.type == 14)||(ch.type == 15)){advance();return true;}//数字或者变量e lse if(ch.type == 18){//左括号advance();boolean flag = E();if(ch.type == 19){advance();return true;}//右括号else {System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少右括号");return false;}}e lse {System.out.print("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:出现非法字符");System.out.println(ch.type);advance();return false;}}static boolean S(){//语句b oolean flag = true;i f(ch.type == 9){System.out.println("条件语句");advance();flag = flag&SIF();}//进入条件语句e lse if(ch.type== 4){System.out.println("定义语句");advance();flag =flag&SDE();}//进入定义语句e lse if(ch.type== 14){System.out.println("赋值语句");advance();flag = flag&SA();}//进入赋值语句e lse if(ch.type== 12){System.out.println("循环语句");advance();flag = flag&SW();}//进入循环语句e lse if(ch.type == 2){System.out.println("以bengin开始的复合语句");advance();flag = flag&SC();}//进入复合语句e lse if(ch.type == 3){return true;}//遇到的有可能是end,如果是end不应该缓冲下一个字符,而应该让上一层的函数处理e lse {return false;}r eturn flag;}public static void fenxi(){b oolean flag;a dvance();i f (ch.type == 1){advance();flag = true;}//programe lse {System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:没有关键字\"program\"\n");flag = false;}i f (ch.type == 14){advance();flag = flag&true;}//process namee lse {System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:没有程序名字");flag = false;}i f(ch.type == 21){advance();flag = flag&true;}// 程序名后的 ';'e lse {System.out.println("错误位置:"+ch.location[0]+"行"+ch.location[1]+"列:原因:缺少分号';");flag = false;}//进入语句集合,可为0到多个句子组成w hile((ch.type != 24)&&(ch.type != 0)){ flag = flag&S();}}}B.javapackage Analysis;public class B {public int type;public int attr;public int[] location=new int[2];}。

相关文档
最新文档