2016-04-14 1 views
1

を不明確な曖昧さを防止:次の文法で文法で

expr : r1 EOF 
    | r2 EOF 
    ; 

r1 : '1' L1 'x' ; 
r2 : '1' L2 'y' ; 

L1: 'a' ; 
L2: 'a' ; 

は私が

1ay 

私はパーサが適切な解析ツリーを作成することを期待式を解析していた場合、しかし、私は取得しています次のエラー:

line 1:2 mismatched input 'y' expecting 'x'

なぜ正しく解析できないのですか?そうするよう指示することができますか?

答えて

2
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つのルールにマージし、両方のパーサールールで使用します。

関連する問題