2016-01-11 5 views
0

Мне нужно совместить параметр, который либо литерально литеральным, либо двойным кавычками. Следующий мой код, он не может правильно совпадать.Как определить буквенный литерал и цитату цитаты ANTLR3?

DOUBLE_QUOTE: '\"'; 

fragment 
SP   : ' '+; 

UnquotedString 
    : 
    (ESC_SEQ | ~('\\'|'"'|' '|'\t'))* 
    ; 

QuotedLiteral 
    : 
    DOUBLE_QUOTE (SP UnquotedString)* DOUBLE_QUOTE 
    ; 

fragment 
ESC_SEQ 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | UNICODE_ESC 
    | OCTAL_ESC 
    ; 

fragment 
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; 

fragment 
OCTAL_ESC 
    : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') 
    ; 

fragment 
UNICODE_ESC 
    : 
    '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT 
    ; 

Parameter 
    : 
    UnquotedString | QuotedLiteral 
    ; 

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

Например, когда я ввода para1 оператора "para2", то Параметр правило может быть согласован para1 и "para2".

ответ

0
QuotedLiteral 
: 
DOUBLE_QUOTE (SP UnquotedString)* DOUBLE_QUOTE 
; 

- это означает, что QuotedLiteral может либо соответствовать "", или должен быть пробел после начала цитаты. Вероятно, это не то, что вы намеревались.