Parsing 将lexer与多个解析器相结合

Parsing 将lexer与多个解析器相结合,parsing,architecture,lexer,recursive-descent,top-down,Parsing,Architecture,Lexer,Recursive Descent,Top Down,我知道lexer和parser的一个典型配置,其中lexer读取源代码并生成标记,然后将这些标记定向到解析器,解析器将它们用作语法产品中的终端符号。在一个典型的递归下降解析器中,首先调用一些表示起始非终结符的顶级函数,该函数调用其他函数并从lexer中逐个令牌读取 但是如果在同一个lexer上需要两个不同的解析器呢 我的意思是,它们都从同一个地方读取,因为我不想多次读取同一个源,也就是说,不允许多次传递,以避免lexer中不必要的重复工作。我只希望当序列中的下一个令牌刚刚生成时,两个解析器同时使

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

但是如果在同一个lexer上需要两个不同的解析器呢

我的意思是,它们都从同一个地方读取,因为我不想多次读取同一个源,也就是说,不允许多次传递,以避免lexer中不必要的重复工作。我只希望当序列中的下一个令牌刚刚生成时,两个解析器同时使用它

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

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

我以前从未见过这种配置。这样构建解析器有可能吗?有没有关于如何在代码中构造这种解析器的资料?有名字吗

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

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

您必须讨论一些特定的实现(例如Lex/Yacc);如果你正在实现你自己的,你可以简单地在设计时考虑到这一点。那么您在谈论哪种实现呢?不使用任何解析器生成器。我自己写。但我不知道应该如何构造代码以使其良好运行。问题是什么?让lexer返回一个惰性列表,两个解析器都将使用它。您可以堆叠任意数量的解析器和转换器(lexer不应该与其他解析器有任何不同)。问题不在于lexer,而在于解析器。如何编写代码,使其逐步使用,而不是从上到下一次调用?推式解析器仍然是自顶向下的解析器吗?还是别的什么动物?(干杯?)谢谢。现在我至少知道了术语。所以我现在感兴趣的是push解析器是如何工作的。我没有使用任何解析器生成器,因为我想了解其内部工作的技术。