[英]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.