यह कुछ क्लीवर नियमित अभिव्यक्ति का उपयोग करके नहीं किया जा सकता है (नियमित अभिव्यक्ति "कोष्ठक की गणना नहीं कर सकती")। आपका सबसे अच्छा विकल्प कुछ पार्सर जनरेटर का उपयोग करना है और स्ट्रिंग को abstract syntax tree (संक्षिप्त के लिए एएसटी) में पार्स करना है।
उदाहरण के लिए JFlex/JavaCUP पर एक नज़र डालें।
// CUP specification for a simple expression evaluator (w/ actions)
import java_cup.runtime.*;
/* Preliminaries to set up and use the scanner. */
init with {: scanner.init(); :};
scan with {: return scanner.next_token(); :};
/* Terminals (tokens returned by the scanner). */
terminal SEMI, PLUS, MINUS, TIMES, DIVIDE, MOD;
terminal UMINUS, LPAREN, RPAREN;
terminal Integer NUMBER;
/* Non-terminals */
non terminal expr_list, expr_part;
non terminal Integer expr;
/* Precedences */
precedence left PLUS, MINUS;
precedence left TIMES, DIVIDE, MOD;
precedence left UMINUS;
/* The grammar */
expr_list ::= expr_list expr_part
|
expr_part;
expr_part ::= expr:e
{: System.out.println("= " + e); :}
SEMI
;
expr ::= expr:e1 PLUS expr:e2
{: RESULT = new Integer(e1.intValue() + e2.intValue()); :}
|
expr:e1 MINUS expr:e2
{: RESULT = new Integer(e1.intValue() - e2.intValue()); :}
|
expr:e1 TIMES expr:e2
{: RESULT = new Integer(e1.intValue() * e2.intValue()); :}
|
expr:e1 DIVIDE expr:e2
{: RESULT = new Integer(e1.intValue()/e2.intValue()); :}
|
expr:e1 MOD expr:e2
{: RESULT = new Integer(e1.intValue() % e2.intValue()); :}
|
NUMBER:n
{: RESULT = n; :}
|
MINUS expr:e
{: RESULT = new Integer(0 - e.intValue()); :}
%prec UMINUS
|
LPAREN expr:e RPAREN
{: RESULT = e; :}
;
धन्यवाद, मैं इसे देख रहा हूं। – Adnan
आपको पछतावा नहीं होगा। जटिल पार्सिंग आसानी से करने की बात आती है जब पार्सर जेनरेटर वास्तव में उपयोगी होते हैं। – aioobe