编译原理实验 (词法语法分析报告 附源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告
******************************************************************************* ******************************************************************************* PL0语言功能简单、结构清晰、可读性强,而又具备了一般高级程序设计语言的必须部分,因而PL0语言的编译程序能充分体现一个高级语言编译程序实现的基本方法和技术。PL/0语言文法的EBNF表示如下:
<程序>::=<分程序>.
<分程序> ::=[<常量说明>][<变量说明>][<过程说明>]<语句>
<常量说明> ::=CONST<常量定义>{,<常量定义>};
<常量定义> ::=<标识符>=<无符号整数>
<无符号整数> ::= <数字>{<数字>}
<变量说明> ::=VAR <标识符>{, <标识符>};
<标识符> ::=<字母>{<字母>|<数字>}
<过程说明> ::=<过程首部><分程序>{; <过程说明> };
<过程首部> ::=PROCEDURE <标识符>;
<语句> ::=<赋值语句>|<条件语句>|<当循环语句>|<过程调用语句>
|<复合语句>|<读语句><写语句>|<空>
<赋值语句> ::=<标识符>:=<表达式>
<复合语句> ::=BEGIN <语句> {;<语句> }END
<条件语句> ::= <表达式> <关系运算符> <表达式> |ODD<表达式>
<表达式> ::= [+|-]<项>{<加法运算符> <项>}
<项> ::= <因子>{<乘法运算符> <因子>}
<因子> ::= <标识符>|<无符号整数>| ‘(’<表达式>‘)’
<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<关系运算符> ::= =|#|<|<=|>|>=
<条件语句> ::= IF <条件> THEN <语句>
<过程调用语句> ::= CALL 标识符
<当循环语句> ::= WHILE <条件> DO <语句>
<读语句> ::= READ‘(’<标识符>{,<标识符>}‘)’
<写语句> ::= WRITE‘(’<表达式>{,<表达式>}‘)’
<字母> ::= a|b|…|X|Y|Z
<数字> ::= 0|1|…|8|9
【预处理】
对于一个pl0文法首先应该进行一定的预处理,提取左公因式,消除左递归(直接或间接),接着就可以根据所得的文法进行编写代码。
【实验一】词法分析
【实验目的】给出PL/0文法规,要求编写PL/0语言的词法分析程序。
【实验容】已给PL/0语言文法,输出单词(关键字、专用符号以及其它标记)。
【实验要求】
1.确定编译中使用的表格、标识符与关键字的区分方法等。
2.把词法分析器设计成一个独立一遍的过程。
3.词法分析器的输出形式采用二元式序列,例如:
(ident, a)
(plus, + )
(number, 15)
(times, * )
(ident, b )
【输入输出】
输入:
PL/0源程序。例: a+15*b
输出:
(ident, a)
(plus, + )
(number, 15)
(times, * )
(ident, b )
【实验结果】
实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,到达句柄时,则采取LL(1)文法进行规约。
实验结果如下:
实验结果用文本来进行输入输出,所以在工程目录下还会有一个文本输入,输出文件。分别为in.txt out.txt
【实验体会】
在编写这段代码的过程中,比较麻烦得还是之前的语法预处理阶段,将不满足ll(1)文法的语法转化为标准的ll(1)文法。程序在处理词法分析的过程就是不断通过getsym()这个函数来条用getch(),不断形成一个一个的词汇,供下面语法分析时使用。记录词汇类型的sym是一个枚举类型。使用起来会方便许多,比较系统。其中还用到了文本输入输出的技巧,把读出的词汇保存起来。词法分析还是比较简单,在编写代码的时候没有太大的阻碍。
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关容,加深了对C++语言的用途的理解。
【实验二】语法分析
【实验目的】给出PL/0文法规,要求编写PL/0语言的语法分析程序。
【实验容】已给PL/0语言文法,构造表达式部分的语法分析器。
【实验要求】
1.将实验一“词法分析”的输出结果,作为表达式语法分析器的输入,进行
语法解析,对于语确的表达式,报告“语确”;对于语法错误的表达式,报告“语法错误”,指出错误原因。
2.把语法分析器设计成一个独立一遍的过程。
3.语法分析器的编写方法采用递归子程序法。
【输入输出】
输入:
PL/0表达式,用实验一的输出形式作为输入。例如: 对于PL/0表达式,a+15*b用下列形式作为输入:
(ident, a)
(plus, + )
(number, 15)
(times, * )
(ident, b )
输出:
对于语确的表达式,报告“语确”;
对于语法错误的表达式,报告“语法错误”,指出错误原因。
【实验结果】
实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,对输入的一个语句进行判断,判断语法的正误,采用对算法的判断,若全为数字则进行最后的计算