Regex 如何基于给定的正则表达式构造CFG

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等。因此

我试图找出如何基于给定的正则表达式构造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
等。因此
A->abA | empty
将是正确的产品

因此,完整语法变成:

S -> aAB
A -> abA | empty
B -> a | b

注意:
A->aAb | empty
将派生字符串,如
ab
aabb
aaabb
等等,这些字符串不是A,也不可能表示A。

为给定正则表达式构造上下文无关语法的另一种方法是:

  • 构造一个有限状态机,它接受与正则表达式相同的语言
  • 创建一个语法,其终端是正则表达式字母表中的终端,其非终端是(或对应于1:1)状态机中的状态,并且对于终端符号t上从状态X到状态Y的每个状态机转换,其规则的形式为
    X->TY
    。如果您的CFG表示法允许,则每个最终状态F都会获得一条规则,其形式为
    F->epsilon
    。如果CFG符号不允许这样的规则,那么对于终端t上从状态X到最终状态F的每次转换,生成规则
    X->t
    (除了已经描述的规则
    X->t F
    )。结果是一个规则语法,一个上下文无关的语法,它遵守附加的约束,即每个右侧最多有一个非终结符
  • 对于给定的示例,假设我们构造了以下FSA(其中许多FSA接受与正则表达式相同的语言):

    由此可直接导出以下规则语法:

    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'。谢谢。这个例子背后的理论就在这里:()