Como analisar declaração em ordem de precedência desejada usando antlr?

votos
0

Eu tenho um RSQL gramática definida:

grammar Rsql;

statement
    : L_PAREN wrapped=statement R_PAREN
    | left=statement op=( AND_OPERATOR | OR_OPERATOR ) right=statement
    | node=comparison
    ;

comparison
    : single_comparison
    | multi_comparison
    | bool_comparison
    ;

single_comparison
    : key=IDENTIFIER op=( EQ | NE | GT | GTE | LT | LTE ) value=single_value
    ;

multi_comparison
    : key=IDENTIFIER op=( IN | NIN ) value=multi_value
    ;

bool_comparison
    : key=IDENTIFIER op=EX value=boolean_value
    ;

boolean_value
    : BOOLEAN
    ;

single_value
    : boolean_value
    | ( STRING_LITERAL | IDENTIFIER )
    | NUMERIC_LITERAL
    ;

multi_value
    : L_PAREN single_value ( COMMA single_value )* R_PAREN
    | single_value
    ;

TRUE: 'true';
FALSE: 'false';
AND_OPERATOR: ';';
OR_OPERATOR: ',';
L_PAREN: '(';
R_PAREN: ')';
COMMA: ',';
EQ: '==';
NE: '!=';
IN: '=in=';
NIN: '=out=';
GT: '=gt=';
LT: '=lt=';
GTE: '=ge=';
LTE: '=le=';
EX: '=ex=';

IDENTIFIER
 : [a-zA-Z_] [a-zA-Z_0-9]*
 ;

BOOLEAN
    : TRUE
    | FALSE
    ;

NUMERIC_LITERAL
    : DIGIT+ ( '.' DIGIT* )? ( [-+]? DIGIT+ )?
    | '.' DIGIT+ ( [-+]? DIGIT+ )?
    ;

STRING_LITERAL
    : '\'' ( STRING_ESCAPE_SEQ | ~[\\\r\n'] )* '\''
    | '' ( STRING_ESCAPE_SEQ | ~[\\\r\n] )* ''
    ;

STRING_ESCAPE_SEQ
    : '\\' .
    ;

fragment DIGIT : [0-9];

Não importa como eu tentar analisar isso (ouvinte / visitante), as declarações com parêntese sempre são avaliadas em ordem. É meu entendimento que a ordem na regra seria a precedência. No entanto, a árvore de análise para uma declaração como name == foo, (nome == bar; age = gt = 35) é sempre

digite

não importa onde aparecem o parêntese. Por favor, me ajudar a descobrir o que eu estou sentindo falta. Obrigado!

Publicado 02/08/2017 em 11:18
fonte usuário
Em outras línguas...                            


1 respostas

Como analisar declaração em ordem de precedência desejada usando antlr?

votos
0

Eu tenho um RSQL gramática definida:

grammar Rsql;

statement
    : L_PAREN wrapped=statement R_PAREN
    | left=statement op=( AND_OPERATOR | OR_OPERATOR ) right=statement
    | node=comparison
    ;

comparison
    : single_comparison
    | multi_comparison
    | bool_comparison
    ;

single_comparison
    : key=IDENTIFIER op=( EQ | NE | GT | GTE | LT | LTE ) value=single_value
    ;

multi_comparison
    : key=IDENTIFIER op=( IN | NIN ) value=multi_value
    ;

bool_comparison
    : key=IDENTIFIER op=EX value=boolean_value
    ;

boolean_value
    : BOOLEAN
    ;

single_value
    : boolean_value
    | ( STRING_LITERAL | IDENTIFIER )
    | NUMERIC_LITERAL
    ;

multi_value
    : L_PAREN single_value ( COMMA single_value )* R_PAREN
    | single_value
    ;

TRUE: 'true';
FALSE: 'false';
AND_OPERATOR: ';';
OR_OPERATOR: ',';
L_PAREN: '(';
R_PAREN: ')';
COMMA: ',';
EQ: '==';
NE: '!=';
IN: '=in=';
NIN: '=out=';
GT: '=gt=';
LT: '=lt=';
GTE: '=ge=';
LTE: '=le=';
EX: '=ex=';

IDENTIFIER
 : [a-zA-Z_] [a-zA-Z_0-9]*
 ;

BOOLEAN
    : TRUE
    | FALSE
    ;

NUMERIC_LITERAL
    : DIGIT+ ( '.' DIGIT* )? ( [-+]? DIGIT+ )?
    | '.' DIGIT+ ( [-+]? DIGIT+ )?
    ;

STRING_LITERAL
    : '\'' ( STRING_ESCAPE_SEQ | ~[\\\r\n'] )* '\''
    | '"' ( STRING_ESCAPE_SEQ | ~[\\\r\n"] )* '"'
    ;

STRING_ESCAPE_SEQ
    : '\\' .
    ;

fragment DIGIT : [0-9];

Não importa como eu tentar analisar isso (ouvinte / visitante), as declarações com parêntese sempre são avaliadas em ordem. É meu entendimento que a ordem na regra seria a precedência. No entanto, a árvore de análise para uma declaração como "name == foo, (nome == bar; age = gt = 35)" é sempre

digite descrição da imagem aqui

não importa onde aparecem o parêntese. Por favor, me ajudar a descobrir o que eu estou sentindo falta. Obrigado!

Respondeu 02/08/2017 em 11:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more