编译原理三——语义分析

语义分析和中间代码生成

1、概述

1、和语法分析、词法分析的同时进行进行词法检查、语法检查一样,语义分析也伴随语义检查。

  1. 动态语义检查需要生成相应的目标代码,它是在运行时进行的。
  2. 静态语义检查是在编译时完成的,主要涉及类型检查(与参与运算的操作数类型相容)、控制流检查(保证控制语句有合法的转向点)、一致性检查(如图标识符在同作用域只说明一次,case语句标号不能同等)(语义是上下文有关的,故形式化困难,目前用属性文法和语法制导翻译)

2、语法制导翻译:为每个产生式配上一个翻译子程序,并在语法分析同时执行这些子程序。

  • 自底向上语法制导翻译:(规约时调用翻译子程序,每个产生式语义子程序执行之后,某些结果必须作为产生式左部符号语义值暂时保存下来),原LR分析栈扩充一项为语义值。
  • 可以轻易画出语法树,但是语义分析和计算过程不太会

2、属性文法

1、文法符号的属性:(可以根据语法树找,注意复习

  • 继承属性 :从上向下传递,由父节点属性计算得到,由根节点到分支子结点,反映对上下文依赖的特性。(方便地表示程序上下文结构关系)
  • 综合属性 :自底向下传递,由子节点属性计算得到,传递方向与综合属性相反。

3、常见的中间语言

1、抽象语法树

  • 叶节点表示诸如常量或变量这样的运算对象,其它内部节点表示运算符
  • 语法规则中非本质部分去掉,得到抽象语法规则,举例如下。


    yfs.jpg

2、逆波兰表示法

  • 表达式的逆波兰表示:书106


    nbl.jpg
  • 程序语句的逆波兰表示:

    1. 赋值语句:x=a+b*c 逆波兰:xabc*+= (左部,表达式,=)
    2. GOTO语句:GOTO<语句标号> <语句标号>BL
    3. 条件语句:<顺序号>BR表示无条件转移到BR,BT和BF则是条件e真或假转移到顺序号。<布尔表达式e的逆波兰式><顺序号>BT
    4. 循环语句:转换为条件语句

    练习:
    pracnbl.jpg

3、 三地址代码:三地址代码是中间代码的一种抽象形式。通常有四元式、三元式和间接三元式三种表示方法。(三地址代码通常包含三个地址,两个存运算对象,一个存运算结果)

  • 四元式:(op,arg1,arg2,result),op是运算符,arg和result是指针,可以空缺,单变量只用arg1。

常用:


四元式.jpg
  • 三元式:(op,arg1,arg2)没有结果地址,三元式标号代表结果地址
  • 间接三元式:只记录不同的三元式,运算顺序用间接码表表示

举例:
三元式.jpg

4、表达式及赋值语句的翻译

  • 为了实现由表达式到四元式的翻译,需要给文法加上语义子程序,以便在规约的同时执行对应的语义子程序,语义子程序所涉及的语义变量、语义函数说明如下:
    1. 非终结符E.place表示存放E值的变量名在符号表中的入口地址或临时变量名的整数码。
    2. 语义函数newtemp(),调用后回送一个代表新临时变量的整数码,临时变量名按顺序可设为T1、T2......
    3. emit(op,arg1,arg2,result)产生四元式并填入四元式表中。
    4. 定义lookup(i.name)是审查i.name是否出现在符号表中,是返回i.name在符号表中的入口指针,否则返回NULL

一套语义翻译:
ytyyfx0.jpg

ytyyfx1.jpg
ytyyfy2.jpg

注意语义栈与规约同步,状态栈转换斜对角法


ytyyfy3.jpg

最后再进行手写演算
  • 布尔表达式的翻译
    1. 布尔表达式一般由运算符与运算对象组成,运算符为布尔运算符,(非,与,或)。运算对象也可以为布尔变量,也可为常量或关系表达式。关系表达式的运算对象为算术表达式
    2. 确定一个表达式的真假出口:
    3. 例子:
      布尔表达式四元式.jpg
    4. 自己试试:
      自己尝试.jpg
    5. 尝试理解:
      819759651.jpg

控制语句的翻译

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容