का उपयोग कर नेस्टेड बूलियन एक्सप्रेशन पार्सर मैं एक नेस्टेड बूलियन अभिव्यक्ति का विश्लेषण करने की कोशिश कर रहा हूं और अभिव्यक्ति के भीतर अलग-अलग स्थितियों को अलग-अलग प्राप्त कर रहा हूं। उदाहरण के लिए, यदि इनपुट स्ट्रिंग है:एएनटीएलआर
(ए = ए या बी = बी या सी = सी और ((डी = डी और ई = ई) या (एफ = एफ और जी = जी))
मैं सही क्रम के साथ शर्तों को प्राप्त करना चाहता हूं। यानी,
डी = डी और ई = ई या एफ = एफ और जी = जी और एक = एक या बी = बी या सी = सी
मैं पार्स करने के लिए ANTLR 4 का उपयोग कर रहा इनपुट पाठ और यहाँ मेरी व्याकरण है:
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;
और यहाँ जावा कोड है कि मैं यह पार्स करने के लिए उपयोग कर रहा हूँ है:
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));
कहां 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>)
मैं कैसे सही क्रम में की स्थिति प्राप्त करने के लिए इस पेड़ को पार्स करने के लिए मदद की तलाश कर रहा हूँ? एएनटीएलआर 3 में, हम^और निर्दिष्ट कर सकते हैं! यह तय करने के लिए कि पेड़ कैसे बनाया गया है (यह thread देखें), लेकिन मैंने सीखा कि यह एएनटीएलआर 4 में समर्थित नहीं है।
क्या कोई सुझाव दे सकता है कि मैं एएनटीएलआर द्वारा बनाई गई पारसीट्री का उपयोग करके जावा में सही क्रम में स्ट्रिंग को कैसे पार्स कर सकता हूं ?
@ बार्टकिअर्स क्या आपको इस समस्या को हल करने का कोई विचार है? –
@ बार्टकिअर्स आप सही हैं। 'जीटी | जीई | एलटी | ली | ईक्यू' की सभी समान प्राथमिकता है और उनका मूल्यांकन 'AND | से पहले किया जाना चाहिए OR'। पार्सिंग को ब्रैकेट '()' पर आधारित होना चाहिए। जो मैं खोज रहा हूं वह ऊपर दिए गए कोड में दिखाए गए पारसीट्री का उपयोग करके जावा में स्ट्रिंग को पार्स करने के तरीके पर सहायता करता है। – Sudhi
हमारे मामले में, जब भी दो घटकों के बीच 'AND' होता है, तो यह हमेशा ब्रैकेट'() 'के अंदर होगा। – Sudhi