単純な正規表現を表す文脈自由文法を作成しようとしています。必要な記号は [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 関数にあり| FINAL(1) "*"
、エラーが発生する行ですLeft recursion detected: "FINAL... --> FINAL...
。FINAL(1) の左側に「*」を置くと問題は解決しますが、これは私が望むものではありません..
ウィキペディアの記事を読んで左再帰を削除しようとしましたが、その方法が本当にわかりません。誰か助けてもらえますか? :s