Я хочу создать простой парсер выражения критериев с помощью antlr3
Обновлено: отдельные правила выражения И ИЛИ для поддержки другой иерархии И / ИЛИ, но возникли другие проблемы: если выражение выглядит примерно так: a = 1 и b = 2 и c = 3 Дерево должно иметь вид следующие в соответствии с текущим агрегатом:
= =
(a = 1)(b = 2)(c = 3)
But I want to generate it as follows:
= =
(a = 1)(b = 2)
(c = 3)
First "and" should be higher priority than another, because I want to parse all the expression as left exp and right exp.
Думаю, мне нужно переписать правило в «подсекунду», чтобы сделать a = 1 и b = 2 и c = 3 -> (a = 1 и b = 2) и c = 3
но безуспешно пытался много раз. Кто-нибудь знает, как этого добиться? Спасибо.
Моя цель - разобрать какой-то SQL-запрос в стиле предложения, и создать AST, чтобы пройти через него.
Например:
a = 1 and (b = 2 or c = 3) //This one can parse correctly.
a = 1 and ((b = 2 or c = 3) or d = 4) //This one cannot parse correctly, missing last d = 4 in the tree.
//Tree is not correct.
Мой текущий файл грамматики не может проанализировать выше сложное условие. Поскольку я новичок в antlr, не уверен, как изменить мою грамматику, чтобы более правильно достичь вышеуказанного подхода. Может кто-нибудь помочь в этом? ! Любые предложения или комментарии приветствуются.
и моя грамматика (обновлено в соответствии с комментариями. Проблема с предупреждением устранена):
grammar CriteriaExpression;
options {
output = AST;
ASTLabelType = CommonTree;
language = Java;
}
tokens {
AND = 'and';
OR = 'or';
LPAREN = '(';
RPAREN = ')';
}
@lexer::header {
package com.antlr;
}
@parser::header {
package com.antlr;
}
eval
:
expression
;
выражение: andExp (OR ^ andExp) *;
andExp: субсекунда (И ^ субсекунда) *;
подсекунда: LPAREN выражение RPAREN | atom;
atom
:
EXPR OPERATOR EXPR
;
OPERATOR
:
'='| '<>'| '!='| '<='| '!>'| '<'| '>='| '!<'| '>'| 'like'
;
EXPR
:
('a'..'z'| 'A'..'Z'| '0'..'9')+
;
WILDCARD
:
'%'
;
WS
:
('\t'| ' '| '\r'| '\n'| '\u000C')*
{$channel = HIDDEN;}
;
((a = 1))
a = 1 и ((b = 2 или c = 3) или d = 4)