编译原理总结
基础概念
编译程序是什么?
能把源语言程序转换成目标语言程序的程序。-
编译要经过哪些步骤?
-
词法分析:
- 扫描源程序,将其分解为词法单元后输出。
- 方法:正规式,有限自动机。
-
语法分析:
- 根据语法规则,对词法单元进行推导或规约,识别出各类语法单元,最终判断输入串语法是否正确。
- 方法:上下文无关文法。
语义分析与中间代码生成:
使用语法树和符号表对语法单元进行语义分析并把他们翻译成一定形式的中间代码。
方法:等价变换。优化:
对中间代码进行优化处理。目标代码生成:
把中间代码翻译成目标程序。
-
遍
对源程序或中间结果从头到尾扫描一次,并做加工处理,生成新的中间结果或目标程序的过程。前端
与源语言有关而与目标机器无关的部分。后端
与源语言无关而与目标机器有关的部分。文法
描述语言的语法结构的形式规则语法树
用来描述句型推导的一棵树-
上下文无关文法
所定义的语法单位与上下文(环境)无关。包括:
- 终结符:
直观的是语法树的叶子结点、句子中的单词或字。
例如:He,give,a,b……
- 非终结符:
语法树的分支结点、句子中的语法成分。
例如:<冠词>,A,B……
- 开始符号:
语法树的根结点、句子。
例如:<句子>,S……
- 产生式:
由一种高级的语法成分推出低级的若干语法成分的式子。
例如:<间接宾语> -> <冠词><名词>,S—>A|B…… -
语法定义语言
从文法规则的开始符号出发,反复使用产生式,对非终结符进行替换或展开,最终得到的就是一种语言。通俗来说,一般的句子结构可以是“主语+谓语+宾语”,然后我们用产生式来替换,主语->代词—>He,谓语->动词->plays,宾语->名词->piano。这样我们就推出一句话。
如果这样一直重复,就可以把这种语法规则可以表示的所有语句推导出来,即一种语言。
最左推导
如果我们对于9中提到的产生式,每次推导都是先替换最左边的非终结符,那就是一种最左推导。最右推导
如果我们对于9中提到的产生式,每次推导都是先替换最右边的非终结符,那就是一种最左推导。-
二义文法
因为我们对于9中提到的产生式,可以通过最左推导和最右推导分别推导出一样的句子,所以这种文法就是二义文法。在程序设计语言中,只有确定化的代码才可以被机器按部就班执行,否则,每次机器运行结果就一定会不同。所以,程序设计语言的文法不可以是二义文法。
思考:为什么9中提到的文法会有二义性?
因为9中的文法未规定替换的优先级和结合方式。-
形式语言
0型文法(短语文法)递归可枚举1型文法(上下文有关文法)
2型文法(上下文无关文法)对应非确定的下推自动机
3型文法(正规文法)