あなたの文法は、オプションなしでANTLR v3で動作します。
kオプションは、ANTLRを古典的なLL(k)解析に制限します。バックトラックとは、パーザがどのルールを使用するかを予測できない場合、単に試行し、バックトラックして再試行することです。 ANTLRが指定された文法の先読みDFAを構築できない場合に使用するバックトラックオプション。 ANTLR v3では、正規表現からDFAを簡単に構築できますが、再帰的規則では困難です。たとえば、この文法は次のように動作します。
start: recursive_rule ';'
| recursive_rule ':'
;
recursive_rule : (ID)* '%'
;
この文法は同じですが、再帰によって表現されます。それは(なぜ私が実際に知っていない)のためにANTLRは、DFAを構築することはできませんので、あなたは上のバックトラックを切り替える必要があります:-kオプションは、パーサのパフォーマンスを向上させるために使用される
start options {backtrack=true;} : recursive_rule ';'
| recursive_rule ':'
;
recursive_rule : ID recursive_rule
|'%'
;
。 LL(*)をLL(k)に制限する他の理由はわかりません。
ありがとうございました。私はそれをよりよく理解する再帰的なルールでそれを試してみます。しかし、今私は考えがあります。ありがとう。 – Veilchen4ever
2番目の再帰的な例について説明できますか?私はそれが左の再帰ルールではないと思うので、ANTLRはそれに対処できるはずですか? –