从CFG生成时确定有效的下一个终端的集合

时间:2017-05-02 22:23:19

标签: parsing grammar bnf formal-languages

我试图从无上下文语法中生成随机句子。在每个步骤期间,根据与该问题无关的一些概率标准确定要生成的下一个非终端。我被困的地方是,给定一个语法和到目前为止生成的部分句子,如何根据语法确定下一步可以生成的非终端集合?

以下是BNF中的示例语法和部分生成。

<expr> ::= <term> "+" <expr> | <term>
<term> ::= <term> "*" <factor> | <factor>
<factor> ::= "(" <expr> ")" | <const>
<const> ::= "0" | "1" | "2" | "3" | "4"

到目前为止假设生成的序列:( 1 +。在这种情况下,我们可以很容易地看到要生成的下一个标记应该来自集合{"(", "0", "1", "2", "3", "4"}

是否有算法在给定一般语法和部分生成的情况下确定此集合,或者以在每一步中使该集合可用的方式生成句子?

1 个答案:

答案 0 :(得分:0)

生成句子的常用方法是从开始符号开始,然后使用与此答案不完全相关的抽样标准,用其中一个产品重复替换第一个(或最后一个)非终端。

如果语法是从左到右可解析的,您可以简单地解析前缀,然后选择其中一个存在非错误操作的终端。这需要解析表,适用于任何从左到右的算法。如果算法是LALR(k),则需要注意导致最终错误的减少操作。要避免这种情况,如果您决定选择reduce操作,请不要提交相应的前瞻符号。只有在进行班次时才会提交。 (但你也不能忽略与reduce动作相对应的前瞻;你需要保留整个集合,以便确保一致地选择前瞻符号。)