为什么我们将语法转换为乔姆斯基普通形式?有优势吗?
答案 0 :(得分:3)
首先,您可以在Chomsky Normal Form语法中使用CYK算法
答案 1 :(得分:1)
例如,CNF(或其衍生树)中的语法用于证明无上下文语言的抽象引理。
答案 2 :(得分:0)
Chomsky普通形式使多项式时间算法能够决定是否可以通过语法生成字符串。 如果您了解动态编程,该算法非常灵活......
如果您输入的长度(I)为n,那么您将采用dd nxn的2d数组(A)。
A [i,j]表示语法G中可以导出子串I(i,j)的所有符号。
所以最后如果A [1,n]包含起始符号(S),则意味着字符串I可以由S导出,这是我们想要检查的内容。
def decide (string s,grammar G):
//base case
for i=1 to n:
N[i,i]=I[i] //as the substring of length one can be generated by only a
terminal.
//end base case
//induction
for s=1 to n: //length of substring
for i=1 to n-s-1: //start index of substring
for j=i to i+s-1: //something else
if there exists a rule A->BC such that B belongs to N[i,j] and C
belongs to N[j+1,i+s-1] then add A to N[i,i+s-1]
//endInduction
if S belongs to N[1,n] then accept else reject.
我知道索引看起来很疯狂。但基本上这里发生了什么。
- 基本情况非常清楚我认为
- 在归纳步骤中,我们为长度小于s的所有解决方案中的长度s子串构建解决方案。
- 你从索引1开始找到长度为5的子串(sub
)的解决方案。然后你开始一个循环(其他部分).....它检查是否有规则(A - > BC)使得B和C导出sub的两个连续且不相交的子串,如果是这样,则将所有这样的A加到N [1,6]。
- 最后,如果您在N [1,n]中有开始符号,那么您接受!
答案 3 :(得分:0)
使用乔姆斯基范式的优点是:
2.启用解析 PDA 用于解析具有任何语法的单词,这是不方便的。范式为我们提供了更多的结构,从而使解析算法更容易。
例如,CYK 算法使用 Chomsky 范式。另一方面,Greibach 范式支持递归下降解析;尽管可能需要回溯,但空间复杂度是线性的。