编译器设计中的词法分析设计是什么?
词法分析可以使用状态转换图来设计。
有限自动机(状态转换图) - 用于识别词元的定向图或流程图。
状态转换图有两个部分:
状态 - 用圆圈表示。
边 - 状态由边(箭头)连接。
示例 - 绘制“if”关键字的状态转换图。
为了识别词元(“if”),词法分析必须读取“f”之后的下一个字符。根据下一个字符,它将判断是“if”关键字还是其他内容。
因此,“if”后的空格决定“If”是一个关键字。
最终状态3上的“*”表示回退,即控制将再次回到之前的状态2。因此,空格不是词元(“if”)的一部分。
标识符的状态转换图 - 标识符以字母开头,后跟字母或数字。状态转换图将是
例如,在语句**int a2;**中,标识符**a2**的状态转换图将是
由于(;)不是标识符(“a2”)的一部分,因此使用“*”进行回退,即返回到状态1以识别标识符(“a2”)。
标识符的状态转换图可以转换为程序代码,如下所示:
编码
State 0: C = Getchar() If letter (C) then goto state 1 else fail State1: C = Getchar() If letter (C) or Digit (C) then goto state 1 else if Delimiter (C) goto state 2 else Fail State2: Retract () return (6, Install ());
在状态2中,回退()将指针向后移动一个状态,即到状态1,并声明到状态1为止找到的任何内容都是一个词元。
词法分析将词元返回给语法分析器,不是以英文单词的形式,而是以对的形式,即(整数代码,值)。
对于标识符,返回给语法分析器的整数代码为6,如表所示。
Install() - 它将返回指向符号表的指针,即词元的地址。
下表显示了词法分析返回给语法分析器的各种词元的整数代码和值。
不同词元的整数代码
词元 | 整数代码 | 值 |
---|---|---|
Begin | 1 | - |
End | 2 | - |
If | 3 | - |
Then | 4 | - |
Else | 5 | - |
标识符 | 6 | 指向符号表的指针 |
常量 | 7 | 指向符号表的指针 |
< | 8 | 1 |
<= | 8 | 2 |
= | 8 | 3 |
<> | 8 | 4 |
> | 8 | 5 |
>= | 8 | 6 |
这些整数值不是固定的。不同的程序员在设计词法分析时可以选择其他整数代码和值。
假设,如果**标识符**存储在符号表中的位置236,则
类似地,如果**常量**存储在位置238,则
整数代码 = 7
Install()= 238 即,对将是(7,238)
词元的状转换图(有限自动机):
广告