编译原理 第七章 学习总结

一:语义分析概述
语义分析任务
1.审查每一个语法结构的静态语义,即验证语法正确的结构是否有意义。
2.在语义正确的基础上生成一种中间代码或目标代码。
语义分析范围
1.确定类型:确定标识符所关联的数据类型。
2.类型检查:按语言的类型规则,检查运算的合法性与运算分量类型的一致性,必要时作类型转换。
3.识别含义:根据语言的语义定义(形式或非形式),识别程序中各构造成分组合到一起的含义,并作相应的语义处理
4.控制流检查:控制流语句必须转移到合法的地方。如C中,break语句规定跳出最内层的循环或switch语句。
5.一致性检查:在很多场合要求对象只能被说明一次。如:pascal语言规定同一个标识符在一个分程序中只能被说明一次等。
6.相关名字检查:如:Ada,循环或块可以有一个名字,它出现在这些结构的开头或结尾。编译程序必须检查这两个地方用的名字是否相同。
语法制导翻译 
    所谓语法制导翻译是指:对文法中的每个产生式都附加上一个语义动作或语义子程序。伴随着语法分析,每当使用一条产生式进行推导或归约时,就执行相应产生式的语义动作(包括:查填表格,改变变量的求值,诊察与报告错误,生成中间代码等),从而完成预定的翻译工作。
图表示法
抽象语法树。    
无循环有向图(DAG)
      DAG与抽象语法树基本上一样,对表达式中的每个子表达式,DAG中都有一个结点。一个内部结点表示一个操作符,它的孩子表示操作数。
      两者所不同的是,在一个DAG中代表公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树。
二:三元式

逆波兰表示法
      波兰表示是一种既不须考虑优先关系、又不用括号的一种表示表达式的方法(前缀式)。
现在我们要介绍的刚好是另一种波兰表示形式,称为后缀式,即运算符在后。

 1.三元式由三个部分组成:
           算符:OP
      第一运算分量:ARG1
      第二运算分量:ARG2
语法制导产生三元式
(1) E→E1 op E2  我们用E.val表示一个指示器,它或指向有关符号表的某项,或指向三元式表的某项,于是其语义子程序为:
       {E.val:=TRIP(OP,E1.val,E2.val)}
      这儿TRIP(OP,ARG1,ARG2)是一个语义过程,它产生(OP,ARG1,ARG2)并放入三元式表中,返回三元式在表中的位置

(2)E→i  {E.val:=Entry(i)}
    Entry是一个语义过程,它查找i在符号表中的位置。若用LOOKUP(NAME)函数表示对NAME查找符号表,找到则返回表项位置,找不到则返回NULL。 于是可如下实现:

      词法分析器扫描到标识符i时送回(种别码,i值),语法分析器把i放入语义变量i.LEXCAL中,这时就可以调用Entry过程:

无循环有向图(DAG)
      DAG与抽象语法树基本上一样,对表达式中的每个子表达式,DAG中都有一个结点。一个内部结点表示一个操作符,它的孩子表示操作数。
      两者所不同的是,在一个DAG中代表公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树

三:某些语句的四元式及翻译

说明语句的翻译
为局部名字建立符号表条目
为它分配存储单元
符号表中包含名字的类型和分配给它的存储单元的相对地址等信息    

一、说明语句的翻译
     程序语言中的说明语句都是给编译程序提供信息的,诸如类型、维数、每维的界种类等,因此一般不生成目标,只是在编译时把有关信息填入相应表格即可。
类型转换
    我们可以把类型信息反映到运算符中,例如用+i,*i表示定点+、*,用+r,*r表示浮点+、*。有的程序设计语言允许混合运算,有的不允许。如果不允许,则发现有类型不相同的运算分量就应该报错。如果允许,就要进行类型转换。
四:循环与分情况语句的翻译
例如F1→for i:=E1 对应的语义动作:
   (1)产生四元式:emit(:=,E1.place,--,ENTRY(i));
   (2)保留ENTRY(i):F1.place:=ENTRY(i);
   (3)因为goto over 的转移地址暂时填不上,必须
      建链:F1.chain:=nextquad;
   (4)产生无条件转移指令:emit(j,--,--,0);
   (5)保留again的地址:F1.quad:=nextquad;
五:过程调用的翻译
   1. 过程调用主要解决两个问题:
      (1)把程序控制转移到子程序(过程段),执行完毕再返回。这个问题很好解决。
      (2)传递实在参数。我们前面谈到过几种不同的参数传递方式(传名、传值、传地址),它们的语义动作也就有所区别。
六:中间代码
把经过语法分析和语义分析而获得的源程序中间表 示翻译为中间代码表示。
中间语言 
  语法树 
  后缀式
  三地址代码表示
图表示法 
    语法树,有向非循环图和后缀式表示源程序的自然层次结构。
三地址语句的种类
1.赋值语句
2.无条件转移语句
3.条件转移语句
4.复制语句
5.过程调用语句
6.索引语句
7.地址和指针语句
布尔表达式
  用布尔运算符号(and,or,not)作用到布尔变量或关系表达式上而组成
布尔表达式的作用:
 1. 用作计算逻辑值
 2. 用作控制流语句如if-then,if-then-else和while-do等之中的条件表达式

 控制流语句中的布尔表达式的翻译

 对于出现在条件语句  if E then s1 else s2中的布尔表达式E,其作用就是控制对S1和S2的选择
因此,作为条件的布尔表达式,把它设计成两个出口:E.true   和   E.false
考虑E的上下文,对于IF语句,E.true   指向S1,   E.false指向S2;对于while语句E.true  指向循环的开始,   E.false指向while 的下一语句
回填
两遍扫描:
对语法树按深度优先遍历,来进行语义分析
从给定的输入构造出一棵语法树;

一遍扫描:语法制导翻译技术是属于一遍扫描分析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值