利用可能なソースコードはhttps://gist.github.com/1684022をご覧ください。ANTLRレクサールールのあいまい性を解決する適切な方法はありますか?
ID : ('a'..'z' | 'A'..'Z') ('0'..'9' | 'a'..'z' | 'A'..'Z' | ' ')*;
PITCH
: (('A'|'a') '#'?)
| (('B'|'b') '#'?)
| (('C'|'c') '#'?);
もちろん、文字は「」あいまいさのようになります。
私は定義された2つのトークンを持っています。
私はさらに定義:
note : PITCH;
name : ID;
main : name ':' note '\n'?
を今、私が入力したとします。パーサへの入力として "A A" を、私は常にエラーを取得します。どちらのパーサはIDまたはPITCHが最初に定義されているかどうかに応じて、PITCHまたはIDを期待:
mismatched input 'A' expecting ID
意図したとおりに、それが動作するようにこれを解決する適切な方法は何ですか?説明されているように
、それは構文解析がどのように動作するかを直感的に理にかなっているものの、ANTLRは「正しいこと」を行いません。つまり、main
ルールではname
/ID
が最初に来るはずですが、レクサーはこれを知らないように見え、PITCH
として「A」を識別します。これは「最長一致」/「最初に来る」ルールに従うからです。より合理的な "ルールは何を言う"ルール。
IDとPITCHの両方を一致させることで偽装/ハックする唯一の解決策ですが、後でdasblinkenlightと同じように再結合しますか?ここで
はい。スペースはその質問とは何が関係していますか? – Ana
見て、バート。私がANTLRを理解しているかどうかに関わらず、あなたが打ち続けるポイントは無関係です。私は解決策を探そうとしていますが、あなたは1つの答えと4つのコメントを提供しましたが、いずれも解決策ではなく、私の投稿や私の理解に関する解説です。あなたがANTLRを理解していて、自分の問題を私が理解しているよりもよく理解すれば、真の解決策を投稿してください。 – Ana