ANTLR语法中的歧义

时间:2012-01-07 00:51:47

标签: java antlr grammar

AntlrWorks表示输入{'AND','OR'..'XOR'}可以通过两种选择进行匹配。即使使用图形显示,我也无法弄清楚匹配是如何发生的! 如何在下面的语法中出现歧义,有没有办法将其删除?

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'|'_')*
    ;

1 个答案:

答案 0 :(得分: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可能意味着什么