以下会有多少令牌?
int a [2] [3];
我认为令牌是 - > {'int','[',']','[',']',';'}
有人可以解释在编译器计算令牌时要考虑什么以及什么不能解决?
由于
答案 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]。