03 | 词法分析程序与有穷自动机
词法分析程序概述
词法分析: 词法分析的任务是对字符串表示的源程序从左到右地进行扫描和分解,根据语言的词法规则识别出一个一个具有独立意义的单词符号。
词法分析器(扫描器): 执行词法分析的程序。
- 输入:字符串形式的源程序
- 输出:单词符号或单词符号表示的源程序。单词符号通常表示成 二元式(单词种别,单词自身的值)。
语言的单词符号: 语言中具有独立意义的最小语法单位,即单词符号是程序语言的基本语法单位。
程序的单词符号一般包括:关键字(基本字)、标识符、常数、运算符、界符。
单词种别:
单词种别表示单词的种类,它是语法分析需要的信息,一个语言的单词符号如何划分种类、分成几个种类、怎样编码,这是一个技术性的问题,它主要取决于处理上的方便。
通常的方法是让每种单词对应一个整数码,其目的是最大限度地把各个单词区别开来。基本字可将其全体视为一种,也可以一字一种。采用一字一种的分法处理起来较为方便。标识符一般统归为一种。常数可统归为一种,也可按类型(整型、实型、布尔型等)分种。运算符和界符可采用一符一种的分法,也可以统归为一种。
单词自身的值:
单词自身的值是编译中其他阶段所需要的信息。可采用下面的方法来确定它的值。
- 如果一个种别只含一个单词符号,那么对于这个单词符号,种别编码就完全代表它自身的值。
- 如果一个种别含有多个单词符号,那么对于它的每个单词符号,除了给出种别编码之外,还应给出单词符号的自身值,以便把同一种类的单词区别开来。标识符自身值是标识符自身的字符串;常数自身值是常数本身的二进制数值。我们也可用指向某类表格中一个特定项目的指针值来区分同类中不同的单词。
例如,对于标识符,用它在符号表的入口指针作为它自身值;常数用它在常数表的入口指针作为它的自身值。
通常将词法分析程序设置为语法分析程序的子程序。每当语法分析程序需要一个单词符号时,就向词法分析程序发出“取下一个单词符号”的调用命令(GetNextToken / Scanner)。词法分析程序就从输入字符串中,识别出一个具有独立意义的单词符号。
如下图所示:
一个例子:
正规式与正规集
正规集,简单来说就是程序语言的合法单词的集合。
正规式中包含3种运算符:连接“.”(一般可省略不写)、或“|”、闭包“*”。三者均为左结合,优先级为:闭包 > 连接 >或。
正规式与正规集的定义如下:
举例如下: