c - token 数量是多少(编译器)?

标签 c compiler-construction token

下面的代币数量是多少?

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/

相关文章:

c - fork多线程进程,为线程分配内存

compiler-construction - 如何在 lex 和 yacc 中读取多行输入?

php - 长时间上传后,Youtube API token 过期

javascript - 如何从angularjs中的响应 header 读取 token

java - 将 token 保存到 ArrayList 中并在 Java 中比较每个 token

c - pThreads如何在没有内存泄漏的情况下终止c中的线程

c - MVC 中奇怪的 sizeof 结果(对齐?)

c - 从一棵空树开始,用大 O 表示法插入红黑树的复杂度是多少?

java - 配置 Java 编译器,使其在缺少注释时给出错误

c# - 为什么附加调试器后即时编译的 C# 代码无法运行?