此antlr示例工作不正常

此antlr示例工作不正常,antlr,antlr3,Antlr,Antlr3,此ANTLR示例不解析输入“1;”。你能解释一下原因吗?它解析为“11;” 对于java目标,如果您更改: 受保护的 数字 : '0'..'9' ; 到 碎片 数字 : '0'..'9' ; 它会起作用的 希望这对您有所帮助。确认,将“受保护”更改为“碎片”。我明白了。说明:受保护的关键字在早期版本的ANTLR中有效。它在ANTLR 3中不起作用。现在必须使用片段instrade of protected。在ANTLR 3中,受保护的可能被忽略。那么会发生什么呢?ANTLR将INT和DI

此ANTLR示例不解析输入“1;”。你能解释一下原因吗?它解析为“11;”


对于java目标,如果您更改: 受保护的 数字 : '0'..'9' ;

到 碎片 数字 : '0'..'9' ;

它会起作用的


希望这对您有所帮助。

确认,将“受保护”更改为“碎片”。我明白了。说明:受保护的关键字在早期版本的ANTLR中有效。它在ANTLR 3中不起作用。现在必须使用片段instrade of protected。在ANTLR 3中,受保护的可能被忽略。那么会发生什么呢?ANTLR将INT和DIGIT都解释为标记。由于它们非常相似,解析失败。通过使用片段,数字不再是一个标记。片段表示该数字是规则或其他标记的一部分。然后,示例开始工作。
grammar TestGrammar;

options {
    output=AST;
}

expr:       mexpr (PLUS^ mexpr)* SEMI!;
mexpr:      atom (STAR^ atom)*; 
atom:       INT; 

LPAREN:     '('; 
RPAREN:     ')'; 
STAR:       '*'; 
PLUS:       '+'; 
SEMI:       ';';

protected
DIGIT:      '0'..'9';
INT:        (DIGIT)+;

WS:         (' ' | '\t' | '\n' | '\r') {
                $channel = HIDDEN;
            };