编译原理第七章

一:语义分析概述
语义分析任务

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过程:

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

一、说明语句的翻译
     程序语言中的说明语句都是给编译程序提供信息的,诸如类型、维数、每维的界种类等,因此一般不生成目标,只是在编译时把有关信息填入相应表格即可。
类型转换
    我们可以把类型信息反映到运算符中,例如用+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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hibernate0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值