上下文无关文法的算法
Algorithm for a Context Free Grammar
我正在尝试设计一种算法,将 CFG G 和终结符号 a 作为输入,如果 S(G 的起始规则)可以生成以 a 开头的句子形式,则输出 yes。即,如果 (T U N)* 中有一个字符串 α 使得 S =>* aα ,否则它输出 no。例如,如果文法是 S - > [S] |党卫军 | ε,如果 a = ],答案是否定的。我不是在寻找代码,我只是想了解我应该如何在伪代码中处理这个主题。
您可以 运行 只是 Earley parser 的预测器,直到它停止预测,然后查看它是否生成任何以相关终端开头的规则。
或者自下而上,将所有接受该终端的非终结符标记为第一个输入,然后将所有接受已标记的非终结符作为第一个输入的非终结符标记为第一个输入,重复直到完成,看是否S 在标记的非终结符集合中。
X
可以通过三种方式导出以 a
开头的字符串。
- 有一个形式为
X -> a...
的规则
- 有一个
X -> A...
形式的规则,A
导出一个以 a
开头的字符串。
- 有一个形式为
X -> B A...
的规则,B
导出 ε
,A...
导出一个以 a
开头的字符串。
您可以使用这些来构建一个算法,该算法查看以 S -> ...
形式的规则开头的所有语法规则,如果 rhs 以终端开头,则应用检查 1 或同时检查 2 和3 如果它以非终结符开头。每个检查对应一个(可能是递归的)函数returning 一个布尔值。
一个有趣的细节是需要处理语法中的循环,例如单一规则,例如 A -> A a
,还有 A -> B...
、B -> C...
、C -> A...
。如果您不小心,相互递归检查将无限重复。我会让你的。想想深度优先搜索如何避免永远跟随图中的循环。
另一个细节是如何确定给定的非终结符 B 是否派生 ε
。您应该能够自己解决这个问题,但如果所有其他方法都失败了,请查找 "nullable non-terminal." 您会找到一个众所周知的小算法。
如果任何检查是肯定的,return是的。否则规则的详尽应用是没有办法的。 Return没有
我正在尝试设计一种算法,将 CFG G 和终结符号 a 作为输入,如果 S(G 的起始规则)可以生成以 a 开头的句子形式,则输出 yes。即,如果 (T U N)* 中有一个字符串 α 使得 S =>* aα ,否则它输出 no。例如,如果文法是 S - > [S] |党卫军 | ε,如果 a = ],答案是否定的。我不是在寻找代码,我只是想了解我应该如何在伪代码中处理这个主题。
您可以 运行 只是 Earley parser 的预测器,直到它停止预测,然后查看它是否生成任何以相关终端开头的规则。
或者自下而上,将所有接受该终端的非终结符标记为第一个输入,然后将所有接受已标记的非终结符作为第一个输入的非终结符标记为第一个输入,重复直到完成,看是否S 在标记的非终结符集合中。
X
可以通过三种方式导出以 a
开头的字符串。
- 有一个形式为
X -> a...
的规则
- 有一个
X -> A...
形式的规则,A
导出一个以a
开头的字符串。 - 有一个形式为
X -> B A...
的规则,B
导出ε
,A...
导出一个以a
开头的字符串。
您可以使用这些来构建一个算法,该算法查看以 S -> ...
形式的规则开头的所有语法规则,如果 rhs 以终端开头,则应用检查 1 或同时检查 2 和3 如果它以非终结符开头。每个检查对应一个(可能是递归的)函数returning 一个布尔值。
一个有趣的细节是需要处理语法中的循环,例如单一规则,例如 A -> A a
,还有 A -> B...
、B -> C...
、C -> A...
。如果您不小心,相互递归检查将无限重复。我会让你的。想想深度优先搜索如何避免永远跟随图中的循环。
另一个细节是如何确定给定的非终结符 B 是否派生 ε
。您应该能够自己解决这个问题,但如果所有其他方法都失败了,请查找 "nullable non-terminal." 您会找到一个众所周知的小算法。
如果任何检查是肯定的,return是的。否则规则的详尽应用是没有办法的。 Return没有