2010-05-01 148 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