Искам да създам прост анализатор на изрази на критерии с 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
но опитах много пъти без успех. Някой има ли идея как да го постигнем? Благодаря.
Моята цел е да анализирам някакъв вид изречение в стил на клауза where в 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 : subcond (AND^ subcond)* ;
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;}
;
((a=1))
a = 1 и ((b = 2 или c = 3) или d = 4)