令牌如何管理?

时间:2015-03-22 03:42:07

标签: compiler-construction

请解释以下段落

  

通常使用词法分析器/解析器,令牌是一种结构,它不仅包含令牌的名称,还包含构成令牌的字符/符号以及构成令牌的字符串的起始和结束位置,开始和结束位置用于错误报告,突出显示等。   令牌更可能保持表示令牌和词位的字符/符号的起始位置和结束位置,可以根据需要从起始位置和结束位置导出字符/符号序列,因为输入是静态的。

我不明白令牌将持有的开始和结束位置,请澄清它。

1 个答案:

答案 0 :(得分:0)

将源代码位置信息附加到令牌有很多原因,包括:

  • 解析器需要它们才能以用户友好的方式报告语法错误。如果解析器无法访问源代码位置,则用户可能必须扫描整个文件,查找与解析器报告的内容一致的语法错误,因为它无法告诉您它发生的位置。 / LI>
  • 编译器的后续阶段可能还需要访问源代码位置。例如,您可能希望在二进制文件中包含调试信息。如果是这种情况,则需要修改编译器中的其他数据结构以携带和转发此信息(例如ASTIR)。

您不一定要存储所有(开始和结束行/列)。通常存储令牌开始的行就足够了。但是,位置越精确,您就越能够进行错误报告。请考虑以下代码段:

int x;
Foo y;

int z = x + y;

假设没有为+定义(int, Foo)运算符。只知道每个令牌的行号的编译器将仅限于报告错误,例如:

<file>:4: Error: Operator + is not defined for (int, Foo).

如果我们添加列号,我们会突然知道+符号的确切位置。这使我们能够报告更好的错误消息:

<file>:4: Error: Operator + is not defined for (int, Foo).
          In statement: int z = x + y;
          ------------------------^

如果这个简单的例子没有说服你,我建议将最近的clang产生的错误与旧的gcc进行比较。