2012-01-16 10 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

+0

Antlr3の文法構文 – agibalov

答えて

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); })+ 
; 
関連する問題