Я хочу создать простое выражение критериев парсера с antlr3простых критерии анализатор выражений с antlr3
Обновлено: отдельное И ИЛИ выражение правила поддержки и/или другая иерархия, но есть и другие проблемы: , если выражение это что-то вроде: а = 1 и Ь = 2 и с = 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.
Я думаю, что нужно переписать правила в «subcond» Сделать a = 1 и b = 2 и c = 3 -> (a = 1 и b = 2) и c = 3
но попробовал много раз, не повезло. Кто-нибудь понял, как его достичь? Благодарю.
Моя цель - разобрать какой-то SQL-предложение предложения предложения where и построить 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 (ИЛИ^andExp) * ;
andExp : субкондуктор (AND^подкодер) * ;
subcond : LPAREN-выражение RPAREN | atom ;
atom
:
EXPR OPERATOR EXPR
;
OPERATOR
:
'='| '<>'| '!='| '<='| '!>'| '<'| '>='| '!<'| '>'| 'like'
;
EXPR
:
('a'..'z'| 'A'..'Z'| '0'..'9')+
;
WILDCARD
:
'%'
;
WS
:
('\t'| ' '| '\r'| '\n'| '\u000C')*
{$channel = HIDDEN;}
;
((а = 1))
а = 1 и ((Ь = 2 или с = 3) или г = 4)
показать входящий файл для примера –
Привет, @Aleksei Булгак, каков ваш средний входящий файл?Пример - это просто возможное значение, о котором я думаю. Реальная входная строка может быть намного сложнее и может быть комбинацией комбинаций. Благодарю. – phyerbarte
вы передаете эту ссылку в полном дереве. с деревом –