Regex 如何基于给定的正则表达式构造CFG
我试图找出如何基于给定的正则表达式构造CFG(上下文无关语法)。 例如,a(ab)*(a | b) 我认为有一个算法可以通过,但它确实令人困惑。 以下是我到目前为止得到的信息:Regex 如何基于给定的正则表达式构造CFG,regex,algorithm,context-free-grammar,Regex,Algorithm,Context Free Grammar,我试图找出如何基于给定的正则表达式构造CFG(上下文无关语法)。 例如,a(ab)*(a | b) 我认为有一个算法可以通过,但它确实令人困惑。 以下是我到目前为止得到的信息: S->aAB; A->aAb|empty; B->a|b; 这个看起来对吗? 任何帮助都将不胜感激。将CFG分为三个部分,分别用于a、(ab)*和(a | b) 对于(a | b),您的b->a | b是正确的 (ab)*表示字符串,如ab、abab、abababab等。因此
S->aAB;
A->aAb|empty;
B->a|b;
这个看起来对吗?
任何帮助都将不胜感激。将CFG分为三个部分,分别用于
a
、(ab)*
和(a | b)
对于(a | b)
,您的b->a | b
是正确的
(ab)*
表示字符串,如ab
、abab
、abababab
等。因此A->abA | empty
将是正确的产品
因此,完整语法变成:
S -> aAB
A -> abA | empty
B -> a | b
注意:
A->aAb | empty
将派生字符串,如ab
、aabb
、aaabb
等等,这些字符串不是A,也不可能表示A。为给定正则表达式构造上下文无关语法的另一种方法是:
X->TY
。如果您的CFG表示法允许,则每个最终状态F都会获得一条规则,其形式为F->epsilon
。如果CFG符号不允许这样的规则,那么对于终端t上从状态X到最终状态F的每次转换,生成规则X->t
(除了已经描述的规则X->t F
)。结果是一个规则语法,一个上下文无关的语法,它遵守附加的约束,即每个右侧最多有一个非终结符S -> a A1
A1 -> a A2
A2 -> b B3
B3 -> a A2
B3 -> a A4
B3 -> b B5
A1 -> a A4
A1 -> b B5
A4 -> epsilon
B5 -> epsilon
epsilon ->
或者,如果我们不希望规则的右侧为空,请删除该语法的最后三条规则并添加:
A1 -> a
A1 -> b
B3 -> a
B3 -> b
与其他方法相比,这种方法的缺点是生成的语法比需要的更详细,并且优点是派生可以完全是机械的,这意味着不需要仔细思考就可以更容易地获得正确的结果。您好,欢迎使用StackOverflow。这里的问题通常包括到目前为止您尝试过的一些信息,以及您面临的特定问题。这个问题更广泛地要求一个通用算法,这可能可以在网上的其他地方找到;不要试图在评论中包含代码。对不起,这是我的第一篇文章,仍在试图弄清楚这个论坛是如何工作的。应该是'A1->B5'。谢谢。这个例子背后的理论就在这里:()