2013-02-21 53 views
1

我喜歡解析一個例子文字是這樣的 -特殊註釋無法比擬的詞法規則

@comment { 
    { something } 
    { something else } 
} 

基本上「@comment」是搜索的關鍵,在這之後是一對大括號匹配的。我不需要解析大括號之間的內容。由於這是類似於C」多行註釋,我有一個基於我的語法:

grammar tryit; 


tryit : top_cmd 
     ; 

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

New_Line : ('\r' | '\n')+ {$channel = HIDDEN;}; 

top_cmd :cmds 
     ; 

cmds 
    : cmd+ 
    ; 

cmd 
    : Comment 
    ; 

Comment 
    : AtComment Open_Brace (options {greedy = false; }: .)+ Close_Brace 
    ; 

AtComment 
    : '@comment' 
    ; 

Open_Brace 
    : '{' 
    ; 

Close_Brace 
    : '}' 
    ; 

但在ANTLRWORKS測試,我立即得到一個EarlyExitException。

你看到有什麼問題嗎?

回答

1

有兩個問題,我看到:

  1. 你沒有考慮"@comment"和第一"{"之間的空間。請注意,這些空格放在HIDDEN通道上用於解析器規則,對於詞法分析規則,請使用而不是
  2. (options {greedy = false; }: .)+你剛剛匹配第一個"}",不平衡括號。

嘗試這樣代替:

tryit 
: top_cmd 
; 

top_cmd 
: cmds 
; 

cmds 
: cmd+ 
; 

cmd 
: Comment 
; 

Comment 
: '@comment' ('\t' | ' ')* BalancedBraces 
; 

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

New_Line 
: ('\r' | '\n')+ {$channel = HIDDEN;} 
; 

fragment 
BalancedBraces 
: '{' (~('{' | '}') | BalancedBraces)* '}' 
;