Algorithm 上下文无关文法的算法
我正试图设计一种算法,将CFG G和终端符号a作为输入,如果S(G的起始规则)可以生成以a开头的句子形式,则输出yes。i、 例如,如果(tun)*中有一个字符串α,那么S=>*aα,否则它输出no。例如,如果语法是S->[S]| SS |ε,如果a=],答案是no。我不是在寻找代码,我只是试图理解我应该如何用伪代码处理这个主题。你可以只运行an的预测器,直到它停止预测,并查看它是否生成任何以所讨论的终端开始的规则Algorithm 上下文无关文法的算法,algorithm,computer-science,context-free-grammar,computation-theory,Algorithm,Computer Science,Context Free Grammar,Computation Theory,我正试图设计一种算法,将CFG G和终端符号a作为输入,如果S(G的起始规则)可以生成以a开头的句子形式,则输出yes。i、 例如,如果(tun)*中有一个字符串α,那么S=>*aα,否则它输出no。例如,如果语法是S->[S]| SS |ε,如果a=],答案是no。我不是在寻找代码,我只是试图理解我应该如何用伪代码处理这个主题。你可以只运行an的预测器,直到它停止预测,并查看它是否生成任何以所讨论的终端开始的规则 或者从下至上,标记所有接受相关终端作为其第一个输入的非终端,然后标记所有接受已标
或者从下至上,标记所有接受相关终端作为其第一个输入的非终端,然后标记所有接受已标记的非终端作为其第一个输入的非终端,并重复操作,直到完成,并查看S是否在标记的非终结符集中。有三种方法可以派生以
a
开头的字符串
X->a…。
X->a..
和a
派生一个以a
开头的字符串X->ba..
和B
派生ε和a..
派生一个以a
开头的字符串
S->…
格式开始,如果rhs以终端开头,则应用检查1;如果rhs以非终端开头,则同时应用检查2和3。每个检查对应于一个(可能是递归的)返回布尔值的函数
一个有趣的细节是需要处理语法中的循环,例如单个规则,如A->A
,但也包括A->B..
,B->C..
,C->A..
。如果不小心,相互递归检查将无限重复。我会告诉你的。想一想深度优先搜索如何避免图形中永远跟随循环
另一个细节是如何确定给定的非端子B是否导出ε。您应该能够自己解决这个问题,但如果所有其他方法都失败了,请查找“nullable non-terminal”。您将找到一个众所周知的小算法
如果任何检查结果为阳性,请返回yes。否则,彻底应用这些规则是没有办法的。报税表号码