将词法分析器与许多解析器相结合

时间:2011-02-22 20:51:24

标签: parsing architecture lexer recursive-descent top-down

我知道词法分析器和解析器的典型配置,其中词法分析器读取源代码并生成标记,然后将标记指向解析器,解析器在语法生成中将它们用作终端符号。在典型的递归下降解析器中,首先调用一些表示起始非终结符的顶级函数,此函数调用其他函数并从词法分析器中读取令牌。

但是如果我需要两个不同的解析器在同一个词法分析器上呢?

我的意思是,他们两个都是从同一个地方读书,因为我不想多次阅读相同的来源,也就是说,不允许多次通过,以避免不必要的重复工作词法分析者。我只是希望当刚刚生成序列中的下一个标记时,两个解析器同时使用它。

但我只能在一个这些解析器中调用一个顶级函数;不能同时打电话:/

是否有某种方法可以某种步模式运行这些解析器? 也就是说,当我有一个新的令牌时,我想一个接一个地将它传递给两个解析器,但只是通过那个令牌推进它们,尽可能地更新它们的内部状态和数据结构,并立即返回等待另一个令牌。

我从来没有见过这种配置。是否有可能以这种方式构建解析器?是否有一些关于如何在代码中构造这种解析器的材料?它有什么名字吗?

编辑1: 我不想使用任何解析器生成器工具,而是自己编写代码,因为我想了解这种内部如何在内部工作。

1 个答案:

答案 0 :(得分:2)

您描述了拉解析器的典型流程。它被调用一次,直到它的所有输入被完全解析为止。解析器自己调用lexer来获取下一个令牌。另一方面,每当新令牌可用时,就会调用推送解析器。因此,您可以为每个新令牌调用多个解析器。经典野牛可以在推模式下使用(详情为there)。 Lemon解析器生成器生成推送解析器。