令牌(编译器)的数量是多少?

What will be number of tokens(compiler)?

接下来的代币数量是多少?

int a[2][3];

我认为代币是 -> {'int', '[', ']', '[', ']', ';'}

有人可以解释编译器计算令牌时要考虑什么,不考虑什么吗?

谢谢

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

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

的标记序列
IDENTIFIER, IDENTIFIER, DIMENSION, DIMENSION, TERMINATOR

更可能的方法可能被描述为

IDENTIFIER, IDENTIFIER, OPEN_BRACKET, INTEGER, CLOSE_BRACKET, OPEN_BRACKET,
        INTEGER, CLOSE_BRACKET, TERMINATOR

要考虑的问题包括

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

更新添加:

C 标准确实根据特定标记化定义了 post 预处理语言,对于您给出的语句,这将是我指定的 "most likely" 替代方案(这就是为什么它是最有可能的)。然而,我已经从更一般的意义上回答了这个问题,部分原因是它被标记为 [compiler-construction]。