编译器的结构——词法分析

来源:互联网 发布:淘宝上有个正义哥代购 编辑:程序博客网 时间:2024/05/19 18:46

    编译器的第一个步骤成为词法分析或扫描。词法分析器读入组成源程序的字符流,并且把他们组织成为有意义的词素的序列。对于每个词素,词法分析器产生如下形式的词法单元(token)作为输出:            <token-name, attribute-value>               <名称,值>    这个词法单元被传送给下一个步骤,即语法分析。在这个词法单元中,第一个分量token-name是一个由语法分析步骤使用的抽象符号,第二个分量attribute-value指向符号表中关于这个词法单元的条目。符号表条目的信息会被语义分析和代码生成步骤使用。    比如,假设一个源程序包含如下的赋值语句        position = initial + rate * 60;    这个赋值语句中的字符可以组成如下词素,并映射成词法单元。这些词法单元将被传递给语法分析阶段。    position是一个词素,被映射成词法单元<id,1>,id是表示标识符的抽象符号,1指向符号表中position对应的条目。一个标识符对应的符号表条目存放该标识符有关的信息,比如它的名字和类型。    赋值符号=是一个词素,被映射成词法单元<=>。因为这个词法单元不需要属性值,所以我们省略第二个分量。    initial被映射为<id,2>。    +被映射为<+>。    rate被映射为<id,3>。    *被映射为<*>。    60被映射为<60>。(技术上讲,应该映射为<number,60>,后续讨论)    ;被映射为<;>    分隔词素的空格会被词法分析器忽略掉。    词法分析后,上述赋值语句被表示为如下词法单元序列:        <id,1> <=> <id,2> <+> <id,3> <*> <60> <;>    =,+,*分别是表示赋值,加法运算,乘法运算的抽象符号。

原创粉丝点击