Как писать правила Antlr нерекурсивным способом? - PullRequest
1 голос
/ 12 февраля 2020

У меня есть следующие выражения, которые мне нужно проанализировать

and(true, false)
or(true, false, true)
not(or(true, false, true))
and(and(true, false), false)
or(or(true, false, true), true)

, пока у меня есть следующая грамматика

expr
    : orExpr
    ;

orExpr
    : OR '(' andExpr (',' andExpr)+ ')'
    | andExpr
    ;

andExpr
    : AND '(' equalityExpr (',' equalityExpr)+ ')'
    | equalityExpr
    ;

equalityExpr
    : comparison ((EQUALS | NOT_EQUALS) comparison)*
    ;

comparison
    : notExpr ((GREATER_THAN_EQUALS | LESS_THAN_EQUALS | GREATER_THAN | LESS_THAN ) notExpr)?
    ;

notExpr
    : NOT '(' expr ')'
    | primary
    ;

primary
    : '(' expr ')'
    | true
    | false
    ;

Я не могу разобрать and(and(true, false), false) с приведенным выше грамматика? где я ошибаюсь?

Пожалуйста, предположите, что есть приоритет между AND OR NOT (хотя я понимаю, что это может показаться необязательным)

1 Ответ

0 голосов
/ 12 февраля 2020

Но сейчас мне нужно уметь анализировать true=and(5=5, 4=4, 3>2) или наоборот and(5=5, 4=4, 3>2)=true?

В этом случае абсолютно не нужно усложнять вещи. Все, что вам нужно сделать, это:

grammar Test;

parse
 : expr EOF
 ;

expr
 : '(' expr ')'
 | OR '(' expr (',' expr)+ ')'
 | AND '(' expr (',' expr)+ ')'
 | NOT '(' expr ')'
 | expr (LT | LTE | GT | GTE) expr
 | expr (EQ | NEQ) expr
 | TRUE
 | FALSE
 | INT
 ;

LT    : '<';
LTE   : '<=';
GT    : '>';
GTE   : '>=';
NEQ   : '!=';
EQ    : '=';
NOT   : 'not';
TRUE  : 'true';
FALSE : 'false';
AND   : 'and';
OR    : 'or';

INT
 : [0-9]+
 ;

SPACES
 : [ \t\r\n] -> skip
 ;
...