2012-06-04 84 views
1

我可以用下面的語法替換indent_loop [3] 3,INDENT? INDENT是縮進的詞法規則。ANTLR返回詞彙規則組?

我只想寫數INDENT根據數量。

match_node 
     : match_node_name (tree_operator) (NEW_LINE (indent_loop[3]) (moduleCall | literals))* 
      { match_node_list.push($match_node_name.text); } 
     | SINGLE_QUOTE POINTE SINGLE_QUOTE 
     ; 


    match_node_name 
     : IDENT_SMALL_LETTERS 
     ; 

    indent_loop[int scope] 
     : {scope == 3}? INDENT INDENT INDENT 
     | {scope == 4}? INDENT INDENT INDENT INDENT 
     ; 

    INDENT : '\t'; 

當我這樣做時,我無法回到我的調用規則並且無法返回這組縮進?沒有調用手段,(moduleCall | literals))*。

我在哪裏錯了?我剛剛開始。

還有沒有其他方法可以做到這一點?

回答

1

可以做到這一點通過使用語義謂詞:

grammar T; 

parse 
: digit[1] digit[2] digit[3] EOF 
; 

digit[int amount] 
: ({amount > 0}?=> DIGIT {amount--;})* 
; 

DIGIT 
: '0'..'9' 
; 

解析"456789"從上方與語法產生的解析器,將導致下面的解析:

enter image description here

請注意,在你的情況下,你只是匹配一個選項卡,不一定是一個縮進(即從一行開始的一個或多個選項卡)。如果你只想匹配從行首開始的縮進,那麼(恕我直言)最簡單的方法就是在詞法分析器中處理它們。。


What is a 'semantic predicate' in ANTLR?
ANTLR What is simpliest way to realize python like indent-depending grammar?