1.2 一个编译器的结构
1.2.1 词法分析
编译器的第一个步骤称为词法分析或扫描。词法分析器读入组成源程序的字符流,并且将它们组成有意义的词素序列。对于每个词素,词法分析器产生如下形式的词法单元(token)作为输出:<token-name,attribute-value>
token-name语法分析步骤使用的抽象符号,attribute-value指向符号表中关于这个词法单元的条目,符号表条目的信息会被语义分析和代码生成步骤使用。
position=initial+rate*60
<position,1><=><initial,2><+><rate,3><*><number,4>
1.2.2 语法分析
语法分析器使用由词法分析器生成的各个词法单元的第一个分量(即token-name)来创建树形的中间表示。该中间表示该中间表示给出了词法分析产生的词法单元流的语法结构。
语法树:内部节点表示一个运算,该节点的子节点表示该运算的分量。(由叶向根逐步靠拢?)
1.2.3 语义分析
使用语法树和符号表中的信息来检查原程序是否和语言定义的语义一致。同时也收集类型信息,将其存放在语法树或符号表中,再中间代码生成过程中使用。
类型检查:检查运算符是否具有匹配的运算分量。
1.2.4 中间代码生成
语法分析和语义分析完成之后,很多编译器生成一个明确的低级的或类机器语言的中间表示。
三地址码:
1、每个三地址赋值指令的右部最多有一个运算符。这些指令确定了运算完成的顺序。
2、编译器生成一个临时名字一存放一个三地址指令计算得到的值。
3、有些三地址指令的运算分量少于三个。
网友评论