Parsing CFG生成规则在代码中是什么样子的?

Parsing CFG生成规则在代码中是什么样子的?,parsing,grammar,context-free-grammar,context-free-language,Parsing,Grammar,Context Free Grammar,Context Free Language,有这么多的信息在那里,但没有这真的帮助了像我这样的noob。我读了很多关于上下文无关语言和下推自动化的文章。现在,我正试图理解某些东西在代码中的外观 假设我们定义了一种语言,例如: L = {am bn | m >= n} 为我们提供以下生产规则: S -> B | ^ B -> aBb | A A -> aA | a 这在伪代码中到底是什么样子?我假设所有产生式规则都是定义为S1的1个状态,或者它们都是独立的状态?不管怎样,我都不知道,如果有人能帮我

有这么多的信息在那里,但没有这真的帮助了像我这样的noob。我读了很多关于上下文无关语言和下推自动化的文章。现在,我正试图理解某些东西在代码中的外观

假设我们定义了一种语言,例如:

 L = {am bn | m >= n} 
为我们提供以下生产规则:

 S -> B   | ^
 B -> aBb | A
 A -> aA  | a
这在伪代码中到底是什么样子?我假设所有产生式规则都是定义为S1的1个状态,或者它们都是独立的状态?不管怎样,我都不知道,如果有人能帮我理解这是怎么回事,那就太好了


我知道我们分析输入的字符,并根据我们得到的输入,将符号推入PDAs堆栈的规则之一。

有多种方法可以将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的《解析技术:实用指南》。有多种方法可以将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的《解析技术:实用指南》。

具体来说,您希望代码做什么?具体点。CFG描述语言。是否希望代码输出解析树?是否希望代码识别语言中的字符串?还是生成它们?如果生成它们,哪些是?你没有时间全部生成它们。你的产生式规则只生成m>n的字符串,相等是不可能的。正如Patrick所说,如果你想要一个算法,你应该具体指定哪个问题。@PeterLeupold好的,我今天将更新我的问题。你是对的,缺少很多信息,我将编辑我的示例。具体来说,你希望你的代码做什么?具体点。CFG描述语言。是否希望代码输出解析树?是否希望代码识别语言中的字符串?还是生成它们?如果生成它们,哪些是?你没有时间全部生成它们。你的产生式规则只生成m>n的字符串,相等是不可能的。正如Patrick所说,如果你想要一个算法,你应该具体指定哪个问题。@PeterLeupold好的,我今天将更新我的问题。你是对的,很多信息都丢失了,我将编辑我的示例。