2014-09-24 91 views
1

我是ANTLR的新手,我試圖編寫一個簡單的解析器。我用了一個有效的規則,但是當我運行TestRig(GRUN)與「無功」的規則-gui參數,並進入了這個:ANTLR需要一行令牌作爲單個令牌

var myVar = 13 

調試tolds我說:行1:0不匹配輸入「變種myVar的= 13' 期待‘變種’

我不能讓什麼是錯的吧.. 下面的代碼:

grammar Leaf; 

WS:  (' '|'\t'|'\n'|'\r')+ -> skip; 

NUM: ('0'..'9') ('0'..'9'|'.')*; 
CHAR: ('a'..'z'|'A'..'Z'); 

ID:  CHAR (CHAR|NUM)*; 

BOOL: ('true'|'false'); 

STRING: ~('\r'|'\n'|'"')+; 

type: 'int'|'byte'|'float'|'double'|'decimal'|'char'|'bool'|'tuple'|'string'|'type'; 
value: NUM|BOOL|('[' (value ',')+ ']')|('\'' CHAR '\'')|('"' STRING '"')|('(' (type ',')+ ')')|type; 

var: 'var' ID('[]')? (':' type)? '=' (type|value)?; 

感謝您的反饋!

回答

2

ANTLR中的Lexer規則是貪婪的。因此,規則STRING

STRING: ~('\r'|'\n'|'"')+; 

消耗您的整個輸入。

你需要做的是從你的value解析器規則中刪除雙引號和它們包括在詞法規則:

grammar Leaf; 

var 
: 'var' ID ('[' ']')? (':' type)? '=' (type | value)? 
; 

value 
: NUM 
| BOOL 
| '[' value (',' value)* ']' 
| CHAR 
| STRING 
| '(' type (',' type)* ')' 
| type 
; 

type 
: 'int' 
| 'byte' 
| 'float' 
| 'double' 
| 'decimal' 
| 'char' 
| 'bool' 
| 'tuple' 
| 'string' 
| 'type' 
; 

WS  : (' '|'\t'|'\n'|'\r')+ -> skip; 

BOOL : ('true' | 'false'); 

NUM : DIGIT+ ('.' DIGIT*)?; 

STRING : '"' ~('\r'|'\n'|'"')* '"'; 

CHAR : '\'' LETTER '\''; 

ID  : LETTER (LETTER | DIGIT)*; 

fragment LETTER : [a-zA-Z]; 
fragment DIGIT : [0-9];