mahonya
mahonya

Reputation: 10055

Ambiguity in ANTLR grammar

AntlrWorks says that input {'AND','OR'..'XOR'} can be matched by two alternatives. Even with the graphical display, I could not figure out how the match happens! How on earth the ambiguity occurs in the grammar below, and is there a way to remove it?

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

Upvotes: 1

Views: 234

Answers (1)

sarnold
sarnold

Reputation: 104050

How would you expect your grammar to parse CONTAINS foo bar baz?

contains_expr matches CONTAINS.

contains_expression "calls" primary.

primary "calls" class_expression.

class_expression "calls" simple_class_expr.

simple_class_expr can match: identifier or identifier identifier.

Thus I can see several possible parsings here; I've put individual simple_class_expr matches into parenthesis:

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

I'm sorry to say that I'm new enough to parsing tools to not have suggestions how to fix this except wondering what identifier identifier might mean.

Upvotes: 2

Related Questions