2011-02-22 54 views
1

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

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

我的意思是,他们都来自同一个地方读书,因为我不希望同样的源多次读取,也就是说,没有多遍允许,以避免不必要的词法分析器重复工作。我只是希望当刚刚生成下一个令牌时,两个解析器都会同时使用它。

但我可以调用这些分析器一个只有一个顶级函数;不能同时调用两者:/

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

我从来没有见过这样的配置。这样做有没有可能建立一个解析器?是否有关于如何在代码中构造这种解析器的一些材料?有没有任何名字?

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

+2

你必须谈论一些特定的实现(例如Lex/Yacc);如果你正在实施你自己的,你可以简单的设计它。那么你在谈论哪个实现? – 2011-02-22 20:53:46

+0

不使用任何解析器生成器。写我自己的。但是我不知道应该如何构造代码以使其更好。 – SasQ 2011-02-22 22:10:55

+0

这是什么问题?让你的词法分析器返回一个懒惰列表,并且你的两个分析器都会使用它。你可以根据需要堆叠尽可能多的解析器和变换器(并且词法分析器应该与其他解析器不同)。 – 2011-02-22 22:42:52

回答

2

您描述了拉解析器的典型流程。它被调用一次,并且需要控制,直到它的所有输入被完全解析。解析器自己调用词法分析器来获取下一个标记。另一方面,每次新的令牌可用时,都会调用推式解析器。所以你可以为每个新的标记调用几个分析器。古典野牛可以在推模式中使用(细节为there)。 Lemon解析器生成器生成推式解析器。

+0

谢谢。现在我知道至少这个术语。所以我现在感兴趣的是push解析器是如何工作的。我没有使用任何解析器生成器,因为我想了解其内部工作的技巧。 – SasQ 2011-02-22 22:14:06