语义分析-哈工大编译原理第三次实验

实验3 语义分析

实验目的

1.   巩固对语义分析的基本功能和原理的认识。

2.   能够基于语法指导翻译的知识进行语义分析。

3.   掌握类高级语言中基本语句所对应的语义动作。

4.   理解并处理语义分析中的异常和错误。

实验内容

在语法分析器的基础上设计实现类高级语言的语义分析器,基本功能如下:

(1)    能分析以下几类语句,并生成中间代码(三地址指令和四元式形式):

Ø 声明语句(包括变量声明、数组声明、记录声明和过程声明

Ø 表达式及赋值语句(包括数组元素的引用和赋值)

Ø 分支语句:if_then_else

Ø 循环语句:do_while

Ø 过程调用语句

(2)具备语义错误处理能力,包括变量或函数重复声明、变量或函数引用前未声明、运算符和运算分量之间的类型不匹配(如整型变量与数组变量相加减)等错误,能准确给出错误所在位置,并采用可行的错误恢复策略。输出的错误提示信息格式如下:

Error at Line [行号]:[说明文字]

(3)系统的输入形式:要求能够通过文件导入测试用例。测试用例要涵盖第(1)条中列出的各种类型的语句,以及第(2)条中列出的各种类型的错误。

(4)系统的输出分为两部分:一部分是打印输出符号表。另一部分是打印输出三地址指令和四元式序列,格式如下图所示(以输入语句“while a<b do if c<d then x=y+z else x=y-z”为例):

 

1  : (j<, a , b ,  3 )               if a < b  goto 3

2  : (  j , - ,  - , 11)           goto 11

3  : (j<,  c , d , 5 )               if c < d  goto 5

4  :(  j ,  - ,  -, 8 )         goto8

5  :( + ,  y , zt1)            t1 = y + z

6  :( = , t1 ,  - ,  x )          x= t1

7  : (  j , - ,  - ,  1 )        goto1

8  : (  - ,  y, zt2)        t2 = y - z

9  : (= ,  t2 ,  - , x )           x = t2

10 : ( j  ,   -,  - , 1 )          goto 1

11:

 

除此之外,可以实现一些额外功能,例如自动类型转换,识别其它类型语义错误,如过程返回类型与声明类型不匹配;过程调用时实参与形参数目或类型不匹配;对非数组型变量使用数组访问操作符“[…]”;对普通变量使用过程调用操作符“call”;数组访问操作符“[…]”中出现非整数等。



圈重点!!!

实验指导书:http://download.csdn.net/download/qq_32285991/10125108

源代码:https://github.com/JiayanFighting/SemanticAnalysis

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
编译原理实验三是通过对PL/0语言进行语义分析的实践。PL/0是一种简单的过程式语言,语法规则相对简单,适合用来学习编译原理中的语义分析语义分析是编译过程中的一个重要环节,其主要任务是对源程序中的语言结构进行分析,生成相应的中间代码,为后续的优化和代码生成做准备。在PL/0语义分析实验中,我们需要实现对PL/0语言的语义规则进行分析,包括语法树的构建、类型检查和作用域分析等内容。 首先,需要构建语法树,将源程序转换为一棵树状结构,便于后续的语义分析和中间代码生成。在构建语法树的过程中,需要对语法规则进行递归下降分析,识别各种语法结构,并生成对应的语法树节点。 其次,需要进行类型检查,对源程序中的标识符和表达式进行类型推导,保证类型的一致性和正确性。这包括对变量的声明和使用、运算符的操作数类型等方面的检查。 最后,需要进行作用域分析,确定各个变量和过程的作用域,并进行变量的定义和引用的合法性检查。在PL/0语义分析实验中,我们需要实现对静态作用域的支持,确保程序在运行过程中能够正确地获取和修改变量的值。 通过实验三的学习和实践,我们能够更深入地理解编译原理中的语义分析过程,掌握PL/0语言的语义规则和处理方法,为之后的编译器设计和实现打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值