那里有太多的信息,但不是这个真的有助于像我这样的菜鸟。我读了很多关于无上下文语言和下推自动化的文章。现在我试图了解某些事情在代码中的外观。
让我们假设我们定义了一种语言,如:
L = {am bn | m >= n}
给我们以下生产规则:
S -> B | ^
B -> aBb | A
A -> aA | a
这在伪代码中究竟是什么样的?我假设所有生产规则都是1个状态定义为S1或者它们都是单独的状态?无论哪种方式,我都不知道,如果有人能帮我理解这是如何运作的话会很棒。
我知道我们会分析输入的字符,并根据我们得到的输入之一将符号应用到我们的PDA堆栈中。
答案 0 :(得分:0)
有多种方法可以将CFG转换为一段执行实际解析的代码,每种方法都有其优缺点。
某些算法,如CYK算法,Unger算法,以及(我个人最喜欢的)Earley算法可以将任意CFG和字符串作为输入,然后使用动态编程来确定解析树如果存在,则为该字符串。这些算法的操作与典型的下推自动机不同,因为它们通过填充值表来处理,同时一次处理一个字符。
一些解析算法,尤其是LR(1)和LR解析器的一般系列,更直接地维护解析堆栈并使用有限状态控制来驱动解析器。 LR(1)解析器无法处理所有可能的CFG,但它们只能处理确定性CFG - 但像GLR解析器这样的变体可以通过基本上并行运行多个堆栈来处理所有语法。编译器生成工具bison和yacc在这个系列中生成解析器,如果你看一下他们的输入文件是如何工作的,你就可以了解CFG在软件中是如何编码的。
LL(1)解析器和简单的回溯解析器自上而下工作,通常使用堆栈(通常是运行时调用堆栈)来解析输入字符串。但是,他们无法处理所有语法。 ANTLR解析器生成器在此系列中生成解析器。
Packrat解析器通过使用修改的CFG来工作,这些CFG编码用于尝试的命令的优先级。使用这些解析器的代码倾向于密切反映语法的形状。解析器组合器是另一种现代技术,解析逻辑看起来很像CFG。
我建议你参加一个编译器课程或者阅读一份"解析技术:实用指南"如果您有兴趣了解更多相关信息,请通过Grune和Jacobs。