我試圖根據它的上下文修改規則,儘可能少地複製/粘貼。我會用最好的我想要實現的僞變種開始:根據解析器規則的可選部分重寫規則ANTLR3
module[boolean isParam]: 'module' id=identity?
declaration+
update+
'endmodule' -> ^(MODULE ({if (isParam)} IS_PARAMETER {else} $id) declaration+ update+);
如果isParam
設爲我希望模塊不匹配identity
規則,但創造它的地方IS_PARAMETER
令牌。我敢肯定,我可以用兩個單獨的module
規則來做到這一點,但是是否有更簡潔的方式,減少代碼重複或者不將規則拆分成許多更小的規則?
是的,但是,因爲'identity'是可選的,所以應當在其標籤'$ id'在重寫規則。 – 2012-04-16 15:15:54
這是我正在尋找的解決方案,謝謝。看起來'$ id'不需要是可選的。如果它不是可選的並且變量還沒有被設置,它會插入一個'nil'節點嗎? – Lichtblitz 2012-04-16 15:55:07
@Lichtblitz,不,如果它在解析器規則中是可選的,而在重寫規則中不是可選的,則當節點不存在時引發異常(我相信當在樹語法中遍歷樹時,但可能在AST創建期間,I我不是100%確定的:試着找出答案!)。 – 2012-04-16 16:59:29