上下文无关文法的字符串推导方法咨询
上下文无关文法的字符串推导方法咨询
嗨!我来帮你理清楚上下文无关文法(CFG)里字符串推导的具体步骤,咱们一步步拆解你的两个例子,你就能明白怎么规范操作啦~
首先先把你给出的文法定义再明确一下,方便后续推导参考:
$$ G = (V,\sum, S, P) $$
其中:
- 非终结符集合:$$ V = {S, A, B} $$
- 终结符集合:$$ \sum = {a,b,c} $$
- 产生式规则集合$$ P $$:
$$
\begin{cases}
S \rightarrow cA\ |\ bB, \
A \rightarrow c, \
B \rightarrow aB\ |\ b \
\end{cases}
$$
第一个字符串:cc的推导
你的思路方向是对的,但需要把完整的推导链写清楚——推导必须从起始符号S开始,一步步替换非终结符,直到字符串全由终结符组成:
- 观察目标字符串
cc的第一个字符是c,所以我们选择S的第一个产生式:$$ S \Rightarrow cA $$ - 现在字符串里有非终结符
A,根据A的唯一产生式A→c,替换后得到:$$ cA \Rightarrow cc $$
完整推导链就是:
$$ S \Rightarrow cA \Rightarrow cc $$
这就说明cc是该文法可以生成的字符串。
第二个字符串:baaaab的推导
这个字符串开头是b,所以我们从S的第二个产生式开始:
- 第一步:$$ S \Rightarrow bB $$
- 接下来需要生成中间的四个
a,所以每次都用B的第一个产生式B→aB来迭代:
$$ bB \Rightarrow baB \Rightarrow baaB \Rightarrow baaaB \Rightarrow baaaaB $$ - 最后我们需要结尾的
b,所以用B的第二个产生式B→b替换:
$$ baaaaB \Rightarrow baaaab $$
完整推导链是:
$$ S \Rightarrow bB \Rightarrow baB \Rightarrow baaB \Rightarrow baaaB \Rightarrow baaaaB \Rightarrow baaaab $$
给你的推导小技巧
- 先匹配首字符:从起始符号
S开始,先根据目标字符串的第一个终结符,排除掉不符合的产生式,缩小选择范围 - 迭代处理重复模式:如果目标字符串有重复的字符序列(比如这里的多个
a),就重复应用带非终结符的产生式(比如B→aB),直到得到足够的重复次数 - 收尾用终结产生式:当需要结束推导时,选择能直接生成终结符的产生式(比如
A→c、B→b),把最后一个非终结符替换掉
备注:内容来源于stack exchange,提问作者JohnGam
相关产品推荐
相关产品推荐

