什么是令牌(编译器)?

时间:2015-12-08 17:06:42

标签: c compiler-construction token

以下会有多少令牌?

int a [2] [3];

我认为令牌是 - > {'int','[',']','[',']',';'}

有人可以解释在编译器计算令牌时要考虑什么以及什么不能解决?

由于

1 个答案:

答案 0 :(得分:0)

扩展我的评论: 如何对输入进行标记化是您的标记器(扫描仪)的功能。原则上,您提供的输入可能会被标记为"int""a""[2]""[3]"";"。在实践中,最有可能的标记化选择是"int""a""[""2""]""[",{{1 },"3""]"。我不确定为什么你似乎认为变量名和维度值不会在标记中表示 - 它们带有语义信息,因此不能被遗漏。

尽管将编译分为词汇分析步骤和语义分析步骤是常见的并且被广泛认为是有用的,但根本不必进行这种分离。在制作它的地方,标记化的选择取决于编译器。一个人通常选择令牌,以便每个代表一个语义上重要的单位,但有不止一种方法可以做到这一点。例如,我的替代示例对应于可能被表征为

的令牌序列
";"

更可能的方法可能被定性为

IDENTIFIER, IDENTIFIER, DIMENSION, DIMENSION, TERMINATOR

要考虑的问题包括

  • 源的哪些单元本身包含有意义的语义信息?例如,将每个字符设为单独的标记或将IDENTIFIER, IDENTIFIER, OPEN_BRACKET, INTEGER, CLOSE_BRACKET, OPEN_BRACKET, INTEGER, CLOSE_BRACKET, TERMINATOR 拆分为两个标记是没有用的,因为这些标记不代表完整的语义单元。
  • 您可以或应该对词法分析器承担多少责任(例如,了解上下文足以呈现int而不是DIMENSION

已更新以添加

C标准确实根据特定的标记化定义了预处理语言,对于您提供的语句,该标准化最常见的是"我指定的替代方案(以及它最有可能的原因之一)。然而,我在更广泛的意义上回答了这个问题,部分原因是它被标记为[compiler-construction]。