我正在研究YACC,终端符号与令牌的概念不断出现。有人可以向我解释一下有什么区别,或者指出一篇可能有用的文章或教程吗?
答案 0 :(得分:2)
它们实际上是同一个名称的两个名称,但通常“终端”用于描述解析器正在使用的内容,而“token”用于描述源中符号的相应序列。
在像yacc
这样的解析器生成器中,语言的语法是根据“终端”的“字母”定义的。 “字母”这个词有点令人困惑,因为它们是字符串,而不是字母。但是从解析器的角度来看,每个终端都是一个不可分割的单元,与同类终端的任何其他用途都无法区分。所以源代码:
total = 17 + subtotal;
将以如下内容的形式呈现给解析器:
ID EQUALS NUMBER PLUS ID SEMICOLON
解析器看到的终端流与输入语言的子串之间存在对应关系。所以我们说“令牌”total
是“终端”ID
的一个实例。对应于给定终端可能存在无限数量的潜在令牌(或者它们可能只是一个,如终端{{1}}),但解析器实际使用的是一组有限的终端。