2016-10-27 10 views
0

Я определяю грамматику в ANTLR, которая выражает выражение, которое включает в себя логический оператор и скобки вместе.
Здесь грамматикиКак определить логический оператор с круглыми скобками в грамматике ANTLR

grammar simpleGrammar; 

/* This will be the entry point of the parser. */ 

parse 
    : 
     expression EOF 
    ; 
expression 
    : 
     expression binOp expression | ID | unOp (expression) | '(' expression ')' 
    ; 
binOp 
    : 
     ('AND' | 'OR') 
    ; 
unOp 
    : 
     'NOT' 
    ; 
ID  : 
     ('a'..'z' | 'A'..'Z')+ 
    ; 

Заданная грамматика может иметь возможность выразить дерево разбора без скобок, но когда я входной пример с скобкой, например, (Apple OR Bananana)AND Orange Это показывает MismatchedTokenException
Таким образом, это будет действительно признателен, если кто-то объяснит, как определить грамматику, чтобы выразить скобки.

ответ

1

Вы забыли сообщить ANTLR, что делать с пробелами. Например:

WS : [ \t\r\n] -> skip; 

Добавить эту грамматику и вы будете работать.

В качестве побочного примечания ваша грамматика имеет одинаковый приоритет для операторов AND и OR. И эти операторы имеют более высокий приоритет, чем NOT. Как это идет вразрез с обычными правилами, я бы посоветовал вам написать expression правило, как это вместо:

expression 
    : '(' expression ')'   # parenExp 
    | 'NOT' expression    # notExpr 
    | expression 'AND' expression # andExpr 
    | expression 'OR' expression # orExpr 
    | ID       # atomExpr 
    ; 
+0

Его показывает исключение, поскольку она взаимно леворекурсивный 'выражения«И»expression' и' выражение «OR» expression' –

+0

Нет, это прямое леворекурсивное выражение. ANTLR4 способен обрабатывать их, ANTLR3 - нет. Ваш исходный вопрос содержит прямую левую рекурсию, поэтому я предположил, что вы на v4. –