编译程序的工作:
- 举例说明:
Void jisuan()
{
int y, c,d;
float x,a,b;
x=a+b*50;
y=c+)d*(x+b;
}
注意:
这个代码,最后一句会报错,让我们来看看它的编译过程。
以下是简单的编译处理过程:
每一步都会产生一些东西,这些东西会被放在表格管理中。
- 词法分析:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词。
- 单词:是高级语言中有实在意义的最小语法单位,由字符构成。
识别程序中的单词:
- 基本字:(c语言原有的,即关键字) Void int float
- 标识符:(用户自己定义的)a b c d x y jisuan
- 整数:50
- 运算符: + * =
- 界限符:(用来分开一些东西) { } , ; ()
- 接着依据词法规则,识别出正确的单词,转换成统一规格,备用
- 描述语法规则的有效工具是正规式和有限自动机。
- 语法分析:
- 任务:在词法分析的基础上,根据语言的语法规则,把单词符号组成各类的语法单位:短语、子句、语句、过程、程序。
- 语法规则:又称为文法,规定单词如何构成短语,语句,过程和程序。
- 语法规则的表示: BNF: A::=B|C (巴科斯范式)表示定义为 。
🍊例如:句子定义为主谓宾➡️ <句子> ::= <主><谓><宾>
<主>::=<定><名>
- 语法分析有两种方法:推导(derive)和归约(reduce)
- 推导:分为最左推导和最右推导
🍊:例如以下 最右推导,逆过程是最左归约,倒着看就可以
- 归约:分为最左归约和最右归约。推导和归约是一个互逆的关系。
🍊:例如以下:最左推导的逆过程是最右归约,倒着推就可以。 最右边的东西归约为大写字母。
- 再来看这个例子:计算机推导时候会用语法树。
这里不会管那两个括号,因为会把他们看成一个整体。
- 语义分析和中间代码生成
- 优化
- 目标代码生成