2014-01-29 57 views
2

好吧。這可能是一個簡單的問題。我試圖解析javadoc風格的評論。我怎樣才能表明相同的解析器規則可能被觸發零次或多次:ANTLR從零到多個同一個解析器規則的次數

doc_comment   : '/**' (param_declaration)* '*/'   ; 

param_declaration : OUTERWS '@param' OUTERWS ID OUTERWS; 

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

OUTERWS    : ('\n' | '\r' | ' ' |'\t')*; 

括在()*param_declaration規則似乎並沒有工作,因爲它不是一個令牌。

我預計:

/** 
    @param one 
    @param two 
*/ 

會工作。但相反,我得到:額外的輸入'@參數'期待{'* /'如果(param_declaration)*匹配零個或多個實例,這對我沒有意義。好像添加()*到param_declaration什麼都不做。無論哪種方式:

/** 
@param one 
*/ 

工作正常;有還是沒有 ()*。

回答

3

您的問題的答案是,要匹配規則foo零次或更多次,請使用(foo)*或簡單地foo*

如果這不會產生可用的結果,那麼問題在於如何組織您的詞法分析器和/或解析器,並且要解決它,您需要問一個更具體的問題,幷包含您的語法以及具體的輸入和輸出不是你所期望的,加上對所需輸出的描述。

編輯:你有兩個參數發生異常,因爲param_declaration規則開始,並以需要OUTERWS令牌結束。這意味着兩個OUTERWS令牌必須出現在一行中才能解析兩個參數。這是不可能的,因爲輸入文件中的任何兩個空白字符序列都會匹配一個長的令牌,而使用較長的令牌總是會使用而不是兩個較短的令牌。

另請注意,您的OUTERWS令牌的寫法是它可以匹配0個字符。如果你的輸入序列包含一個數字,比如0,那麼出現在0之前的最長的令牌將是一個零長度的令牌。由於輸入不會因匹配0個字符而前進,這意味着包含一個數字的輸入應該產生無限長的空標記流。 爲此語法生成代碼時看到的相關警告不被忽略。

編輯2:如果註釋以/***/的形式出現,則您的輸入可以匹配零個參數。但是,如果您的評論以/** */的形式出現,那麼/***/之間將會有一個OUTERWS令牌,當沒有param_declaration時,解析器規則不允許使用該令牌。

+0

以上是完整的語法。 – jcfolsom

+0

它也不符合零param_definitions。它似乎只適用於一個 – jcfolsom

+0

我更新了我的答案。 –