自己动手构造编译系统:编译、汇编与链接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)表达式计算及赋值时,类型是否兼容?

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

相关文章
|
1月前
|
存储 自然语言处理 编译器
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
|
3月前
|
存储 缓存 Linux
C语言编译过程——预处理、编译汇编和链接详解
C语言编译过程——预处理、编译汇编和链接详解
|
11月前
|
C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
|
11月前
|
编译器 C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
|
11月前
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
84 0
|
11月前
|
存储 自然语言处理 程序员
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
|
存储 API C语言
从反汇编看恶意程序的C语言结构(二)
从反汇编看恶意程序的C语言结构
93 0
|
存储 程序员
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”
91 0
Win知识 - 程序是怎样跑起来的——汇编语言的语法是“操作码+操作数”
|
编译器 C语言 C++
Win知识 - 程序是怎样跑起来的——通过编译器输出汇编语言的源代码
Win知识 - 程序是怎样跑起来的——通过编译器输出汇编语言的源代码
200 0
|
编译器 C语言
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的
111 0
Win知识 - 程序是怎样跑起来的——汇编语言和本地代码是一一对应的