下面的代币数量是多少?
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 标准确实根据特定标记化定义了后预处理语言,对于您给出的语句来说,这将是我指定的“最有可能”的替代方案(这就是它最有可能的原因之一)。然而,我已经从更一般的意义上回答了这个问题,部分原因是它被标记为[编译器构造]。
关于c - token 数量是多少(编译器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34161843/