Ich versuche, einen verschachtelten booleschen Ausdruck zu analysieren und die einzelnen Bedingungen innerhalb des Ausdrucks getrennt zu erhalten. wenn die Eingabezeichenfolge für beispielsweise ist:Nested Boolean Expression Parser mit ANTLR
(A = A oder B = b oder C = C ((D = D und E = E) oder (F = f und g = g)))
Ich möchte die Bedingungen mit der richtigen Reihenfolge erhalten. dh
D = D und E = e OR F = f und g = g UND A = B = A oder B oder C = C
Ich verwende ANTLR 4 auf der Syntaxanalyse Eingabe von Text und hier ist meine Grammatik:
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;
und hier ist der Java-Code, die ich verwende es zu analysieren:
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));
die ou tput ist:
(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>)
Ich bin auf der Suche nach Hilfe, wie dieser Baum zu analysieren, die Bedingungen in der richtigen Reihenfolge zu bekommen? In ANTLR 3 könnten wir^und! zu entscheiden, wie der Baum gebaut wird (siehe thread), aber ich habe gelernt, dass dies nicht in ANTLR 4.
Kann jemand vorschlagen, wie ich die Zeichenfolge in der richtigen Reihenfolge in Java mit dem von ANTLR erstellten ParseTree analysieren kann ?
@BartKiers Haben Sie eine Idee, wie Sie dieses Problem lösen können? –
@BartKiers Sie haben Recht. 'GT | GE | LT | LE | EQ' haben alle die gleiche Priorität und sollten vor 'AND | ausgewertet werden ODER'. Das Parsen sollte auf den Klammern '()' basieren. Nach was ich suche, ist Hilfe, wie man die Zeichenkette in Java unter Verwendung des ParseTree, das im Code oben gezeigt wird, analysiert. – Sudhi
In unserem Fall, immer wenn zwischen zwei Komponenten UND steht, wäre es immer in Klammern '()'. – Sudhi