1

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

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

我的意思是,他们都从同一个地方读取,因为我不想多次读取同一个源,即不允许多次传递,以避免在词法分析器中进行不必要的重复工作。我只希望当序列中的下一个标记刚刚生成时,两个解析器同时使用它。

但是我只能在这些解析器之一中调用一个顶级函数;不能同时调用两者:/

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

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

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

4

1 回答 1

3

您描述了拉式解析器的典型流程。它被调用一次,它会控制直到它的所有输入被完全解析。Parser 自己调用 lexer 来获取下一个令牌。另一方面,每次有新令牌可用时都会调用推送解析器。因此,您可以为每个新令牌调用多个解析器。Classic Bison 可以在推送模式下使用(详情请参阅Lemon解析器生成器生成推送解析器。

于 2011-02-22T21:58:00.217 回答