private static void parse(String str)
{
ANTLRInputStream input = new ANTLRInputStream(str);
AmbLexer lexer = new AmbLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
AmbParser parser = new AmbParser(tokens);
ParseTree tree = parser.expr();
System.err.println(tree.toStringTree(parser));
}
解析の最初のステップは、レクサーのルールに基づいて、トークン・ストリームを作成している:コードを解析
。トークンは最初に一致するルールで作成されます。したがって、あなたの場合、すべての「a」はL1になります。そして、r1は、パーサールールがL1しか含まれていないので、ルール 'r1'が 'y'ではなく 'x'を期待しているので、入力と一致することはできません。
したがって、特別な、より具体的なものがより曖昧なものになる前に、レクサールールを注文する必要があります。ルールは文字列として、数字は最後にありますが、ルールは 'func'、 'class'はそれらの前になります。
問題を解決するには、L1とL2を1つのルールにマージし、両方のパーサールールで使用します。