Неоднозначность в грамматике ANTLR - PullRequest
1 голос
/ 07 января 2012

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 Ответ

2 голосов
/ 07 января 2012

Как вы ожидаете, что ваша грамматика проанализирует CONTAINS foo bar baz?

contains_expr соответствует CONTAINS.

contains_expression "звонков" primary.

primary «звонки» class_expression.

class_expression «звонки» simple_class_expr.

simple_class_expr могут совпадать: identifier или identifier identifier.

Таким образом, я вижу здесь несколько возможных разборов;Я поставил отдельные simple_class_expr совпадения в круглые скобки:

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

Извините, что я достаточно нов, чтобы разбирать инструменты, чтобы не было предложений, как исправить этокроме вопроса о том, что identifier identifier может означать .

...