2012-01-16 62 views
1

我需要解析字符串是這樣的:強制性和選擇性的空間

"qqq www eee" -> "qqq", "www", "eee" (case A) 
"qqq www eee" -> "qqq", "www", "eee" (case B) 

這裏是語法我目前有:

grammar Query; 

SHORT_NAME : ('a'..'z')+ ; 

name returns [String s]: SHORT_NAME { $s = $SHORT_NAME.text; };  

names 
    returns [List<String> v] 
    @init { $v = new ArrayList<String>(); } 
    : name1 = name { $v.add($name1.s); } 
     (' ' name2 = name { $v.add($name2.s); })*; 

它工作正常的caseA,但失敗了caseB

line 1:4 missing SHORT_NAME at ' ' 
line 1:5 extraneous input ' ' expecting SHORT_NAME 
line 1:10 extraneous input ' ' expecting SHORT_NAME 

任何想法如何使其工作?

+0

這是java語法嗎? – kosa 2012-01-16 05:08:58

+0

這是Antlr3語法的語法 – agibalov 2012-01-16 05:10:06

回答

2

names規則中刪除的文字' '並用SPACES令牌替換:

grammar Query; 

SPACES 
: (' ' | '\t')+ 
; 

SHORT_NAME 
: ('a'..'z')+ 
; 

name returns [String s] 
: SHORT_NAME { $s = $SHORT_NAME.text; } 
;  

names returns [List<String> v] 
@init { $v = new ArrayList<String>(); } 
: a=name { $v.add($a.s); } (SPACES b=name { $v.add($b.s); })* 
; 

或只是在詞法級丟棄的空間,這樣你就不需要把它們放在你的分析器規則:

grammar Query; 

SPACES 
: (' ' | '\t')+ {skip();} 
; 

SHORT_NAME 
: ('a'..'z')+ 
; 

name returns [String s] 
: SHORT_NAME { $s = $SHORT_NAME.text; } 
;  

names returns [List<String> v] 
@init { $v = new ArrayList<String>(); } 
: (name { $v.add($b.s); })+ 
;