当前位置:文档之家› 编译原理语法分析实验报告

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

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

编译原理实验报告

一、实验目的

本实验的主要目的是熟悉编译原理中的语法分析算法及相关知识,并

通过实际编码实现一个简单的语法分析器。

二、实验内容

1.完成一个简单的编程语言的语法定义,并用BNF范式表示;

2.基于给定的语法定义,实现自顶向下的递归下降语法分析器;

3.实验所用语法应包含终结符、非终结符、产生式及预测分析表等基

本要素;

4.实现语法分析器的过程中,需要考虑文法的二义性和优先级等问题。

三、实验步骤

1.设计一个简单的编程语言的语法,用BNF范式进行表达。例如,可

以定义表达式文法为:

::= { + , - }

::= { * , / }

::= , () ,

::= 0,1,2,3,4,5,6,7,8,9

::= a,b,c,...,z

2. 根据所设计的语法,构建语法分析器。首先定义需要用到的终结符、非终结符和产生式。例如,终结符可以是+、-、*、/、(、)等,非终

结符可以是等,产生式可以是 ::= + - 等。

3.实现递归下降语法分析器。根据语法的产生式,编写相应的递归函

数进行递归下降分析。递归函数的输入参数通常是一个输入字符串和当前

输入位置,输出结果通常是一个语法树或语法分析错误信息。

4.在语法分析的过程中,需要处理语法的二义性和优先级问题。例如,在表达式文法中,需要考虑加减乘除的优先级。可以使用优先级表和栈等

数据结构进行处理。

四、实验结果与分析

经过实验,我们成功地实现了一个递归下降的语法分析器。通过构建BNF范式表达语法,并根据语法定义构建预测分析表,我们可以根据输入

的程序代码进行分析,并生成语法树。实验结果表明,该语法分析器在正

常情况下可以正确地识别输入的程序代码,并生成对应的语法树。

然而,在实现语法分析器的过程中,我们也面临了一些问题。首先,

语法的二义性可能导致分析器无法正确识别输入的程序代码。在设计语法时,我们需要避免二义性,并根据需要添加合适的优先级规则。其次,语

法的复杂度和规模也会影响语法分析器的性能。如果语法过于复杂,递归

下降的方法可能会导致栈溢出等问题。

五、实验总结

通过本次实验,我们深入了解了编译原理中的语法分析算法及相关知识。我们了解了如何根据语法定义构建语法分析器,并掌握了递归下降方

法的原理和实现过程。同时,我们也意识到语法的二义性和优先级问题的

重要性,需要在语法设计中予以考虑。

在今后的学习和工作中,我们将进一步研究和应用语法分析算法,提

高编译器的性能和效率。我们还将深入研究其他的语法分析方法,如自底

向上的分析方法,以及更复杂的语法结构,如属性文法和语义分析等内容。希望通过不断学习和实践,能够提升自己的编译原理技术水平。

编译原理实验报告

编译原理实验报告 编译原理实验报告 一、实验目的 1. 了解编译器的基本原理和工作过程; 2. 掌握编译器设计和实现的基本方法和技巧; 3. 通过设计和实现一个简单的编译器,加深对编程语言和计算机系统的理解和认识。 二、实验原理 编译器是将高级语言程序翻译成机器语言程序的一种软件工具。它由编译程序、汇编程序、链接程序等几个阶段组成。本次实验主要涉及到的是编译程序的设计和实现。 编译程序的基本原理是将高级语言程序转换为中间代码,再将中间代码转换为目标代码。整个过程可以分为词法分析、语法分析、语义分析、代码生成和代码优化几个阶段。 三、实验内容 本次实验的设计目标是实现一个简单的四则运算表达式的编译器。 1. 词法分析 根据规定的语法规则,编写正则表达式将输入的字符串进行词法分析,将输入的四则运算表达式划分成若干个单词(Token),例如:运算符、操作数等。

2. 语法分析 根据定义的语法规则,编写语法分析程序,将词法分析得到的Token序列还原成语法结构,构建抽象语法树(AST)。 3. 语义分析 对AST进行遍历,进行语义分析,判断表达式是否符合语法 规则,检查语义错误并给出相应的提示。 4. 代码生成 根据AST生成目标代码,目标代码可以是汇编代码或者机器码。 四、实验过程和结果 1. 首先,根据输入的表达式,进行词法分析。根据所定义的正则表达式,将输入的字符串划分成Token序列。例如:输入 表达式“2+3”,经过词法分析得到的Token序列为["2", "+", "3"]。 2. 然后,根据语法规则,进行语法分析。根据输入的Token 序列,构建抽象语法树。 3. 接着,对抽象语法树进行语义分析。检查表达式是否符合语法规则,给出相应的提示。 4. 最后,根据抽象语法树生成目标代码。根据目标代码的要求,生成汇编代码或者机器码。 五、实验总结

编译原理实验报告(手打)

《编译原理》实验报告 班级:计C104 姓名:李云霄 学号:108490

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 三、实现方法与环境 1、首先设计识别各类单词的状态转换图。 描述无符号常数的确定、最小化状态转换图如图1所示。其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 图1 文法G[<无符号数>]的状态转换图 其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。 四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢

编译原理实验报告1

编译原理实验报告 某某: 班级: 学号: 自评:中

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,V ALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;V ALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,V ALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,本次试验用手工的方式(C语言)构造词法分析程序。根据文法和状态转换图直接编写词法分析程序。 四、基本实验题目 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表

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

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

西安邮电大学 编译原理实验报告 学院名称:计算机学院 学生姓名:高宏伟 实验名称:语法分析器的设计与实现班级:计科1405班学号:04141152 时间:2017年5月12日

把SELECT (i)存放到temp中结果返回1; 1.构建好的预测分析表 2.语法分析流程图 一.实验结果 正确运行结果:

错误运行结果: 二.设计技巧和心得体会 这次实验编写了一个语法分析方法的程序,但是在LL(1)分析器的编写中我只达到了最低要求,就是自己手动输入的select集,first集,follow集然后通过程序将预测分析表构造出来,然后自己编写总控程序根据分析表进行分析。 通过本次试验,我能够设计一个简单的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。 还能选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析

程序和LR分析分析程序。 三.源代码 package com.LL1; import java.util.ArrayDeque; import java.util.Deque; /** * LL1文法分析器,已经构建好预测分析表,采用Deque实现 * Created by HongWeiPC on 2017/5/12. */ public class LL1_Deque { //预测分析表 private String[][] analysisTable = new String[][]{ {"TE'", "", "", "TE'", "", ""}, {"", "+TE'", "", "", "ε", "ε"}, {"FT'", "", "", "FT'", "", ""}, {"", "ε", "*FT'", "", "ε", "ε"}, {"i", "", "", "(E)", "", ""} }; //终结符 private String[] VT = new String[]{"i", "+", "*", "(", ")", "#"}; //非终结符 private String[] VN = new String[]{"E", "E'", "T", "T'", "F"}; //输入串strToken private StringBuilder strToken = new StringBuilder("i*i+i"); //分析栈stack private Deque stack = new ArrayDeque<>(); //shuru1保存从输入串中读取的一个输入符号,当前符号 private String shuru1 = null; //X中保存stack栈顶符号 private String X = null; //flag标志预测分析是否成功 private boolean flag = true; //记录输入串中当前字符的位置 private int cur = 0; //记录步数 private int count = 0; public static void main(String[] args) { LL1_Deque ll1 = new LL1_Deque(); ll1.init(); ll1.totalControlProgram(); ll1.printf(); } //初始化 private void init() { strToken.append("#"); stack.push("#"); System.out.printf("%-8s %-18s %-17s %s\n", "步骤", "符号栈", "输入串", "所用产生式"); stack.push("E"); curCharacter(); System.out.printf("%-10d %-20s %-20s\n", count, stack.toString(), strToken.substring(cur, strToken.length())); } //读取当前栈顶符号 private void stackPeek() { X = stack.peekFirst(); } //返回输入串中当前位置的字母 private String curCharacter() { shuru1 = String.valueOf(strToken.charAt(cur)); return shuru1; } //判断X是否是终结符 private boolean XisVT() { for (int i = 0; i < (VT.length - 1); i++) { if (VT[i].equals(X)) {

编译原理实验报告5-语法分析程序的设计(2)

实验 5 语法分析程序的设计(2) 一、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中算法优先分析方法。 二、实验内容 设计一个文法的算法优先分析程序,判断特定表达式的正确性。 三、实验要求 1、给出文法如下: G[E] E->T|E+T; T->F|T*F; F->i|(E); 可以构造算符优先表如下: + * ( ) i + * ( ) i 2、计算机中表示上述优先关系,优先关系的机内存放方式有两种1)直接存 放, 2)为 优先关系建立优先函数,这里由学生自己选择一种方式; 1、给出算符优先分析算法如下: k:=1; S[k]:= ‘ #’; REPEAT 把下一个输入符号读进 a 中; IF S[k] ∈ V T THEN j:=k ELSE j:=k-1; WHILE S[j] a DO

BEGIN REPEAT Q:=S[j]; IF S[j-1] ∈ V T THEN j:=j-1 ELSE j:=j-2 UNT IL S[j] Q 把S[j+ 1] ? S[k]归约为 某个 N;

k:=j+1; S[k]:=N; END OF WHILE; IF S[j] a OR S[j] a THEN BEGIN k:=k+1;S[k]:=a END ELSE ERROR UNTIL a= ‘ #’ 1、根据给出算法,利用适当的数据结构实现算符优先分析程序; 2、利用算符优先分析程序完成下列功能: 1)手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束; 2)读入文本文件中的表达式; 3)调用实验 2 中的词法分析程序搜索单词; 4)把单词送入算法优先分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息; 5)完成上述功能,有余力的同学可以对正确的表达式计算出结果。 四、实验环境 PC 微机 DOS 操作系统或 Windo ws Turbo C 程序集成环境或 操作系 统 Visual C++ 程序集成环境 五、实验步骤 1、分析文法中终结符号的优先关系; 2、存放优先关系或构造优先函数; 3、利用算符优先分析的算法编写分析程序; 4、写测试程序,包括表达式的读入和结果的输出; 5、程序运行效果,测试数据可以参考下列给出的数据。 六、测试数据 输入数据: 编辑一个文本文文件expression.txt ,在文件中输入如下内容: 10; 1+2;

编译原理实验报告

编译原理实验报告 一、实验目的 编译原理是计算机科学中的重要课程,旨在让学生了解编译器 的基本工作原理以及相关技术。本次实验旨在通过设计和实现一 个简单的编译器,来进一步加深对编译原理的理解,并掌握实际 应用的能力。 二、实验环境 本次实验使用了Java编程语言及相关工具。在开始实验前,我 们需要安装Java JDK并配置好运行环境。 三、实验内容及步骤 1. 词法分析 词法分析是编译器的第一步,它将源代码分割成一系列词法单元。我们首先实现一个词法分析器,它能够将输入的源代码按照 语法规则进行切割,并识别出关键字、标识符、数字、运算符等。

2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。 3. 语义分析 语义分析是编译器的第三步,它对语法树进行检查和转换。我们主要进行类型检查、语法错误检查等。如果源代码存在语义错误,编译器应该能够提供相应的错误提示。 4. 代码生成 代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。在本次实验中,我们将目标代码生成为Java字节码。 5. 测试与优化

完成以上步骤后,我们需要对编译器进行测试,并进行优化。 通过多个测试用例的执行,我们可以验证编译器的正确性和性能。 四、实验心得 通过完成这个编译器的实验,我收获了很多。首先,我对编译 原理的知识有了更深入的理解。在实验过程中,我深入学习了词 法分析、语法分析、语义分析和代码生成等关键技术,对编译器 的工作原理有了更系统的了解。 其次,我提高了编程能力。实现一个完整的编译器需要处理复 杂的数据结构和算法,这对我的编程能力是一个很好的挑战。通 过实验,我学会了合理地组织代码,优化算法,并注意到细节对 程序性能的影响。 最后,我锻炼了解决问题的能力。在实验过程中,我遇到了很 多困难和挑战,但我不断地调试和改进代码,最终成功地实现了 编译器。这次实验使我明白了解决问题的关键在于坚持和勇于尝试。

编译原理实验三-自下而上语法分析报告及语义分析报告.docx

上海电力学院 编译原理 课程实验报告 实验名称:实验三自下而上语法分析及语义分析院系:计算机科学与技术学院 专业年级: 学生姓名:学号: 指导老师: 实验日期:

实验三自上而下的语法分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现:

●LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: (1)E->E+T (2)E->E-T (3)E->T (4)T->T*F (5)T->T/F (6)T->F (7)F->(E) (8)F->i

五、处理程序例和处理结果例 示例1:20133191*(20133191+3191)+ 3191#

六、源代码【cifa.h】 //cifa.h #include using namespace std; //单词结构定义 struct WordType{ int code;

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

编译原理语法分析实验报告 编译原理实验报告 二、语法分析 (一) 实验题目 编写程序,实现对词法分析程序所提供的单词序列进行语法检查和 结构分析。 (二) 实验内容和要求 1. 要求程序至少能分析的语言的内容有: 1) 变量说明语句 2) 赋值语句 3) 条件转移语句 4) 表达式(算术表达式和逻辑表达式) 5) 循环语句 6) 过程调用语句 2. 此外要处理:包括依据文法对句子进行分析;出错处理;输出结果的构造。 3. 输入输出的格式: 输入:单词文件(词法分析的结果) 输出:语法成分列表或语法树(都用文件表示),错误文件(对 于不合文法的句子)。 4. 实现方法:可以采用递归下降分析法,LL(1)分析法,算符优先法或LR分析法的任何一种,也可以针对不同的句子采用不同的分析方法。 (三) 实验分析与设计过程

1. 待分析的C语言子集的语法: 该语法为一个缩减了的C语言文法,估计是整个C语言所有文 法的60%(各种关键字的定义都和词法分析中的一样),具体的 文法如下: 语法: 100: program -> declaration_list 101: declaration_list -> declaration_list declaration | declaration 102: declaration -> var_declaration|fun_declaration 103: var_declaration -> type_specifier ID;|type_specifier ID[NUM]; 104: type_specifier -> int|void|float|char|long|double| 105: fun_declaration -> type_specifier ID (params)|compound_stmt 106: params -> params_list|void 107: param_list ->param_list,param|param 108: param -> type-spectifier ID|type_specifier ID[] 109: compound_stmt -> {local_declarations statement_list} 110: local_declarations -> local_declarations var_declaration|empty 111: statement_list -> statement_list statement|empty 11 编译原理实验报告 112: statement -> epresion_stmt|compound_stmt |selection_stmt|iteration_stmt|return_stmt 113: expression_stmt -> expression;|; 114: selection_stmt -> if{expression)statement |if(expression)statement else statement

编译原理实验二LL(1)语法分析实验报告

专题3_LL(1)语法分析设计原理与实现 李若森 13281132 计科1301 一、理论传授 语法分析的设计方法和实现原理;LL(1) 分析表的构造;LL(1)分析过程;LL(1)分析器的构造。 二、目标任务 实验项目 实现LL(1)分析中控制程序(表驱动程序);完成以下描述算术表达式的 LL(1)文法的LL(1)分析程序。 G[E]: E→TE’ E’→ATE’|ε T→FT’ T’→MFT’|ε F→(E)|i A→+|- M→*|/ 设计说明 终结符号i为用户定义的简单变量,即标识符的定义。加减乘除即运算符。 设计要求 (1)输入串应是词法分析的输出二元式序列,即某算术表达式“专题 1”的输出结果, 输出为输入串是否为该文法定义的算术表达式的判断结果; (2)LL(1)分析程序应能发现输入串出错; (3)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。 任务分析 重点解决LL(1)表的构造和LL(1)分析器的实现。

三、实现过程 实现LL(1)分析器 a)将#号放在输入串S的尾部 b)S中字符顺序入栈 c)反复执行c),任何时候按栈顶Xm和输入ai依据分析表,执行下述三个动作之一。 构造LL(1)分析表 构造LL(1)分析表需要得到文法G[E]的FIRST集和FOLLOW集。 构造FIRST(α) 构造FOLLOW(A)

构造LL(1)分析表算法 根据上述算法可得G[E]的LL(1)分析表,如表3-1所示: 表3-1 LL(1)分析表 主要数据结构 pair: 用pair来存储单个二元组。该对照表由专题1定义。 map: 存储离散化后的终结符和非终结符。 vector[][]: 存储LL(1)分析表 函数定义 init: void init(); 功能: 初始化LL(1)分析表,关键字及识别码对照表,离散化(非)终结符 传入参数: (无) 传出参数: (无) 返回值: (无)

广工编译原理实验报告

广工编译原理实验报告 广工编译原理实验报告 一、实验目的 编译原理是计算机科学与技术专业中非常重要的一门课程,通过该课程的学习,我们可以了解到编译器的基本原理和实现方法。本实验的目的是通过实践,加 深对编译原理的理解,掌握编译器的设计和实现过程。 二、实验环境 本次实验使用的是C语言作为编程语言,使用的编译器是GCC。实验使用的操 作系统是Linux。 三、实验内容 本次实验的主要内容是设计一个简单的编译器,实现对一个简单的语言的词法 分析和语法分析。该语言是一种类似于C语言的语言,具有变量声明、赋值语句、条件语句和循环语句等基本功能。 四、实验步骤 1. 词法分析 词法分析是编译器的第一步,它将输入的源代码分解成一个个的单词或符号。 在本次实验中,我们需要设计一些正则表达式来描述各种单词的模式,并使用 有限自动机来实现词法分析器。 2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的单词序列转化为一个语法树。在本次实验中,我们需要设计一些文法规则来描述语言的语法结构,并使用自 顶向下的递归下降分析法来实现语法分析器。

3. 语义分析 语义分析是编译器的第三步,它对语法树进行分析,检查语法的正确性,并生 成中间代码。在本次实验中,我们需要设计一些语义规则来检查语法的正确性,并使用符号表来存储变量和函数的信息。 4. 代码生成 代码生成是编译器的最后一步,它将中间代码转化为目标代码。在本次实验中,我们需要设计一些规则来将中间代码转化为汇编语言,并使用汇编器将汇编代 码转化为机器码。 五、实验结果 经过实验,我们成功地设计并实现了一个简单的编译器。该编译器可以正确地 将输入的源代码转化为目标代码,并且可以正确地执行目标代码。通过本次实验,我们加深了对编译原理的理解,掌握了编译器的设计和实现过程。 六、实验总结 编译原理是一门非常重要的课程,通过学习和实践,我们可以了解到编译器的 基本原理和实现方法。本次实验通过设计和实现一个简单的编译器,加深了对 编译原理的理解,提高了我们的实践能力。希望通过今后的学习和实践,能够 进一步提高自己的编译器设计和实现的能力。

编译原理——语法分析程序设计实验报告

实验二语法分析程序设计 [实验目的]: 1.了解语法分析的主要任务。 2.熟悉编译程序的编制。 [实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。 [实验要求]: 1.选择一个文法,进行实验,可选的文法包括以下三个: P190 4.8 P190 4.9 P190 4.10 2.设计语法分析程序的输出形式(输出应为语法树或推导),一个可以参考的 例子,可见图1。 3.编写递归下降语法分析程序(参考P148-149 Topdown parsing by recursive-descent),实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法句子。实验报告中要说明分析使用的方法。 4.根据所作业题选项e所给出的input,生成并输出分析过程中所用的产生式 序列(show the actions of parser): 1 产生式1 2 产生式2 …… 5.自已设计一个不合法的句子,作为输出进行分析,给出结果。 [实验过程] 本次实验选择的文法为P190 4.8 lexp->atom|list atom->number|identifier list->(lexp-seq) lexp-seq->lexp lexp-seq 1.写出实现的算法,并画流程图。 本次实验采用递归下降算法,算法流程图如下图1-1:

图1-1 算法流程图 2.根据你选择的文法,分析左递归或左因子是否会影响本算法的结果。 会影响本算法的结果。递归下降分析法要求的文法是LL(1)文法,需要消除左递归和左因子的影响。如果存在左因子,对相同的字符跳转到不同的函数,无法实现递归。 3.列举实验设计过程中出现的问题及解决的方法(至少3条,选择实验中最困 扰的问题)。 1).会多次输出accept/error结果 解决方案:所有的递归函数返回类型为int,若accept返回1,error返回0,在main主函数中统一判断输出语句。 2).生成推导式错误 解决方案:先定义两个字符串string d(保存整个推导式过程),e(保存单次的推导式)每次进行递归函数调用,进行e的更新和替换,再将执行 d+=”=>”+e语句,更新d字符串。 3).递归调用出错 解决方案:设置条件,再调用递归函数。 4.比较作业题和本次实验结果,分析递归下降和LL(1)算法的异同点。 相同点:都是针对LL(1)文法,都是从上而下分析进行语法分析。

编译原理实验报告5-语法分析程序的设计()

实验5语法分析程序的设计(2)一、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中算法优先分析方法。 二、实验内容 设计一个文法的算法优先分析程序,判断特定表达式的正确性。 三、实验要求 1、给出文法如下: G[E] E->T|E+T; T->F|T*F; F->i|(E); 2、计算机中表示上述优先关系,优先关系的机内存放方式有两种1)直接存放,2)为 优先关系建立优先函数,这里由学生自己选择一种方式; 1、给出算符优先分析算法如下: k:=1; S[k]:=‘#’; REPEAT 把下一个输入符号读进a中; IF S[k]∈V T THEN j:=k ELSE j:=k-1; WHILE S[j] a DO BEGIN REPEAT Q:=S[j]; IF S[j-1]∈V T THEN j:=j-1 ELSE j:=j-2 UNTIL S[j] Q 把S[j+1]…S[k]归约为某个N; k:=j+1;

S[k]:=N; END OF WHILE; IF S[j] a OR S[j] a THEN BEGIN k:=k+1;S[k]:=a END ELSE ERROR UNTIL a=‘#’ 1、 根据给出算法,利用适当的数据结构实现算符优先分析程序; 2、 利用算符优先分析程序完成下列功能: 1) 手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束; 2) 读入文本文件中的表达式; 3) 调用实验2中的词法分析程序搜索单词; 4) 把单词送入算法优先分析程序,判断表达式是否正确(是否是给出文法的语 言),若错误,应给出错误信息; 5) 完成上述功能,有余力的同学可以对正确的表达式计算出结果。 四、实验环境 PC 微机 DOS 操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、 分析文法中终结符号的优先关系; 2、 存放优先关系或构造优先函数; 3、利用算符优先分析的算法编写分析程序; 4、写测试程序,包括表达式的读入和结果的输出; 5、程序运行效果,测试数据可以参考下列给出的数据。 六、测试数据 输入数据: 编辑一个文本文文件expression.txt ,在文件中输入如下内容:

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

(完整)编译原理实验报告(词法分析器语法分析器) 编辑整理: 尊敬的读者朋友们: 这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)编译原理实验报告(词法分析器语法分析器))的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。 本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)编译原理实验报告(词法分析器语法分析器)的全部内容。

编 译 原 理 实 验 报 告 实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号

2,识别出并输出简单语言的基本字.标示符.无符号整数。运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1)主程序 (2)扫描子程序 3 五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用

来表示正在分析的字符.字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include 〈stdio.h〉 #include

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

实验报 实验名称 】 LL (1)语法分析 【实验目的】 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。 使了解语法分析的功能, 掌握语法分析程序设计的原理和构造方法, 训练掌握开发应用程序 的基本方法。 【 实验内容 】 根据某一文法编制调试 LL ( 1 )分析程序,以便对任意输入的符号串进行分析。 构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 分析法的功能是利用 LL (1)控制程序根据显示栈栈顶内容、向前看符号以及 LL (1) 分析表,对输入符号串自上而下的分析过程。 【设计思想】 (1) 、LL (1)文法的定义 LL(1) 分析法属于确定的自顶向下分析方法。 LL(1) 的含义是: 第一个 L 表明自顶向下分 析是从左向右扫描输入串,第 2个 L 表明分析过程中将使用最左推导, 1表明只需向右看一 个符号便可决定如何推导,即选择哪个产生式 ( 规则) 进行推导。 LL(1) 文法的判别需要依次计算 FIRST 集、FOLLOW 集和 SELLECT 集, 然后判断是否为 LL(1) 文法 ,最后再进行句子分析。 需要预测分析器对所给句型进行识别。即在 LL(1) 分析法中,每当在符号栈的栈顶出现 非终极符时, 要预测用哪个产生式的右部去替换该非终极符; 当出现终结符时, 判断其与剩 余输入串的第一个字符是否匹配,如果匹配,则继续分析,否则报错。 LL(1) 分析方法要求 文法满足如下条件: 对于任一非终极符 A 的两个不同产生式 A ,A ,都要满足下面条件: SELECT(A ) ∩SELECT(A )= 学号 20102798 实验日期 2013.04.08 专业 软件工程 教师签字 姓名 薛建东 成绩

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

编译原理语法分析实验报告 编译原理语法分析实验报告 引言 编译原理是计算机科学中的重要课程,它研究的是如何将高级语言转化为机器 语言的过程。语法分析是编译过程中的一个关键步骤,它负责将输入的源代码 转化为抽象语法树,为后续的语义分析和代码生成提供便利。本实验旨在通过 实践,加深对语法分析的理解,并掌握常见的语法分析算法。 实验环境 本次实验使用的是Python编程语言,因为Python具有简洁的语法和强大的库 支持,非常适合用于编译原理的实验。 实验步骤 1. 词法分析 在进行语法分析之前,需要先进行词法分析,将源代码划分为一个个的词法单元。词法分析器的实现可以使用正则表达式或有限自动机等方式。在本实验中,我们选择使用正则表达式来进行词法分析。 2. 文法定义 在进行语法分析之前,需要先定义源代码的文法。文法是一种形式化的表示, 它描述了源代码中各个语法成分之间的关系。常见的文法表示方法有巴科斯范 式(BNF)和扩展巴科斯范式(EBNF)。在本实验中,我们选择使用BNF来表 示文法。 3. 自顶向下语法分析 自顶向下语法分析是一种基于产生式的语法分析方法,它从文法的起始符号开

始,逐步展开产生式,直到生成目标字符串。自顶向下语法分析的关键是选择合适的产生式进行展开。在本实验中,我们选择使用递归下降分析法进行自顶向下语法分析。 4. 自底向上语法分析 自底向上语法分析是一种基于移进-归约的语法分析方法,它从输入串的左端开始,逐步将输入符号移入分析栈,并根据产生式进行归约。自底向上语法分析的关键是选择合适的归约规则。在本实验中,我们选择使用LR(1)分析法进行自底向上语法分析。 实验结果 经过实验,我们成功实现了自顶向下和自底向上两种语法分析算法,并对比了它们的优缺点。 自顶向下语法分析的优点是易于理解和实现,可以直接根据产生式进行展开,但缺点是对左递归和回溯的处理比较困难,而且效率较低。 自底向上语法分析的优点是可以处理任意文法,对左递归和回溯的处理较为方便,而且效率较高,但缺点是实现相对复杂,需要构建分析表和使用分析栈。结论 通过本次实验,我们深入理解了编译原理中的语法分析过程,并掌握了自顶向下和自底向上两种常见的语法分析算法。语法分析是编译过程中的重要环节,它为后续的语义分析和代码生成提供了基础。掌握语法分析算法对于编译原理的学习和实践具有重要意义。

语法分析实验报告(实验二)

编译原理语法分析实验报告 软工082班 兰洁 200831104044 一、实验内容 二、实验目的 三、实验要求 四、程序流程图 ●主函数; ●scanner(); ●irparser()函数 ●yucu() /*语句串分析*/ ●statement()/*语句分析函数*/ ●expression()/*表达式分析函数*/ ●term()/*项分析函数*/ ●factor()/*因子分析函数*/ 五、程序代码 六、测试用例 七、输出结果 八、实验心得

一、实验内容: 编写为一上下文无关文法构造其递归下降语法分析程序,并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行递归下降语法分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。 二、实验目的: 构造文法的语法分析程序,要求采用递归下降语法分析方法对输入的字符串进行语法分析,实现对词法分析程序所提供的单词序列的语法检查和结构分析,进一步掌握递归下降的语法分析方法。 三、实验要求: 利用C语言编制递归下降分析程序,并对Training语言进行语法分析。 1.待分析的Training语言语法。 用扩充的表示如下: <程序>-->function<语句串>endfunc <语句串>--><语句>{;<语句>} <语句>→<赋值语句> <赋值语句>→ID→<表达式> <表达式>→<项>{+<项>|-<项>} <项>→<因子>{*<因子>|/<因子>} <因子>→ID|NUM|(<表达式>) 备注:实验当中我对程序进行了扩展,增加了程序识别if条件判断语句,while循环语句的功能 2.实验要求说明 输入单词串以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。 四、程序流程图 主函数:

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

编译原理实验报告 一.LL(1)文法分析 1.设计要求 (1)对输入文法,它能判断是否为LL(1)文法,若是,则转(2);否则报错并终止; (2)输入已知文法,由程序自动生成它的LL(1)分析表; (3)对于给定的输入串,应能判断识别该串是否为给定文法的句型。 2.分析 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由总控算法判断输入符号串是否为该文法的句型。 3.流程图 开始 读入文法 有效? 是 是LL(1)文法? 是 判断句型报错 结束

4.源程序 /******************************************* 语法分析程序 作者:xxx 学号:xxx ********************************************/ #include #include #include /*******************************************/ int count=0; /*分解的产生式的个数*/ int number; /*所有终结符和非终结符的总数*/ char start; /*开始符号*/ char termin[50]; /*终结符号*/ char non_ter[50]; /*非终结符号*/ char v[50]; /*所有符号*/ char left[50]; /*左部*/ char right[50][50]; /*右部*/ char first[50][50],follow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/ char first1[50][50]; /*所有单个符号的FIRST集合*/ char select[50][50]; /*各单个产生式的SELECT集合*/ char f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/ char empty[20]; /*记录可直接推出^的符号*/ char TEMP[50]; /*求FOLLOW时存放某一符号串的FIRST集合*/ int validity=1; /*表示输入文法是否有效*/ int ll=1; /*表示输入文法是否为LL(1)文法*/ int M[20][20]; /*分析表*/ char choose; /*用户输入时使用*/ char empt[20]; /*求_emp()时使用*/ char fo[20]; /*求FOLLOW集合时使用*/ /******************************************* 判断一个字符是否在指定字符串中 ********************************************/ int in(char c,char *p) { int i; if(strlen(p)==0)

相关主题
文本预览
相关文档 最新文档