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

Parsing 从CFG生成时确定有效的下一个终端集,parsing,grammar,bnf,formal-languages,Parsing,Grammar,Bnf,Formal Languages,我试图从上下文无关的语法生成随机句子。在每个步骤中,根据与此问题无关的一些概率标准确定下一个要生成的非终端。我陷入困境的地方是,给定一个语法和迄今为止生成的部分句子,我如何根据语法确定下一步可以生成的非终结符集 下面是BNF中的语法示例和部分生成 <expr> ::= <term> "+" <expr> | <term> <term> ::= <term> "*" <factor> | <factor>

我试图从上下文无关的语法生成随机句子。在每个步骤中,根据与此问题无关的一些概率标准确定下一个要生成的非终端。我陷入困境的地方是,给定一个语法和迄今为止生成的部分句子,我如何根据语法确定下一步可以生成的非终结符集

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

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


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

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


如果语法是从左到右可解析的,您可以简单地解析前缀,然后选择一个存在非错误操作的终端。这就需要解析表来处理任何适用的从左到右算法。如果算法是LALR(k),您需要注意可能导致最终错误的reduce操作。为了避免这种情况,如果您决定选择reduce操作,请不要提交到相应的lookahead符号。仅在执行shift时提交。(但也不能忽略与reduce操作对应的lookahead;您需要保留整个集合,以便确保始终选择lookahead符号。)

谢谢你的回答。在我的情况下,我没有选择一个产品来替换最后一个非终端。相反,我有一个所有终端的词汇表可供选择,并且在生成的每个步骤中,我希望根据前缀将选择限制在合法终端上。我能不解析前缀和基因吗以与我确定下一个标记的方式兼容的方式直接对句子进行评分?