Próbuję przeanalizować Zagnieżdżoną wyrażenie logiczne i oddzielnie uzyskać indywidualne warunki wyrażenia. Na przykład, jeśli wejściowy ciąg znaków to:Zagnieżdżony analizator składni logicznej za pomocą ANTLR
(A = a OR B = b OR C = c ORAZ (D = d E = e) OR (F = f G = g)))
Chciałbym uzyskać warunki z prawidłową kolejnością. tj
D = D i E = E lub F = F i G = g I A = B = A lub B lub C = C
mi stosując ANTLR 4 do analizowania tekst wejściowy i oto moja gramatyka:
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;
a oto kod Java, że używam go do analizowania:
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));
oU tput to:
(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>)
Szukam pomocy w analizowaniu tego drzewa, aby uzyskać warunki we właściwej kolejności? W ANTLR 3 moglibyśmy określić^i! aby zdecydować, w jaki sposób drzewo jest budowane (zapoznaj się z tym thread), ale dowiedziałem się, że nie jest to obsługiwane w ANTLR 4.
Czy ktoś może zasugerować, w jaki sposób mogę analizować ciąg w poprawnej kolejności w Javie przy użyciu ParseTree utworzonego przez ANTLR ?
@BartKiers Czy masz pojęcie, jak rozwiązać ten problem? –
@BartKiers Masz rację. 'GT | GE | LT | LE | EQ' mają takie samo pierwszeństwo i powinny być ocenione przed 'AND | OR ". Parsowanie powinno opierać się na nawiasach '()'. To, czego szukam, to pomoc w analizowaniu łańcucha znaków w Javie przy użyciu programu ParseTree pokazanego w powyższym kodzie. – Sudhi
W naszym przypadku, gdy występuje "AND" między dwoma komponentami, zawsze będzie w nawiasach '()'. – Sudhi