2012-01-07 94 views
1

AntlrWorks說輸入{'AND','OR'..'XOR'}可以匹配兩種選擇。即使有圖形顯示,我也無法弄清楚比賽是怎麼發生的! 下面的語法怎麼會出現歧義,是否有辦法將其刪除?ANTLR語法中的歧義

grammar testg; 

rul : contains_expr ; 

contains_expr: 'CONTAINS' contains_expression 
        //'CONTAINS' contains_or 
     ; 

contains_expression : primary (('OR'|'AND'|'XOR') primary)* 
     ; 

primary options{backtrack = true;} 
: '(' contains_expression ')' 
| class_expression 
; 


class_expression : simple_class_expr 
      | '(' simple_class_expr contains_expr ')' 
      |(simple_class_expr contains_expr) 
     ; 

simple_class_expr: identifier    // RM_TYPE_NAME 
       | identifier identifier  // RM_TYPE_NAME variable 
       | archetype_class_expr 
     | versioned_class_expression 
     | version_class_expression 
     // | identified_obj_expression  // need to be used once VersionedClassExpr is removed 
     ; 

identifier 
    : ID 
    ; 

archetype_class_expr 
    : '.ace' 
    ; 

versioned_class_expression 
    : '.vce' 
    ; 

version_class_expression 
    : '.vnce' 
    ; 

temp : 
     ; 


ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 
+0

sarnold已經解釋了爲什麼ANTLR抱怨你的語法。如果您仍然需要幫助,我建議您不要僅發佈語法,而是要解釋*您正在嘗試編寫哪種語言的語法。你能舉一些例子並解釋它嗎?我很難通過單獨看看你的語法來搞清楚你想要解析什麼語言。 – 2012-01-08 19:27:39

+0

嗨巴特。這是來自openRHR原型查詢語言Antlr端口的一個片段:http://www.openehr.org/wiki/display/spec/Archetype+Query+Language+Description現有的語法是用一個LR解析器生成器構建的, m試圖擺脫左遞歸和LR分析器很容易的其他事情。我設法解決了我在這裏提出的問題,這要歸功於sarnold和句法謂詞。我可能不得不問更多的Antlr問題:) – mahonya 2012-01-10 11:13:00

+0

您是否知道以下語法:http://www.openehr.org/wiki/display/spec/ANTLR+AQL+grammar? (沒有測試!) – 2012-01-10 13:02:54

回答

2

您如何期待您的語法解析CONTAINS foo bar baz

contains_expr匹配CONTAINS

contains_expression「電話」primary

primary「電話」class_expression

class_expression「致電」simple_class_expr

simple_class_expr可匹配:identifieridentifier identifier

因此,我可以在這裏看到幾個可能的解析;我已經把個人simple_class_expr匹配到括號:

CONTAINS (foo bar) (baz) 
CONTAINS (foo) (bar) (baz) 
CONTAINS (foo) (bar baz) 

我很抱歉地說,我是新不足以解析工具,沒有建議如何解決除了想知道什麼identifier identifier威力意味着