思考了很久上下文无关文法的名称含义。其实重点区别就在于产生式左侧。上下文无关文法强调左侧只可以为一个非终结符,也就意味着读入字符串后,只要当前字符与产生式相匹配时,就可以进行替换;而上下文有关文法则需要满足产生式左侧的所有部分才可以,不能直接对单个非终结符进行替换。
上下文无关文法:
//产生式
A->baa
S->aAc //无需考虑A前后是a还是b再进行替换,直接读到A开始即可
//推导
S=>aAc
=>abaac
上下文有关文法:
//产生式
aAc->aab
S->aAcd//非终结符A左右两侧(即上下文)符合产生式,可以进行替换
B->bA//A上下文不符合,不可以替换
//推导
S=>aAcd
=>aaabcd
所以通俗的来讲,上下文有关文法允许多个终结符和非终结符出现在左侧(左侧存在多个符号);而上下文无关文法左侧仅可以出现一个非终结符,相较于1型文法,2型限制条件更多了。