Using "编译器原理、技术和工具,第二版。 http://www.pearsonhighered.com/educator/product/Compilers-Principles-Techniques-and-Tools/9780321486813.page" (世界猫) https://www.worldcat.org/title/804295189作者:Aho、Lam、Sethi 和 Ullman,又名紫龙书 http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools#Second_edition,
莱克梅页。 111
词位是源程序中的字符序列,
匹配标记的模式并由词法标识
分析器作为该令牌的实例。
令牌页。 111
令牌是由令牌名称和可选属性组成的对
价值。代币名称是一个抽象符号,代表一种
词汇单元,例如特定的关键字或输入序列
表示标识符的字符。令牌名称是输入
解析器处理的符号。
图案页。 111
模式是对标记的词位可能的形式的描述
拿。在关键字作为标记的情况下,模式只是
构成关键字的字符序列。对于标识符和一些
其他标记,模式是更复杂的结构,匹配
许多字符串。
图 3.2:代币示例第 112 页
[Token] [Informal Description] [Sample Lexemes]
if characters i, f if
else characters e, l, s, e else
comparison < or > or <= or >= or == or != <=, !=
id letter followed by letters and digits pi, score, D2
number any numeric constant 3.14159, 0, 6.02e23
literal anything but ", surrounded by "'s "core dumped"
为了更好地理解与词法分析器和解析器的关系,我们将从解析器开始,然后逆向分析输入。
为了更容易地设计解析器,解析器不直接处理输入,而是接受词法分析器生成的标记列表。查看图 3.2 中的标记列,我们会看到以下标记if
, else
, comparison
, id
, number
and literal
;这些是令牌的名称。通常,对于词法分析器/解析器来说,标记是一种结构,它不仅保存标记的名称,还保存组成标记的字符/符号以及组成标记的字符串的开始和结束位置,其中用于错误报告、突出显示等的开始和结束位置。
现在词法分析器接受字符/符号的输入,并使用词法分析器的规则将输入字符/符号转换为标记。现在,使用词法分析器/解析器的人们对他们经常使用的东西有自己的说法。您所认为的构成标记的字符/符号序列就是使用词法分析器/解析器的人所说的词法。因此,当您看到词位时,只需考虑代表标记的字符/符号序列。在比较示例中,字符/符号的序列可以是不同的模式,例如<
or >
or else
or 3.14
, etc.
考虑两者之间关系的另一种方式是,标记是解析器使用的编程结构,它具有称为词素的属性,用于保存输入中的字符/符号。现在,如果您查看代码中标记的大多数定义,您可能不会将词素视为标记的属性之一。这是因为令牌更有可能保存表示令牌和词位的字符/符号的开始和结束位置,可以根据需要从开始和结束位置导出字符/符号序列,因为输入是静态的。