2011-08-31 16 views
6

मान लें कि मैंने एक साधारण गणितीय ऑपरेशन का मूल्यांकन करने के लिए एक फ़ंक्शन लिखा है, और मेरे पास स्ट्रिंग में कुछ उपयोगकर्ता इनपुट हैं जैसे: "1 + [2 + [3 + 4]]" मैं इन स्क्वायर ब्रैकेट को कैसे पार्स कर सकता हूं और पहले आंतरिक-पाठ (3 + 4) निकाल सकता हूं, इसका मूल्यांकन कर सकता हूं, फिर बाहरी ब्रेसिज़ (2 + 7) पार्स कर सकता हूं? मुझे रेगेक्स खोज और प्रतिस्थापन की प्राथमिक समझ है, लेकिन मुझे पता है कि वे इस तरह की पुनरावृत्ति नहीं करेंगे। मुझे यह करने के लिए कुछ बुनियादी जावा कोड चाहिए, अभी तक एक और जार/एपीआई अगर मैं इससे बच सकता हूं।नेस्टेड अभिव्यक्तियों को पार्स करने के लिए जावा विधि

+0

संबंधित: https://stackoverflow.com/questions/3422673/evaluating-a-math-expression-given-in-string -प्रपत्र – Boann

उत्तर

9

अपने लक्ष्य को पूरा करने का सबसे साफ तरीका इस उद्देश्य के लिए लेक्सर और पार्सर लिखना है। recursive descent parser लिखना अंकगणितीय अभिव्यक्तियों के लिए खरोंच से करना मुश्किल नहीं है।

वेब पर कई कोड उदाहरण हैं। This is an example कि आप प्रेरणा के लिए उपयोग कर सकते हैं।

लेक्सर आपके इनपुट को सामान्य करने और इसे टोकन की एक धारा में अमूर्त करने के लिए है। इस तरह, आपके पार्सर को केवल व्हाइटस्पेस मुद्दों और अन्य परेशान चीजों से निपटने के बजाय टोकन पर काम करने की आवश्यकता है।

Twoexamples उच्च-स्तरीय एल्गोरिदम के लिए जो स्टैक-आधारित, another example हैं जो एक पुनरावर्ती मूल दृष्टिकोण दिखाता है।

2

मुझे लगता है कि regex इस कार्यक्षमता

आप पोस्टफ़िक्स या उपसर्ग अंकन करने के लिए उपयोगकर्ता अभिव्यक्ति परिवर्तित करना चाहिए और उसके बाद उन लोगों से एक अभिव्यक्ति पेड़ निर्माण को प्राप्त करने के लिए एक अच्छा विकल्प नहीं है। यह सीएस में एक मानक दृष्टिकोण (भाषा वास्तव में बात यहाँ नहीं करता है) एक साफ रास्ता

0

Recursion इन के लिए अच्छी तरह से काम में इस समस्या को हल करने के लिए है:

int parse(String expression){ 
    //use a regex to find an instance of [ followed by numbers/operators, followed by ] 
    //replace it with parse(whatever's inside the brackets) 
    //continue until there are none left 
    //evaluate the string (which should be a sequence of numbers and operators without brackets) 
} 
3

उपयोग एक ढेर। जब आप एक खुले ब्रैकेट का सामना करते हैं, तो जो भी आप ढेर पर काम कर रहे हैं उसे दबाएं और नई अभिव्यक्ति शुरू करें। जब आप एक बंद ब्रैकेट दबाते हैं, तो स्टैक पॉप करें और उस अभिव्यक्ति का उपयोग करें जिसे आपने अभी अगले आइटम के रूप में गणना की है। या, जैसा कि पिछले पोस्टर ने कहा है, रिकर्सन या पेड़ का उपयोग करें।

0

जावा के लिए, आप पार्सर/लेक्सर के लिए JavaCC का उपयोग कर सकते हैं। मैंने कई परियोजनाओं में इसका इस्तेमाल किया है। इसका उपयोग करना बहुत आसान है। उदाहरणों में से एक, मुझे लगता है, एक अंकगणितीय पार्सिंग शामिल है। जावासीसी सिंटैक्स पेड़ का निर्माण करेगा जहां आप चल सकते हैं।

जावासीसी का उपयोग करके अंकगणित करने का प्रयास संदर्भ मुक्त व्याकरण और सार सिंटेक्स वृक्ष की अवधारणा के लिए अच्छा परिचय देगा। यदि आप सीख रहे हैं, तो यह देखने के बाद एक अच्छा कदम है कि @emboss ने

संबंधित मुद्दे