2016-03-31 66 views
1

我有下面的引擎蓋下使用ANTLR3的XText語法。在我的語法中,我想支持像TYPE(EXPRESSION)(TYPE)(EXPRESSION)這樣的表演表達式。類型定義通常包含其他類型(我認爲這是問題,但我不能改變這個要求)。除此之外,我還希望允許表達式的括號。如何解決Antlr3中的遞歸規則調用?

是否有可能通過左分解來解決遞歸?我總是收到以下錯誤消息。

[致命的]規則ruleExpression由於從alts 1,2到達的遞歸規則調用而具有非LL(*)決策。通過左分解或使用語法謂詞或使用backtrack = true選項進行解析。

Model: 
    e=Expression; 

Expression: 
    e=castExpression | e=parExpression | "VAR"; 

castExpression: 
    (Type | '(' Type ')') e=parExpression; 

parExpression: 
    '(' Expression ')'; 

Type: 
    "MYTYPE" t=Type | "TYPE_ID"; 
+1

@LucasTrzesniewski它是XText,它使用底層的ANTLR3 –

回答

0

最簡單的,但不是neccessarily最好的方法,使其工作是把在一個語法謂詞(=>)對整個castExpression這樣的:

Expression: 
    =>e=castExpression | e=parExpression | "VAR"; 

但好像這是一個非常簡化的實際語法摘錄,所以我不能說它是否是一個可行的解決方案。另外請注意,放置這麼長的超前視圖會對工具方面和性能造成不良影響。在添加更多的句法謂詞之前,你應該確定要理解句法謂詞的含義。

+0

感謝您的輸入,但是可以在沒有語法謂詞的情況下描述我的語法嗎?我想用類型(表達式)的「演員操作符」來表達語法。關鍵的問題是我想允許表達式和類型的括號(因爲類型可能很複雜)。我想允許像(type)(expr)或(type)((expr)+(expr))這樣的表達式。 – user3625015