无上下文语法来表示正则表达式

时间:2013-05-16 16:14:44

标签: regex syntax context-free-grammar javacc

我正在尝试使用无上下文语法来表示简单的正则表达式。我想要的符号是[0-9] [a-z] [A-Z],运算符是“|”,“()”和“。”。对于连接,对于现在的序列我只想要“*”以后我会添加“+”,“?”等。我在javacc中试过这个语法:

void RE(): {}
{
    FINAL(0) ( "." FINAL(0) | "|" FINAL(0))*
}

void FINAL(int sign): { Token t; }
{
    t = <SYMBOL> {
        if ( sign == 1 )
            jjtThis.val = t.image + "*";
        else
            jjtThis.val = t.image;
    }
    | FINAL(1) "*"
    | "(" RE() ")"
}

问题在于FINAL函数行| FINAL(1) "*",它给我一个错误Left recursion detected: "FINAL... --> FINAL...。在FINAL(1)的左侧放置“*”可以解决问题,但这不是我想要的......

我已经尝试从维基百科阅读文章以删除左递归,但我真的不知道该怎么做,有人可以帮忙吗? :■

1 个答案:

答案 0 :(得分:1)

以下处理左递归

RE --> FACTOR ("." FINAL | "|" FINAL)*
FINAL --> PRIMARY ( "*" )*
PRIMARY --> <SYMBOL> | "(" RE ")"

然而,这不会给。优先于| 。为此,您可以执行以下操作

RE --> TERM ("|" TERM)*
TERM --> FINAL ("." FINAL)*
FINAL --> PRIMARY ( "*" )*
PRIMARY --> <SYMBOL> | "(" RE ")"

一般规则是

A --> A b | c | d | ...

可以转换为

A --> B b*
B --> c | d | ...

其中B是新的非终结者。