2010-05-23 107 views
1

我正在嘗試構建一個詞法分析器來標記單獨的單詞和引用的字符串。我有以下幾點:Antlr Lexer引用字符串謂詞

STRING: QUOTE (options {greedy=false;} : .)* QUOTE ; 
WS : SPACE+ { $channel = HIDDEN; } ; 
WORD : ~(QUOTE|SPACE)+ ; 

對於角球的情況下,它需要解析:

"string" word1" word2 

由於三個令牌:"string"爲STRING和word1"word2爲WORD。基本上,如果有最後一個報價,它就需要成爲WORD的一部分。如果報價被空格包圍,它應該是一個WORD。

我想這個規則WORD,沒有成功:

WORD: ~(QUOTE|SPACE)+ 
    | (~(QUOTE|SPACE)* QUOTE ~QUOTE*)=> ~(QUOTE|SPACE)* QUOTE ~(QUOTE|SPACE)* ; 

回答

3

我終於找到的東西,可以做的伎倆,而不訴諸編寫Java代碼:

fragment QUOTE 
      : '"' ; 
    fragment SPACE 
      : (' '|'\r'|'\t'|'\u000C'|'\n') ; 

    WS  : SPACE+ {$channel=HIDDEN;}; 
    PHRASE : QUOTE (options {greedy=false;} : .)* QUOTE ; 
    WORD : (~(QUOTE|SPACE)* QUOTE ~QUOTE* EOF)=> ~(QUOTE|SPACE)* QUOTE ~(SPACE)* 
      | ~(QUOTE|SPACE)+ ; 

這樣,謂詞分化/爲兩者解決:

PHRASE : QUOTE (options {greedy=false;} : .)* QUOTE ; 

and

  | ~(QUOTE|SPACE)+ ;