词法分析(1)---词法分析的有关概念以及转换图 词法分析是编译的第一个阶段,前面简介中也谈到过词法分析器的任务就是: 字符流------>词法记号流 这里词法分析和语法分析会交错进行,也就是说,词法分析器不会读取所有的词法记号再使用语法分析器来处理,通常情况下,每取一个词法记号,就送入语法分析器进行分析,图解: 词法分析器是编译器中与源程序直接接触的部分,因此词法分析器可以做诸如 1). 去掉注释,自动生成文档(c#中的///注释) 2). 提供错误位置(可以通过记录行号来提供),当字符流变成词法记号流以后,就没有了行的概念 3). 完成预处理,比如宏定义 1. 词法记号,词法单元(lexeme),模式 模式是一种规则 每个词法单元都有一个特定记号 比如 int a=3,这里 int,a,=,3都是词法单元,每个词法单元都属于某个词法记号,比如 3就是"num"这个词法记号的一个词法单元,而模式规定了什么样的字符串的词法记号是什么样的(模式是一种规则) 某一特定模式规定了某个词法记号下的一类词法单元,比如: 模式:用字母开头的包含字母和数字的串 上面模式的词法记号:id(所有符合上面模式的字符串的记号都是id) 词法单元:a123 或者 aabc 等 词法记号举例(简称为记号): 1) 每个的关键字都有属于自己的一个记号,比如关键字for,它可以使用记号for;关键字int,可以使用记号int 2) 所有的关系运算符只有一个记号,比如 >=,<=都用记号relation 3) 所有的标识符只有一个记号,比如a123,aab使用记号id 4) 所有的常数只有一个记号,比如123,22,32.3,23E10使用记号num 5) 所有的字符串只有一个记号,比如"123","ab1"使用记号literal 在实际的编译器设计中,词法记号,一般用一个整形数字表示 词法记号的属性: 我们喜欢用<词法记号, 属性>这个二元组来描述一个词法单元,比如,对于源代码:position := initial + rate * 60 对于词法单元 +,我们可以使用
来表示。 有些情况,更加复杂一点,比如对于 position,我们表示是这样的,,详细来说应该是这样的,假定属性是一个字符串,那么id将指向这样一个字符串"position\0",我们把存放这个字符串的地方叫做符号表。有些时候,属性是不必要的,比如 := ,表示赋值,我们可以使用 这样的表示这个词法单元,不过这个显得有些多于,因为assign_op和词法单元是一对一的,...