中南大学《编译原理》上机实习课程实验报告

编译原理课程实验上机实习

中南大学计算机0706班方文一、目的

加强学生对编译过程的整体认识,而不是个别阶段的实习。

二、实习要求

扩充语句部分:for语句、repeat语句、case语句;

三、PL语言及其编译程序

1.词法分析

2.语法分析

3.语义分析及中间代码生成

4.汇编代码生成

四、扩充

1.扩充repeat语句

扩充文法

<循环语句>::=”repeat”<语句>”until”<表达式>

扩充函数:详见文件夹Assignment

运行示例:

示例代码:

program pp;

var n,p:integer;

procedure p2(n:integer);

begin

repeat

begin

call write(n);

n:=n-1

end

until n=0

end;

begin

call p2(5)

end.

生成中间代码:

0 JMP 0 , 15 ------> 无条件跳转

1 JMP 0 ,

2 ------> 无条件跳转

2 ENTP 2 , 4 ------> 进入过程

3 LOD 2 , 3 ------> 装入变量值

4 WRITE 0 , 0 ------> 写指令

5 LODA 2 , 3 ------> 装入变量地址

6 LOD 2 , 3 ------> 装入变量值

7 LIT 0 , 1 ------> 装入常量

8 SUB 0 , 0 ------> 减

9 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元

10 LOD 2 , 3 ------> 装入变量值

11 LIT 0 , 0 ------> 装入常量

12 EQ 0 , 0 ------> ==

13 JPC 0 , 3 ------> 栈顶值为0时跳转

14 RETP 0 , 0 ------> 过程返回

15 ENTP 1 , 4 ------> 进入过程

16 OPAC 0 , 0 ------> 打开活动记录

17 LIT 0 , 5 ------> 装入常量

18 CALL 1 , 2 ------> 转子

19 ENDP 0 , 0 ------> 程序结束

解释运行结果:

Your Output:5

Your Output:4

Your Output:3

Your Output:2

Your Output:1

2.扩充for语句

扩充文法

<循环语句>::=“for”“(”<赋值语句> “;”<表达式> “;”<语句> “)”

扩充函数详见文件夹Assignment

运行示例

示例代码:

program pp;

var n,p:integer;

procedure p1(n:integer;var p:integer);

begin

for(p:=1;p<=5;p:=p+1)

begin

call write(p);

end

end;

begin

call read(n);

call p1(n,p);

call read(n);

end.

生成中间代码:

0 JMP 0 , 19 ------> 无条件跳转

1 JMP 0 ,

2 ------> 无条件跳转

2 ENTP 2 , 5 ------> 进入过程

3 LOD 2 ,

4 ------> 装入变量值

4 LIT 0 , 1 ------> 装入常量

5 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元

6 ILOD 2 , 4 ------> 间接装入

7 LIT 0 , 5 ------> 装入常量

8 LEQ 0 , 0 ------> <=

9 JPC 0 , 18 ------> 栈顶值为0时跳转

10 LOD 2 , 4 ------> 装入变量值

11 ILOD 2 , 4 ------> 间接装入

12 LIT 0 , 1 ------> 装入常量

13 ADD 0 , 0 ------> 加

14 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元

15 ILOD 2 , 4 ------> 间接装入

16 WRITE 0 , 0 ------> 写指令

17 JMP 0 , 6 ------> 无条件跳转

18 RETP 0 , 0 ------> 过程返回

19 ENTP 1 , 5 ------> 进入过程

20 LODA 1 , 3 ------> 装入变量地址

21 READ 0 , 0 ------> 读指令

22 OPAC 0 , 0 ------> 打开活动记录

23 LOD 1 , 3 ------> 装入变量值

24 LODA 1 , 4 ------> 装入变量地址

25 CALL 1 , 2 ------> 转子

26 LODA 1 , 3 ------> 装入变量地址

27 READ 0 , 0 ------> 读指令

28 ENDP 0 , 0 ------> 程序结束

解释运行结果:

29翻译开始

Your Output:2

Your Output:3

Your Output:4

Your Output:5

Your Output:6

翻译结束。

3.扩充case语句

文法扩充

<判断语句>::= “case” <表达式> “of”

<表达式> “:”<语句> “;”

{<表达式>”:”<语句>”;”}

“end”

case E of

C1: ;

C2: ;

C3: S3;

......

C n: S n

end

代码结构

T:=E;

L1: if T!= C1 goto L2

S1的代码

goto next

L2: if E!= C2 goto L3

S2的代码

goto next

......

Ln: Sn的代码

next:

运行示例

示例代码:

program pp;

var n,p:integer;

procedure p1(n:integer;var p:integer); begin

call read(p);

case p of

1:

begin

call write(1);

end

2:

begin

call write(2);

end

end

end;

begin

call read(n);

call p1(n,p);

call read(p)

end.

生成中间代码:

0 JMP 0 , 20 ------> 无条件跳转

1 JMP 0 ,

2 ------> 无条件跳转

2 ENTP 2 , 5 ------> 进入过程

3 LOD 2 ,

4 ------> 装入变量值

4 READ 0 , 0 ------> 读指令

5 ILOD 2 , 4 ------> 间接装入

6 LIT 0 , 1 ------> 装入常量

7 EQ 0 , 0 ------> ==

8 JPC 0 , 12 ------> 栈顶值为0时跳转

9 LIT 0 , 1 ------> 装入常量

10 WRITE 0 , 0 ------> 写指令

11 JMP 0 , 19 ------> 无条件跳转

12 ILOD 2 , 4 ------> 间接装入

13 LIT 0 , 2 ------> 装入常量

14 EQ 0 , 0 ------> ==

15 JPC 0 , 19 ------> 栈顶值为0时跳转

16 LIT 0 , 2 ------> 装入常量

17 WRITE 0 , 0 ------> 写指令

18 JMP 0 , 19 ------> 无条件跳转

19 RETP 0 , 0 ------> 过程返回

20 ENTP 1 , 5 ------> 进入过程

21 LODA 1 , 3 ------> 装入变量地址

22 READ 0 , 0 ------> 读指令

23 OPAC 0 , 0 ------> 打开活动记录

24 LOD 1 , 3 ------> 装入变量值

25 LODA 1 , 4 ------> 装入变量地址

26 CALL 1 , 2 ------> 转子

27 LODA 1 , 4 ------> 装入变量地址

28 READ 0 , 0 ------> 读指令

29 ENDP 0 , 0 ------> 程序结束

运行结果:

30翻译开始

case1:

Your Input:1

Your Input:1

Your Output:1

翻译结束。

Case2:

Your Input:1

Your Input:2

Your Output:2

翻译结束。

五、感受

通过这次上机实习,我对编译原理这门课又有了新的认识,课上所学的知识大部分都是很理论、很抽象的,如果不自己亲手实践一下,对一些知识点还是不能很好的理解。

首先,看懂老师所给的源程序是十分场重要的,当然,这也是一个很痛苦的过程,需要花费大量的时间,而且还很可能理解得不正确(开始我对怎样回填就没弄懂)。把源程序弄懂后,编程的任务量要相对小一些(case可能难一些),这之后的调试也是比较困难的,可能自己看自己的程序可能怎么检查都没有错(特别是在逻辑方面),所以最好是请其他一些同学一起调试。

最后,在此感谢老师给了我们一次动手实践的机会,这项活动是非常有意义的。

编译原理实验报告

**大学 编译原理实验报告 报告 学生姓名*** 学号*** 专业班级*** 指导教师*** 学院**** 完成时间*年*月

目录 一.实验目的 (3) 二.实验内容 (3) 三.实验要求 (3) 四.程序运行截图 (4) 五.关键程序清单 (7) 六.心得体会 (21) 七.参考文献 (21)

一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证。通过实验,使学生掌握词法分析的实现技术,深入了解语法分析的实现技术及具体实现方法。将《编译原理》的相关理论运用到软件开发中,提高学生的应用程序设计能力,提高分析问题、解决问题的能力。锻炼学生的编程能力和逻辑思维能力,体会计算机编译器的奥妙之处。 二.实验内容 1.状态转换图 2.DFA扫描 3.First集,follow集计算 三.实验要求 实验一:状态转换图 输入一串数据,利用状态转换图程序求出“关键字,标识符,整数,运算符,实数”。实验二:DFA扫描 打开一个编写好的源代码,利用DFA扫描程序删除多行注释,单行注释,多余的行,多余的空格。 实验三:first集,follow集计算 输入一个不含左递归的文法,由此程序求出该文法的first集和follow集。

四.程序运行截图 实验一:状态转换图: 得到“关键字,标识符,整数,运算符,实数” 实验二:DFA扫描 (1)打开源代码1.txt,删除了注释及多余的空格

(2)源代码里存在注释错误 (3)硬盘里不存在2.txt文件,提示错误实验三:first集,follow集计算

编译原理实验报告

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

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

编译原理实验报告材料5-语法分析报告程序地设计2

实验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,在文件中输入如下内容:

编译原理实验报告

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

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

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

中南大学《编译原理》上机实习课程实验报告

编译原理课程实验上机实习 中南大学计算机0706班方文一、目的 加强学生对编译过程的整体认识,而不是个别阶段的实习。 二、实习要求 扩充语句部分:for语句、repeat语句、case语句; 三、PL语言及其编译程序 1.词法分析 2.语法分析 3.语义分析及中间代码生成 4.汇编代码生成 四、扩充 1.扩充repeat语句 扩充文法 <循环语句>::=”repeat”<语句>”until”<表达式> 扩充函数:详见文件夹Assignment 运行示例: 示例代码: program pp; var n,p:integer; procedure p2(n:integer); begin repeat begin call write(n); n:=n-1 end until n=0 end; begin call p2(5) end. 生成中间代码: 0 JMP 0 , 15 ------> 无条件跳转 1 JMP 0 , 2 ------> 无条件跳转 2 ENTP 2 , 4 ------> 进入过程 3 LOD 2 , 3 ------> 装入变量值

4 WRITE 0 , 0 ------> 写指令 5 LODA 2 , 3 ------> 装入变量地址 6 LOD 2 , 3 ------> 装入变量值 7 LIT 0 , 1 ------> 装入常量 8 SUB 0 , 0 ------> 减 9 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元 10 LOD 2 , 3 ------> 装入变量值 11 LIT 0 , 0 ------> 装入常量 12 EQ 0 , 0 ------> == 13 JPC 0 , 3 ------> 栈顶值为0时跳转 14 RETP 0 , 0 ------> 过程返回 15 ENTP 1 , 4 ------> 进入过程 16 OPAC 0 , 0 ------> 打开活动记录 17 LIT 0 , 5 ------> 装入常量 18 CALL 1 , 2 ------> 转子 19 ENDP 0 , 0 ------> 程序结束 解释运行结果: Your Output:5 Your Output:4 Your Output:3 Your Output:2 Your Output:1 2.扩充for语句 扩充文法 <循环语句>::=“for”“(”<赋值语句> “;”<表达式> “;”<语句> “)” 扩充函数详见文件夹Assignment 运行示例 示例代码: program pp; var n,p:integer; procedure p1(n:integer;var p:integer); begin for(p:=1;p<=5;p:=p+1) begin call write(p); end end; begin call read(n); call p1(n,p); call read(n);

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

编译原理语义分析实验报告 编译原理语义分析实验报告 引言 编译原理是计算机科学的重要基础课程之一,它主要研究如何将高级语言转换 为低级语言,使计算机能够理解和执行人类可读的代码。语义分析是编译过程 中的重要环节,它负责对代码进行语义检查和语义解释,以确保代码的正确性 和可执行性。本实验报告旨在介绍编译原理中语义分析的基本原理和实验过程。 一、实验目的 本次实验的主要目的是通过实现一个简单的语义分析器,加深对编译原理中语 义分析的理解。具体来说,我们将实现以下功能: 1. 识别并解析变量声明和赋值语句; 2. 检查变量的重复声明和赋值类型的一致性; 3. 计算并输出表达式的值。 二、实验环境和工具 为了完成本次实验,我们需要准备以下环境和工具: 1. 操作系统:Windows、Linux或MacOS; 2. 编程语言:C++、Java或Python; 3. 开发工具:编译器和调试器。 三、实验原理 语义分析是编译过程中的重要环节,它主要负责对代码进行语义检查和语义解释。在编译器中,语义分析器通常通过构建抽象语法树(AST)来实现。AST是一种树状的数据结构,用于表示代码的语法结构和语义信息。

在语义分析的过程中,我们需要进行变量声明和赋值语句的解析和检查。首先,我们需要识别代码中的变量声明和赋值语句,并将其转换成AST。在解析过程中,我们需要检查变量的重复声明和赋值类型的一致性。如果发现错误,我们 需要报告相应的错误信息,并终止编译过程。 接下来,我们需要对表达式进行求值。表达式是编程语言中的核心概念,它由 操作数和运算符组成。在求值过程中,我们需要考虑运算符的优先级和结合性。为了实现这一功能,我们可以使用递归下降法或者使用运算符优先级算法。 四、实验过程 1. 识别变量声明和赋值语句 我们首先需要编写词法分析器,将代码中的字符序列转换成标记序列。在词法 分析的过程中,我们需要识别变量声明和赋值语句的关键字和标识符,并将其 转换成相应的标记。 2. 构建抽象语法树 在词法分析的基础上,我们可以构建抽象语法树。抽象语法树是一种树状的数 据结构,用于表示代码的语法结构和语义信息。在构建AST的过程中,我们可 以使用递归下降法或者使用语法制导翻译来实现。 3. 检查变量的重复声明和赋值类型的一致性 在构建AST的同时,我们可以检查变量的重复声明和赋值类型的一致性。如果 发现错误,我们需要报告相应的错误信息,并终止编译过程。 4. 计算表达式的值 在构建AST的基础上,我们可以计算表达式的值。为了实现这一功能,我们可 以使用递归下降法或者使用运算符优先级算法。在计算过程中,我们需要考虑

编译原理实验报告

编译方法实验报告

实验1:扫描器的设计 一、实验目的 熟悉并实现一个扫描器(词法分析程序)。 二、实验要求 (1) 设计扫描器的有限自动机(识别器); (2) 设计翻译、生成Token的算法(翻译器); (3) 编写代码并上机调试运行通过。 ·输入——源程序文件或源程序字符串; ·输出——相应的Token序列; 关键字表和界符表; 符号表和常数表; 三、实验步骤 流程: 初始化; 打开用户源程序文件; while (文件未结束) { 读入一行到w[i],i=0; do //处理一行,每次处理一个单词 { 滤空格,直到第一个非空的w[i]; i--; s=1; //处理一个单词开始 while (s!=0)//拼单词并生成相应Token { act(s); //执行q s if (s>=11 && s<=14)//一个单词处理结束 break; i++; //getchar() s=find(s, w[i]); } if (s==0) 词法错误; }while (w[i]!=换行符); } 关闭用户源程序文件; 生成Token文件; 输出关键字表; 输出Token序列; 输出符号表; 输出常数表;

有限自动机的状态转换图: 其中:d为数字,l为字母,b为界符,-1代表其它符号(如在状态8处遇到了非字母或数字的其它符号,会变换到状态12)。 关键字表和界符表: 四、主要数据结构 ①状态转换矩阵:int aut[10][7]={ 2, 0, 0, 0, 8, 9, 15, 2, 3, 5,11, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0,

《编译原理》课程实习报告

编号: 《编译原理》课程 实习报告 编号: 3 实习题目:语法分析器 专业(班):计科六班 学生学号:2011301500204 学生姓名:何子龙 任课教师:杜卓敏

1.问题定义与分析 1.1 实习目的 构造一个小语言的语法分析程序。 1.2 实习要求 ((1)输入属性字文件,输出源程序是否符合语法要求的结果:正确——该程序符合语法要求。 错误——指出错误位置。 (2)运行实例: 例 1:输入 i:=1+; 输出表达式错误。 例2:输入 program ex1;begin i:=1 end. 输出该程序是正确的。 1.3 要求分析 1.3.1 输入部分 输入为文法源程序,定义CString类型变量m_EnterString ,用于获取编辑框1的输入,将其转换为char类型的数组,用s 保存,即char *s=m_EnterString.GetBuffer() 。 1.3.2 输出部分 对于错误的程序,输出相应错误类型;对于正确的程序,输出该程序是正确的。定义CString类型变量m_OutputString ,用于输出词法分析结果到编辑框2,用如下函数给m_OutputString 添加输出内容,如程序正确时代码:

m_OutputString.Insert(m_OutputString.GetLength(),"该程序是正确的"); 如图所示: 1.3.3 待分析的简单语言的语法 用扩充的BNF表示如下: ⑴<程序>::=program begin<语句串>end|begin<语句串>end ⑵<语句串>::=<语句>{;<语句>} ⑶<语句>::=<赋值语句> ⑷<赋值语句>::=ID:=<表达式> ⑸<表达式>::=<项>{+<项> | -<项>} ⑹<项>::=<因子>{*<因子> | /<因子> ⑺<因子>::=ID | NUM | (<表达式>)

编译实习报告

篇一:编译原理实习报告 实习报告 【实习目的】 1.了解编译器的工作原理 2.掌握并加深本学期所学的编译原理的理论知识 3.加强自己的动手能力 【实习内容】 1.编译并运行老师所给的编译器参考代码 2.在第一步的基础上进一步改进编译器,增加输入输出功能 【开发平台】 window系统,free pascal编译器 【实习过程】 本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分, 进一步改进编译器。本人在上面的基础上又增加了第三部分的额外修改。下面便总结这三部分的实习过程: 一、增加读写语句前pl0编译程序 由于最原始的pl0编译程序所用的pascal版本较老,有些和当前使用版本不兼容, 必须作相应修改,具体是:“object”和“procedure”为pascal的保留字,现分别改成“obj”和“proc”。此外,原始程序中的“≠”、“≤”和“≥”,不能用ascii码表示出来,现将其替换成“<>”、“<=”和“>=”。 作为一个编译程序,支持批量处理和永久保存是其应具备的基本功能。为此,本程序加 入了文件读写功能,即从文件读入pl0源程序,在将中间代码和运行结果写入文件。 由于源程序和原始差别很小,为节省篇幅,不将其打印出来。 二、增加读写语句前pl0调试程序 下面是增加读写语句前的pl0程序,包含了乘、除法和寻找两个自然数的最大公因数 的过程和主过程,很好的说明了增加读写语句前的pl0语言的使用方法。 const var x,y,z,q,r; procedure multiply; var a,b; a:=x; begin m=7,n=85; procedure divide; var end; b:=y; z:=0; while b>0 do begin end if odd b then z:=z+a; a:=2*a; b:=b/2;w; begin r:=x; q:=0; w:=y; while w<=r do w:=2*w; while w>y do begin q:=2*q; w:=w/2; if w<=r then begin r:=r-w; q:=q+1 end end

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

实验二语法分析实验报告 一、实验内容 1.1 实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析. 1.2 实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析 1.2.1待分析的简单语言的词法 用扩充的BNF表示如下: (1) <程序>::={<声明序列><语句序列>} (2)<语句串>::=<语句>{;<语句>} (3) <语句>::=<赋值语句> (4) <赋值语句>::=ID:= <表达式> (5) <表达式>::=<项>{(+<项>|-<项>} (6) <项>::=<因子>{*<因子>|/<因子>} (7) <因子>::=ID|NUM|(<算术表达式>) 1.2.2实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。 二、实验程序的总体结构框架 图1. 语法分析主程序示意图

图2.递归下降分析程序示意图

图5. expression表达式分析函数示意图图6.term分析函数示意图

三、关键技术的实现方法 Scanner函数定义已在实验一给出,本实验不再重复给出 void Irparser() { kk=0; if(syn==1) { scaner(); yucu(); if(syn==6) { scaner(); if(syn==0 && (kk==0)) cout<<"success!"<

编译原理实验报告-词法分析程序的设计

实验2 词法分析程序的设计 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验内容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数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)* 运算符和界符+ - * / > < = ( ) ; 关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、根据正规式,画出状态转换图;

编译原理实验报告1

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

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

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:*********** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

编译原理-实验报告3-LL1

计算机硬件实验室实验报告 根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。二、实验要求: 对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (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)LL(1)分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串 (3)输出过程如下: 步骤分析栈剩余输入串所用产生式 1 E i+i*i# E->TG (4)输入符号串为非法符号串(或者为合法符号串) 备注: (1)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。 (2) 在此位置输入符号串为用户自行输入的符号串。 (3)上述描述的输出过程只是其中一部分的。 注意: 1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#; 2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 三、实验过程: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 3.程序编写 (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式

计算机编译原理实验报告

编译原理实验报告 实验一词法分析设计 一、实验功能: 1、对输入的txt文件内的内容进行词法分析: 2、由文件流输入test.txt中的内容,对文件中的各类字符进行词法分析 3、打印出分析后的结果; 二、程序结构描述:(源代码见附录)

1、分别利用k[],s1[],s2[],s3[]构造关键字表,分界符表,算术运算符表和关系运算符表。 2、bool isletter(){} 用来判断其是否为字母,是则返回true,否则返回false; bool isdigit(){} 用来判断其是否为数字,是则返回true,否则返回false; bool iscalcu(){} 用来判断是否为算术运算符,是则返回true,否则返回false; bool reserve(string a[]){} 用来判断某字符是否在上述四个表中,是则返回true,否则返回false; void concat(){} 用来连接字符串; void getn(){} 用来读取字符; void getb(){} 用来对空格进行处理; void retract(){}某些必要的退格处理; int analysis(){} 对一个单词的单词种别进行具体判断; 在主函数中用switch决定输出。 三、实验结果

四、实验总结 词法分析器一眼看上去很复杂,但深入的去做就会发现并没有一开始想象的那么困难。对于一个字符的种别和类型可以用bool函数来判断,对于关键字和标示符的识别(尤其是3b)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好时候退格,否则将会导致字符漏读甚至造成字符重复读取。 我认为,这个实验在程序实现上大体不算困难,但在细节的处理上则需要好好地下功夫去想,否则最后的程序很可能会出现看上去没有问题,但实际上漏洞百出的状况。 将学过的知识应用到实际中并不简单,只有自己不断尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。 实验二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《词法分析程序设计与实现》实验学时: 4 实验地点:二综实验日期: 一、实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析 二、实验内容 自定义一种程序设计语言,或者选择已有的一种高级语言,编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程语言和编程工具。 从输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、界符。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 三、实验方法 用java或者C语言写出分析器 四、实验步骤 1.定义目标语言的可用符号表和构词规则; 2.依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结 束; 3.对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中;对不正确的单词,做出错误处理 五、实验结果 定义种别码 final int NONE = 0; final int DELIMITER = 1; // 操作符运算符 final int VAR = 2; // 字符变量 final int Num = 3; // 数字 final int COMMAND = 4; // 关键字 // final int QUOTEDSTR=5; //带引号的字符串 // 程序终结符end of program final String EOP = "#"; // 声明关键字 final int unKnowKeyword = 0; final int FI = 1; final int IF = 2; final int THEN = 3;

中南大学 编译原理实验报告

CENTRAL SOUTH UNIVERSITY 编译原理实验报告 学生姓名 专业班级 学号 学院信息科学与工程学院 指导教师张修如 实验时间 2015年5月

实验一计算FIRSTVT集 一、实验目的 进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识,熟悉使用开发工具VC /JA V A/C#/.NET 。 二、实验内容 设计一个由正规文法生成FIRSTVT集的算法动态模拟,实现以下功能: 1.输入一个文法G; 2.输出由文法G构造FIRSTVT集的算法; 3.输出FIRSTVT集。 三、实验要求 1.思想的正确性,采用合适的数据存储结构等; 2.程序实现的正确性,程序整体结构合理、编程风格规范等; 3.程序功能的完善程度,包括功能的基本实现、基本完善、完全实现; 4.工作认真、独立完成实验。 四、实验步骤 1.问题理解和分析:充分地分析和理解问题本身,弄清要求做什么; 2.确定解决问题的方法:主要是找到解决问题的主要思路,该怎么做; 3.详细设计和编码:确定算法的主要流程,再进行编程; 4.程序调试和运行:掌握程序调试和排错的基本方法,增加编程的感觉和解决问题的成就感; 5.完成实验报告。 五、程序设计 5.1基本算法 构造集合FIRSTVT(P)的算法 按FIRSTVT(P)的定义,可以用如下两条归则来构造:

(1)若有产生式P→a…或→Qa…,则a∈FIRSTVT(P) (2)若a∈FIRSTVT(Q),且有产生式P→Q…,则a∈FIRSTVT(P) 构造算法: 建立一个二维布尔数组F[P,a],使得F[P,a]为真的条件适当且仅当a∈FIRSTVT(P);再用一个栈STACK,把所有初值为真的数组元素F[P,a]的符号对(P,a)全都放到栈中;算法如下: (1)将布尔矩阵各元素置假;栈置空; (2)按照归则(1)查看产生式,对于P→a…或P→Qa..,置相应F[P,a]为真,符号对(P,a)入栈; (3)按规则(2),对栈施加如下操作:弹出栈定符号对记作(Q,a),查看所有产生式是否有形如P→Q…产生式,若有,且a∈FIRSTVT(P),则将F[P,a]置为真,并把(P,a)入栈; (4)重复(3),直到栈空为止。 5.2定义数据结构 在程序中,用两个字符数组vn[M]和vt[N]分别用来存储所有的非终结字符集与终结字符集。为了记录非终结符的FIRSTVT集,为此建立一个布尔数组F[M][N],记录非终结符的FIRSTVT集。比如,F[i][j]=true表示vt[j]属于FIRSTVT(vn[i]),值为false表示相应的终结符不属于非终结符的FIRSTVT集。 为了简便起见,程序中又构造了一个两维布尔数组first[M][M+N]来表示推导关系。数组第一维的M个字符代表非终结符;数组第二维的前M个字符代表非终结符,后N个字符代表终结符。以first数组为例,fist[i][M+j]代表非终结符vn[i]=P与非终结符vt[j]=a有推导关系P →a…;fist[i][j]代表非终结符vn[i]=P与非终结符vt[j]=Q有推导关系或P→Qa..。 相关的数据结构定义如下: char vn[M],vt[N]; //非终结字符与终结字符数组 bool first[M][M+N],last[M][M+N]; //以布尔数组形式定义推导关系 char vn[M],vt[N]; //非终结字符与终结字符数组 int stp; //堆栈栈顶指针 符号栈的数据结构: struct relation{ int vn; int vt; }; //结构体用来说明终结符vt与非终结符vn 之间的关系,若关系存在说明vt属于FIRSTVT(vn) 六、关键代码

编译原理_实验报告.docx

编译原理实验报告 《编译原理》实验教学大纲 一、课程名称:编译原理(Principle of Compiler ) 二、课程编码:4111204 三、课程总学时:72 学时[理论:54学时;实验:18学时 四、课程总学分:4_学分 五、适用专业和开课学期:计算机科学与技术专业,第7学期。 六、实验的目的与任务: 编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。设置该课程的目的 在于系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现 技术,使学生通过学习既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。编译原理是一门理论性和实践性都比较强的课程。进行上 机实验的目的是使学生通过完成上机实验题目加深对课堂教学内容的理解。同时培养学生实 际动手能力。 七、主要仪器设备及台(套)数:一人一机。 八、主要实验教材(指导书)及参考用书: [1]《编译原理》,吕映芝、张素琴、蒋维杜,清华大学出版社,1998年出版 [2]《编译程序设计原理》,杜书敏、王永宁,北京大学出版社,1988年出版 [3]《计算机编译原理》,张幸儿,科学出版社,1999年出版 [4]《编译程序原理与技术》,李赣生等,清华大学出版社,1997年10月出版。 九、成绩考核方式及评分标准: 由指导教师结合实验报告质量及学习态度等采用5级记分制评分。实验成绩占期终综合 测评成绩的30% 十、实验开出率:100%

实验一:词法分析 一、实验目的 给出PL/0 文法规范,要求编写PL/0 语言的词法分析程序。 二、实验准备 微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL S言,或C++。 三、实验时间 6 学时 四、实验内容 已给PL/0 语言文法,输出单词(关键字、专用符号以及其它标记) 。 二.实验内容 1 、格式输入:源程序文件。输出:关键字、专用符号以及其它标记。 2、编译对象: 包含如下基本内容 1 ) 变量说其它标记: 明语句2) 赋值语句3) 条件转移语句4) 表达式(算术表达式和逻辑表达式) 5 ) 循环语句 6 ) 过程调用语句 3、实现过程 本次实验所用的语言为标准C,以下同。本功能实现的主函数为getToken函数。通过从文件中读取字符到缓冲区中并由C语言字符的状态转换图流程判断返回一个字符 (Token)。分析出来的Token主要分为关键字,专用符号,标记符号。 本实验实现的C语言的基本词法如下: 关键字: els if int return void while 专用符号: + - * / < >= == != = ; , ( ) [ ] { } /* */ 其它标记: id num ID = letter letter* NUM = digit digit* letter = a|b|...|z|A|B|...|Z| ditit= 0|1|...|9 通过在C语言中定义一个枚举类型来识别这些符号: PL/0语言的EBNF表示 <常量定义>::=<标识符>=<无符号整数>; <标识符>::=<字母>={<字母>|<数字>}; <加法运算符>::=+|- <乘法运算符>::=*|/ <关系运算符>::==|#|<|<=|>|>= <字母>::=a|b| , |X|Y|Z <数字>::=0|1|2| , |8|9 4、主体结构的说明 在这里说明部分告诉我们使用的LETTERQIGIT, IDENT(标识符,通常定义为字母开头的 字母数字串)和STR(字符串常量,通常定义为双引号括起来的一串字符)是什么意思•这部分 也可以包含一些初始化代码. 例如用#include 来使用标准的头文件和前向说明(forward ,references). 这些代码应该再标记"%{"和"%}"之间;规则部分>可以包括任何你想用来分 析的代码;我们这里包括了忽略所有注释中字符的功能,传送ID名称和字符串常量内容到主 调函数和main 函数的功能. 5、实现原理

相关文档
最新文档