请解释以下段落
通常使用词法分析器/解析器,令牌是一种结构,它不仅包含令牌的名称,还包含构成令牌的字符/符号以及构成令牌的字符串的起始和结束位置,开始和结束位置用于错误报告,突出显示等。 令牌更可能保持表示令牌和词位的字符/符号的起始位置和结束位置,可以根据需要从起始位置和结束位置导出字符/符号序列,因为输入是静态的。
我不明白令牌将持有的开始和结束位置,请澄清它。
答案 0 :(得分:0)
将源代码位置信息附加到令牌有很多原因,包括:
您不一定要存储所有(开始和结束行/列)。通常存储令牌开始的行就足够了。但是,位置越精确,您就越能够进行错误报告。请考虑以下代码段:
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进行比较。