什么是编译器设计中的词法分析设计?
可以使用转换图设计词法分析。
Finite Automata (Transition Diagram) - 用于识别令牌的有向图或流程图。
过渡图有两部分 -
状态- 它由圆圈表示。
边缘- 状态由边缘箭头连接。
示例- 为“if”关键字绘制转换图。
为了识别 Token ("if"),词法分析还必须读取 "f" 之后的下一个字符。根据下一个字符,它会判断是否是“if”关键字或其他内容。
因此,“if”后的空格确定“If”是关键字。
最终状态 3 上的“*”表示撤回,即控制将再次回到先前的状态 2。因此空格不是令牌的一部分(“如果”)。
标识符的转换图- 标识符以字母开头,后跟字母或数字。过渡图将是:
例如,In 语句int a2; 标识符a2的转换图将是:
由于 (;) 不是标识符 ("a2") 的一部分,因此使用 "*" 表示 Retract,即返回状态 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 中,Retract () 将使指针返回一个状态,即返回状态 1,并声明在状态 1 之前找到的任何东西都是令牌。
词法分析会将token返回给Parser,不是以英文单词的形式,而是以pair的形式,即(Integer code, value)。
在标识符的情况下,返回给解析器的整数代码为6,如表所示。
Install () - 它将返回一个指向符号表的指针,即令牌的地址。
下表显示了词法分析返回给解析器的各种标记的整数代码和值。
不同令牌的整数代码
令牌 | 整数代码 | 价值 |
---|---|---|
Begin | 1 | - |
结尾 | 2 | - |
如果 | 3 | - |
然后 | 4 | - |
别的 | 5 | - |
标识符 | 6 | Pointer to Symbol Table |
常数 | 7 | Pointer to Symbol Table |
< | 8 | 1 |
<= | 8 | 2 |
= | 8 | 3 |
<> | 8 | 4 |
> | 8 | 5 |
>= | 8 | 6 |
这些整数值不是固定的。不同的程序员在设计词法分析时可以选择其他整数代码和值。
假设,如果标识符存储在符号表中的位置 236,那么
类似地,如果常量存储在位置 238,则
整数代码 = 7
安装 () = 238 即,对将是 (7, 238)
令牌的转换图(有限自动机) -
以上是 什么是编译器设计中的词法分析设计? 的全部内容, 来源链接: utcz.com/z/363280.html