什么是编译器设计中的词法分析设计?

可以使用转换图设计词法分析。

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 () - 它将返回一个指向符号表的指针,即令牌的地址。

下表显示了词法分析返回给解析器的各种标记的整数代码和值。

         不同令牌的整数代码

         令牌整数代码价值
Begin1-
结尾2-
如果3-
然后4-
别的5-
标识符6Pointer to Symbol Table
常数7Pointer to Symbol Table
<81
<=82
=83
<>84
>85
>=86

这些整数值不是固定的。不同的程序员在设计词法分析时可以选择其他整数代码和值。

假设,如果标识符存储在符号表中的位置 236,那么

类似地,如果常量存储在位置 238,则

整数代码 = 7

安装 () = 238 即,对将是 (7, 238)

令牌的转换图(有限自动机) -