自己动手构造编译系统:编译、汇编与链接2.1.4 语义分析

简介:

2.1.4  语义分析

  

      编译原理教材中,将语言的文法分为4种:0型、1型、2型、3型,并且这几类文法对语言的描述能力依次减弱。其中,3型文法也称为正规文法,词法分析器中有限自动机能处理的语言文法正是3型文法。2型文法也称为上下文无关文法,也是目前计算机程序语言所采用的文法。顾名思义,程序语言的文法是上下文无关的,即程序代码语句之间在文法层次上是没有关联的。例如在分析赋值语句时,LL(1)分析器无法解决“被赋值的对象是已经声明的标识符吗?”这样的问题,因为语法分析只关心程序语言语法形式的正确性,而不考虑语法模块上下文之间联系的合法性。

  然而实际的情况是,程序语言的语句虽然形式上是上下文无关的,但含义上却是上下文相关的。例如:不允许使用一个未声明的变量,不允许函数实参列表和形参列表不一致,不允许对无法默认转换的类型进行赋值和运算,不允许continue语句出现在循环语句之外等,这些要求是语法分析器不能完成的。

  根据本书设计的程序语言文法,编译器的语义分析模块(见图2-7)处理如下类似问题:

  1)变量及函数使用前是否定义?

  2)break语句是否出现在循环或switch-case语句内部?

  3)continue语句是否出现在循环内部?

  4)return语句返回值的类型是否与函数返回值类型兼容?

  5)函数调用时,实参列表和形参列表是否兼容?

  6)表达式计算及赋值时,类型是否兼容?

  语义分析是编译器处理流程中对源代码正确性的最后一次检查,只要源代码语义上没有问题,编译器就可以正常引导目标代码的生成。

相关文章
|
6月前
|
存储 自然语言处理 编译器
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
|
6月前
|
存储 缓存 Linux
C语言编译过程——预处理、编译汇编和链接详解
C语言编译过程——预处理、编译汇编和链接详解
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
|
编译器 C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
|
6月前
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
222 2
|
1月前
|
存储 移动开发 C语言
【ARM汇编速成】零基础入门汇编语言之指令集(三)
【ARM汇编速成】零基础入门汇编语言之指令集(三)
|
1月前
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
138 0
|
6月前
|
存储 机器学习/深度学习 移动开发
汇编语言指令系列
汇编语言指令系列
633 0
几组汇编指令的比较
几组汇编指令的比较
|
4月前
|
存储 机器学习/深度学习 芯片
8086 汇编笔记(十二):int 指令 & 端口 & 直接定址表
8086 汇编笔记(十二):int 指令 & 端口 & 直接定址表