编译原理语义检查
A. 编译原理
编译原理):利用编译程序从源语言编写的源程序产生目标程序的过程; 用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。
编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成
(1)编译原理语义检查扩展阅读:
编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。
编译程序的语法规则可用上下文无关文法来刻画。语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法的开始符号出发,向下推导,推出句子。
而自下而上分析法采用的是移进归约法,基本思想是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。
B. 编译原理简单吗
编译原理主要是讲了编译器的实现。
那什么是编译器呢?
编译器就是将 源程序→编译器 →目标机器代码的程序
本文将用一段最简单的代码进行说明
1 + 2 + 3
第一步. 词法分析
当代码从文件中被读入到编辑器时,将会进行词法分析
示例中的代码最终会转换为(下面为伪代码)
1 ADD 2 ADD 3
第二步. 语法分析
这一步编译器将会把词法分析的结果转换成AST(abstract syntax tree, 抽象语法树)
所有的操作数将会作为子节点,所有的操作符将会作为父节点。(不知道的同学可以看一下树的生成)
1 + 2 + 3 对应的树
3. 生成目标代码
对上面的树进行后序遍历,将会得到下面的伪代码
((1 2 +) 3 +)
生成的汇编伪代码为
START:
MOV VALUE, 0//初始化结果为0
ADD VALUE, 1
ADD VALUE, 2//(1 2 +)的汇编伪代码
ADD VALUE, 3
RET VALUE
END
最终汇编代码会被编译成机器代码,在计算机上执行。
下面为一般情况下的编译流程
1. 词法分析(生成代码对应的token序列,使用正则表达式)
2. 语法分析(生成AST)
3. 语义分析(对代码的语法进行检查)
4. 代码生成(生成可执行的代码)
C. 编译器有哪几部分构成.编译原理
1. 词法分析
词法分析器根据词法规则识别出源程序
中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器
的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。
2. 语法分析
语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。
3. 语义分析
语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。
4. 中间代码生成
中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。
D. 编译原理词法分析,语法分析,语义分析能检测出什么错误
在程序编译中,词法分析、语法分析和语义分析三个阶段分别检测不同类型的错误。
词法分析阶段主要任务是识别和分类输入代码中的各个符号,将文本分解成一个个词法单元。若遇到未知词或符号,将引发错误提示。
语法分析阶段依据语法规则识别出代码中的语句结构,并检查其在语法结构上的正确性。例如,定义语句或赋值语句的格式是否符合预期。
语义分析阶段进行静态语义审查,确保代码的含义正确无误,遵循定义的使用规则。如,变量是否先定义再使用,标识符是否重复定义。
举例说明,假设程序中包含以下代码段:
int a;
a = 1 + b;
词法分析阶段会识别出各符号与词法单元。
语法分析阶段检查赋值语句结构,发现语句“1 + b;”中,“1”与“b”均未定义,导致错误。
语义分析阶段进一步检查变量“b”是否已定义,如未定义则提示错误。
常见的语义错误类型包括类型不兼容、重复定义、控制流错误等。
总结而言,编译器通过这三个阶段的分析,有效检测并报告程序中的各种错误,帮助开发者确保代码的正确性和有效性。