regex - 如何根据给定的正则表达式构造一个CFG

标签 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)* 表示 abababababab 等字符串。所以 A -> abA | empty 是正确的产生式。

因此,完整的语法变成:

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

注意:A -> aAb | empty 将派生字符串,如 abaabbaaabbb 等,这不是 regular language , 并且不可能代表 regular expression .

关于regex - 如何根据给定的正则表达式构造一个CFG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23448734/

相关文章:

algorithm - 非重叠购买的最佳顺序

parsing - 测试语法的歧义

javascript - 如何用正则表达式匹配和替换所有不是数字或破折号的字符作为第一个字符?

基于文件名的 Linux 文件系统正则表达式搜索

algorithm - 如何确定笛卡尔积中单个单元格的值

javascript - 在一个数组中查找小于或等于另一个数组中的数字的数字?

parsing - 这个语法是 LR(1) 而不是 SLR(1)?

c# - C#中的语法生成类实现

regex - 更换信用卡号码

python - 在 python 中使用 re.search 时执行时间增加