预备知识

  1. 编译器的前端是由三个模块和两个核心数据结构(记号流,抽象语法树)组成的,
  2. 编译器处于一个流水线的结构,阶段无关性(只考虑把每一个模块的输入输出)
  3. 语义分析只依赖于前一阶段的抽象语法树
  4. 语义分析也称为类型检查。上下文相关分析。负责检查程序(抽象语法树)的上下文相关的属性:
    1. 变量在使用前先声明
    2. 每个表达式都有何时的类型
    3. 函数调用和函数的定义一致
    4. ………………
      举个例子
void f(int *p)
{X += 4:Cal(X);break;
}

编译器报出x,cal没有定义的错误,没有找到循环的错误,这就是所谓的上下文相关,不仅仅是检查当前

所以语义分析要完成的工作就是针对给定的一段代码,去找出所有的语义错误,如果出错了,要给出清晰的诊断信息反馈给程序员,程序员根据出错信息改错

语义分析器接受一个抽象语法树的输入,这棵树必然满足语法正确,还有一个输入,就是程序语言的合法规则(表明什么是合法的,什么是非法的),输出Yes或者NO,如果是Yes,那么就要产生中间代码(这个阶段过后,程序就不应包含任何语法和语义错误),如果是NO,就要给出错误信息

如何定义程序语言的语义?

传统上,大部分的程序设计语言都采用自然语言来表达程序语言的语义
例如,对于“+”运算
要求左右操作数都必须是整形数,如e1 + e2, 对于语法分析,+号两边操作数是不管的,而语义分析就要检查是否为整形数
这个自然语言是我们学习一门语言的所需要的,比如一本编程书上

但编译器的实现者必须对语言中的语义规定有全面的理解,比如加号两边可以是浮点数和整形数

那么如何能够正确高效地实现?

给出下面文法举个例子
定义加法左右两边只能是整数

E->N| true| false| E + E| E && E

类型合法的程序

3 + 4
False && true

类型不合法的程序

3 + true
True + false

对这个语言,语义分析的任务是:对给定一个表达式e,写一个函数check(e)
返回一个表达式e的类型;若类型不合法,则报错
如3 + 4这个表达式返回int, 3+true这个表达式就会出错

下面对应抽象语法树的后序遍历的伪代码

enum type {int, bool};
enum type check (exp_t e)
{switch(e->kind)case exp_int: return int;case exp_true: return true;case exp_false: return false;case exp_add: t1 = check(e->left);//左t2 = check(e->right);//右if(t1 != int || t2 != int) //根perror(“error”);else return int;case exp_and: t1 = check(e->left);t2 = check(e->right);if(t1 != bool || t2 != bool)perror(“error”);else return bool
}
符号表

对于类型检查的有一个很重要的数据结构,符号表(key, value)
符号表:
用来存储程序中的变量相关信息
类型
作用域
访问控制信息(如pubic ,private之类的,文件之间的访问)
必须非常高效,因为程序中的变量规模会很大
如int x, bool y
table
x:int …..
y:bool ….

符号表要有创建,插入,查找的接口功能,具体实现和所选择语言相关
为了高效,可以使用哈希表等数据结构来实现呢符号表,
为了节约空间,也可以使用红黑树等平衡树

语义分析可能会出现的共性问题:

  • 类型相容性:
    类型检查问题往往归结为判断两个类型是否相等t1==t2? 在实际的语言中,这往往是个需要谨慎处理的复杂问题
    如:

    1. 对采用名字相等的语言,可直接比较
      对采用结构相等的语言(如结构体),需要递归比较比较各个域
    2. 面向对象的继承,需要维护类型间的继承关系
  • 错误诊断:编译器要报出语义错误,这些信息要很清晰地给出
    (1) 要给出极可能准确的错误信息
    (2) 要给出尽可能多的错误信息
    (3) 要给出尽可能准确的出错位置,程序代码的位置要从缱绻保留并传递归来(即词法分析的行号信息要传递到语义分析)
  • 代码翻译:生成中间表示(或目标代码),现代编译器中的语义分析模块,除了做语义分析外,还要负责生成中间代码或目标代码,代码生成的过程也同样是对树的某种遍历
    因此,语义分析往往是编译器中最庞大(代码量)最复杂(需要很多分析)的模块

关于语义分析的简单总结相关推荐

  1. 用c语言编译递归下降翻译器,Java实现C语言语义分析(递归下降)

    说起这次的语义分析,不得不说的是我的重大的改变.上一次的语法分析是利用了预测分析法来实现的,经过多方考证,发现用预测分析法的语法分析器基础来实现语义分析的困难重重,例如在语法指导翻译的时候那个栈的变化 ...

  2. 干货分享 | 自然语言处理及词向量模型介绍(附PPT)

    云脑科技机器学习训练营第二期,对自然语言处理及词向量模型进行了详细介绍,量子位作为合作媒体为大家带来本期干货分享~ 本期讲师简介 樊向军 云脑科技核心算法工程师,清华大学学士,日本东京大学与美国华盛顿 ...

  3. 【转载】文本自动生成研究进展与趋势

    CCF 中文信息技术专业委员会 万小军 冯岩松 孙薇薇 北京大学计算机科学技术研究所,北京 摘要 我们期待未来有一天计算机能够像人类一样会写作,能够撰写出高质量的自然语言文本.文 本自动生成就是实现这 ...

  4. 编译原理实验语义分析_「编译原理」LL(1)文法分析,简单优先分析

    首先我们来介绍一下LL(1)文法分析. LL(1)文法是一种自顶向下的分析方式,是从非终结符到终结符的分析方式,这种方式和我们之前说的LR(0)分析方式是刚好相反的,在我们使用LR(0)分析方式的时候 ...

  5. 编译器设计-自下而上分析器-误差恢复-语义分析

    编译器设计-自下而上分析器-误差恢复-语义分析 Compiler Design - Bottom-Up Parser Compiler Design - Error Recovery Compiler ...

  6. 教你在Python中实现潜在语义分析(附代码)

    作者:PRATEEK JOSHI 翻译:李润嘉 校对:万文菁 本文约3400字,建议阅读15分钟. 本文将通过拆解LSA的原理及代码实例来讲解如何运用LSA进行潜在语义分析. 介绍 你有没有去过那种运 ...

  7. 如何利用AI语义分析,做产品需求分析(1)

    近些年来,关于AI 的讨论有很多,也有不少人工智能相关的产业与产品在不断发展着.不过,对产品经理来说, AI 能否应用在产品需求分析上呢?为打造一款产品做出更好的帮助吗?笔者将为我们带来一系列的分析. ...

  8. 今日 Paper | 多人姿势估计;对话框语义分析;无监督语义分析;自然语言处理工具包等

    导语:为了更好地服务广大 AI 青年,AI 研习社正式推出全新「论文」版块   目录 基于层次表示的面向任务对话框语义分析 固定的无监督语义分析 斯坦福CoreNLP自然语言处理工具包 DeepCut ...

  9. 语义分析的一些方法(下篇)

    3 图片语义分析 3.1 图片分类 图片分类是一个最基本的图片语义分析方法. 基于深度学习的图片分类 传统的图片分类如下图所示,首先需要先手工提取图片特征,譬如SIFT, GIST,再经由VQ cod ...

最新文章

  1. paramiko 模块封装
  2. vs2010 使用vs online账号 需要安装的插件
  3. 【转载】C++操作符
  4. xp系统 javafx_使用JavaFX构建React系统
  5. String中删除空格的7种方法!
  6. 原神光环助手下的算什么服务器,原神光环助手app
  7. 随想录(gcc生成的中间语言、汇编代码)
  8. n 个骰子点数和及各自出现的概率
  9. 算法直观与对模型的理解
  10. android 远程调试工具,Android 远程调试工具STF——开源项目
  11. 戴尔服务器重装系统优盘启动不了怎么办,戴尔电脑重装系统识别不了u盘怎么办...
  12. 关于java中判断一个点是否在一个长方形内和一个长方形是否包含另一个长方形或者两个相重叠的问题。
  13. 微擎上传图片失败——加密版本不能使用__DIR__或者__FILE__
  14. oracle 抽样_oracle优化手段--统计信息导出和抽样提取数据
  15. 基于学习的编码(六):DRNLF
  16. linux安装包安装方法
  17. 年轻人的第一个桌面应用
  18. 迪士尼贺新春,推出猪年限定产品
  19. 谷歌浏览器扩展工具---eye dropper取色器使用
  20. 在职场上奋战不懈的各位12把健康金钥匙

热门文章

  1. 【原创】EXCEL公式经验(2)--关于count(),countif(),counta(),countifs()相关多个函数总结
  2. STM32单片机与蓝牙模块HC-05通信数据帧处理
  3. yDAI受创 Curve“喜”收意外之财
  4. 寒假集训三(暴力枚举)2020.01.02(11题)
  5. 大数据的Hadoop架构有哪些优势?
  6. 一款牛逼的Java工具类库,GitHub星标10.7k+,你敢用吗?
  7. 微信聊天语音怎么转发?轻松易懂,快速学会
  8. axure原型怎么让文字自动换行_文本文档怎么创建_文本文档怎么自动换行的方法...
  9. 数据结构1800试题(第1章)
  10. 剖开苹果A15芯片,看看die的布局!