Sto cercando di analizzare un'espressione booleana annidata e ottenere separatamente le singole condizioni all'interno dell'espressione. Per esempio, se la stringa di input è:Analizzatore dell'espressione booleana annidato che utilizza ANTLR
(A = A o B = B o C = C e ((D = D ed E = e) OR (F = F e G = g)))
Vorrei ottenere le condizioni con l'ordine corretto. Per esempio,
D = D ed E = e OR F = F e G = g E A = A o B = B o C = c
sto usando ANTLR 4 per analizzare la testo di input ed ecco la mia grammatica:
grammar SimpleBoolean;
rule_set : nestedCondition* EOF;
AND : 'AND' ;
OR : 'OR' ;
NOT : 'NOT';
TRUE : 'TRUE' ;
FALSE : 'FALSE' ;
GT : '>' ;
GE : '>=' ;
LT : '<' ;
LE : '<=' ;
EQ : '=' ;
LPAREN : '(' ;
RPAREN : ')' ;
DECIMAL : '-'?[0-9]+('.'[0-9]+)? ;
IDENTIFIER : [a-zA-Z_][a-zA-Z_0-9]* ;
WS : [ \r\t\u000C\n]+ -> skip;
nestedCondition : LPAREN condition+ RPAREN (binary nestedCondition)*;
condition: predicate (binary predicate)*
| predicate (binary component)*;
component: predicate | multiAttrComp;
multiAttrComp : LPAREN predicate (and predicate)+ RPAREN;
predicate : IDENTIFIER comparator IDENTIFIER;
comparator : GT | GE | LT | LE | EQ ;
binary: AND | OR ;
unary: NOT;
and: AND;
ed ecco il codice Java che sto usando per analizzarlo:
ANTLRInputStream inputStr = new ANTLRInputStream(input);
SimpleBooleanLexer lexer = new SimpleBooleanLexer(inputStr);
TokenStream tokens = new CommonTokenStream(lexer);
SimpleBooleanParser parser = new SimpleBooleanParser(tokens);
parser.getBuildParseTree();
ParseTree tree = parser.rule_set();
System.out.println(tree.toStringTree(parser));
UO tput è:
(rule_set (nestedCondition ((condition (predicate A (comparator =) a) (binary OR) (component (predicate B (comparator =) b)) (binary OR) (component (predicate C (comparator =) c)) (binary AND) (component (multiAttrComp ((predicate (D (comparator =) d) (and AND) (predicate E (comparator =) e)))) (binary OR) (component (multiAttrComp ((predicate F (comparator =) f) (and AND) (predicate G (comparator =) g)))))))) <EOF>)
sto cercando aiuto su come analizzare questo albero per ottenere le condizioni nell'ordine corretto? In ANTLR 3, potremmo specificare^e! per decidere come viene costruito l'albero (fare riferimento a questo thread), ma ho appreso che non è supportato in ANTLR 4.
Qualcuno può suggerire come posso analizzare la stringa nell'ordine corretto in Java utilizzando il ParseTree creato da ANTLR ?
@BartKiers Avete qualche idea su come risolvere questo problema? –
@BartKiers Hai ragione. 'GT | GE | LT | LE | EQ' hanno tutti la stessa precedenza e dovrebbero essere valutati prima di 'AND | O'. L'analisi dovrebbe essere basata sulle parentesi '()'. Quello che sto cercando è un aiuto su come analizzare la stringa in Java usando il ParseTree mostrato nel codice sopra. – Sudhi
Nel nostro caso, ogni volta che c'è 'AND' tra due componenti, sarebbe sempre tra parentesi'() '. – Sudhi