0

多年后回到词法分析器和解析器,出于上下文的目的,我发现自己对状态变化的概念感到困惑。我使用 Lemon 作为解析器,并把我自己的词法分析器放在一起。

让我们看一个像这样的输入示例:

[groups]
syscon:
    0x000   sysmemremap
    0x004   presetctrl

[registers]
sysmemremap:
    map     1-0
    rsvd    31-2
presetctrl:32
    mux     2-0
..etc...

所以“syscon:”和“sysmemremap:”看起来一样,但一个是 GROUPNAME,另一个是 REGISTERNAME。[groups] 和 [registers] 之间的上下文变化决定了每个令牌在现实中是什么。

是最适合进行上下文更改的解析器吗?由于解析器没有分段语法,其中一组语法适用于一组情况,另一组适用于不同的情况,我认为词法分析器应该是决定“syscon:”如果模式是这样它应该。

编辑:刚刚在维基百科中发现了总结问题的“词法分析器黑客”条目:

如果没有添加上下文,词法分析器无法区分类型标识符和其他标识符,因为所有标识符都具有相同的格式。.... 解决方案通常包括将语义符号表中的信息反馈回词法分析器。也就是说,不是作为从词法分析器到解析器的纯单向管道,而是从语义分析返回到词法分析器的反向通道。

除了(这是我的问题)你能假设解析器预读令牌是什么?如果解析器向前冲并读取更多标记以进行更好的匹配——我希望它至少在某种程度上会这样做,它很可能会遇到解析器中的状态更改对于词法分析器来说为时已晚的情况,因为它已经遇到并处理了该令牌!

还是我想多了?

4

1 回答 1

0

我也许可以回答我自己的问题。我认为对解析器内部所做的任何形式的依赖都可能是一个糟糕的计划。

现在我找到了我的 Lex 和 Yacc 书(O'Reilly 的书),Lex 部分中的示例之一是状态更改 - 如果它看到“动词”这个词,它开始定义动词而不是查看它们向上。这项工作是在词法分析器中完成的,所以我想这就是它的方式 - 在词法分析器中完成。

于 2016-10-05T17:44:39.517 回答