私は次の文法を持っています:
rule: 'aaa' | 'a' 'a';
文字列「aaa」は正常に解析できますが、「aa」の解析に失敗し、次のエラーが発生します。
line 1:2 mismatched character '<EOF>' expecting 'a'
参考までに、パーサーとは呼ばないので、パーサーの問題ではなく、レクサーの問題です。主な機能は次のようになります。
@members {
public static void main(String[] args) throws Exception {
RecipeLexer lexer = new RecipeLexer(new ANTLRInputStream(System.in));
for (Token t = lexer.nextToken(); t.getType() != EOF; t = lexer.nextToken())
System.out.println(t.getType());
}
}
結果は、より明白なバージョンと同じです。
rule: AAA | A A;
AAA: 'aaa';
A: 'a';
明らかに、ANTLRレクサーは入力'aa'をルールAAAと一致させようとしますが失敗します。ANTLRがLL(*)パーサーなどであることは別として、レクサーはパーサーとは別に機能する必要があり、あいまいさを解決できる必要があります。文法は古き良きlex(またはflex)ではうまく機能しますが、ANTLRでは機能しません。では、ここでの問題は何ですか?
助けてくれてありがとう!