2010-05-01 97 views
0

此ANTLR示例不解析输入“1;” 。你能解释为什么吗?它解析“11”。此antlr示例不能正常工作

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; 
      }; 

回答

1

对于Java的目标,如果你改变: 保护 DIGIT : '0' .. '9' ;

到 片段 DIGIT : '0' .. '9' ;

它会工作。

希望这可以帮助你。

+0

确认,将保护更改为片段。 – Pindatjuh 2010-05-03 13:17:34

+2

我想通了。说明:受保护的关键字在早期版本的ANTLR中起作用。它在ANTLR 3中不起作用。现在必须使用受保护的片段。在ANTLR 3中可能会忽略受保护的。那么会发生什么? ANTLR将INT和DIGIT解释为令牌。由于它们非常相似,解析失败。通过使用片段,DIGIT不再是一个令牌。片段说DIGIT是规则或其他标记的一部分。然后这个例子开始工作。 – Aftershock 2010-05-04 15:41:10