我们是否必须假设解析器提前预读令牌?

时间:2016-10-05 16:53:37

标签: parsing token lexer lemon

在多年之后回到词法分析器和解析器之后,我发现自己对于状态变化的概念感到困惑,出于上下文的目的。我正在使用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:”生成GROUPNAME的模式,如果模式是它应该。

编辑:刚刚在维基百科上发现了“lexer hack”条目,总结了这个问题:

  

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

除了(这是我的问题)你对解析器预读令牌有什么假设?如果解析器正在抨击并阅读更多令牌以进行更好的匹配 - 我希望它至少在某种程度上可以做到,它很可能会遇到这样的情况:解析器中的状态更改对于词法分析器来说太晚了它已经满足并处理了该令牌!

或者我是否想过这个?

1 个答案:

答案 0 :(得分:0)

我或许可以回答我自己的问题。我认为任何依赖于解析器内部工作的东西都可能是一个糟糕的计划。

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