簡體   English   中英

上下文無關語法表示正則表達式

[英]Context-free-grammar to represent regular expressions

我正在嘗試使上下文無關的語法來表示簡單的正則表達式。 我想要的符號是[0-9] [az] [AZ],運算符是“ |”,“()”和“”。 對於串聯,對於現在的序列,我只想要“ *”,以后我將添加“ +”,“?”等。我在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(1) "*" | FINAL(1) "*"給我一個錯誤Left recursion detected: "FINAL... --> FINAL...在FINAL(1)左側放置” *“可以解決問題,但這不是我要解決的問題想..

我已經嘗試過閱讀Wikipedia上的文章,以消除左遞歸,但是我真的不知道該怎么做,有人可以幫忙嗎? :s

以下照顧左遞歸

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是一個新的非終結符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM