मान लें कि मैंने एक साधारण गणितीय ऑपरेशन का मूल्यांकन करने के लिए एक फ़ंक्शन लिखा है, और मेरे पास स्ट्रिंग में कुछ उपयोगकर्ता इनपुट हैं जैसे: "1 + [2 + [3 + 4]]" मैं इन स्क्वायर ब्रैकेट को कैसे पार्स कर सकता हूं और पहले आंतरिक-पाठ (3 + 4) निकाल सकता हूं, इसका मूल्यांकन कर सकता हूं, फिर बाहरी ब्रेसिज़ (2 + 7) पार्स कर सकता हूं? मुझे रेगेक्स खोज और प्रतिस्थापन की प्राथमिक समझ है, लेकिन मुझे पता है कि वे इस तरह की पुनरावृत्ति नहीं करेंगे। मुझे यह करने के लिए कुछ बुनियादी जावा कोड चाहिए, अभी तक एक और जार/एपीआई अगर मैं इससे बच सकता हूं।नेस्टेड अभिव्यक्तियों को पार्स करने के लिए जावा विधि
उत्तर
अपने लक्ष्य को पूरा करने का सबसे साफ तरीका इस उद्देश्य के लिए लेक्सर और पार्सर लिखना है। recursive descent parser लिखना अंकगणितीय अभिव्यक्तियों के लिए खरोंच से करना मुश्किल नहीं है।
वेब पर कई कोड उदाहरण हैं। This is an example कि आप प्रेरणा के लिए उपयोग कर सकते हैं।
लेक्सर आपके इनपुट को सामान्य करने और इसे टोकन की एक धारा में अमूर्त करने के लिए है। इस तरह, आपके पार्सर को केवल व्हाइटस्पेस मुद्दों और अन्य परेशान चीजों से निपटने के बजाय टोकन पर काम करने की आवश्यकता है।
Twoexamples उच्च-स्तरीय एल्गोरिदम के लिए जो स्टैक-आधारित, another example हैं जो एक पुनरावर्ती मूल दृष्टिकोण दिखाता है।
मुझे लगता है कि regex इस कार्यक्षमता
आप पोस्टफ़िक्स या उपसर्ग अंकन करने के लिए उपयोगकर्ता अभिव्यक्ति परिवर्तित करना चाहिए और उसके बाद उन लोगों से एक अभिव्यक्ति पेड़ निर्माण को प्राप्त करने के लिए एक अच्छा विकल्प नहीं है। यह सीएस में एक मानक दृष्टिकोण (भाषा वास्तव में बात यहाँ नहीं करता है) एक साफ रास्ता
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)
}
उपयोग एक ढेर। जब आप एक खुले ब्रैकेट का सामना करते हैं, तो जो भी आप ढेर पर काम कर रहे हैं उसे दबाएं और नई अभिव्यक्ति शुरू करें। जब आप एक बंद ब्रैकेट दबाते हैं, तो स्टैक पॉप करें और उस अभिव्यक्ति का उपयोग करें जिसे आपने अभी अगले आइटम के रूप में गणना की है। या, जैसा कि पिछले पोस्टर ने कहा है, रिकर्सन या पेड़ का उपयोग करें।
जावा के लिए, आप पार्सर/लेक्सर के लिए JavaCC का उपयोग कर सकते हैं। मैंने कई परियोजनाओं में इसका इस्तेमाल किया है। इसका उपयोग करना बहुत आसान है। उदाहरणों में से एक, मुझे लगता है, एक अंकगणितीय पार्सिंग शामिल है। जावासीसी सिंटैक्स पेड़ का निर्माण करेगा जहां आप चल सकते हैं।
जावासीसी का उपयोग करके अंकगणित करने का प्रयास संदर्भ मुक्त व्याकरण और सार सिंटेक्स वृक्ष की अवधारणा के लिए अच्छा परिचय देगा। यदि आप सीख रहे हैं, तो यह देखने के बाद एक अच्छा कदम है कि @emboss ने
- 1. नियमित अभिव्यक्तियों को पार्स करने के लिए पारसेक का उपयोग
- 2. एक्सएसडी स्कीमा फ़ाइल को पार्स करने के लिए जावा एपीआई
- 3. इंफिक्स नोटेशन में अभिव्यक्तियों को पार्स करने के लिए एल्गोरिदम क्या है?
- 4. स्ट्रिंग करने के लिए सशर्त अभिव्यक्तियों को पार्सिंग
- 5. नेस्टेड कोष्ठक को पार्स करने के लिए कोई सीपीएएन मॉड्यूल है?
- 6. नेस्टेड कॉलबैक के लिए जावा पैटर्न?
- 7. एक विधि को लागू करने के लिए कैसे जावा
- 8. जावा में जावा को पार्स करने का सबसे अच्छा तरीका
- 9. कैसे अपाचे लॉग पार्स करने के लिए
- 10. अनगिनत JSON स्ट्रिंग को पार्स करने के लिए कैसे करें
- 11. ActiveRecord पार्स स्ट्रिंग डेटाटाइम करने के लिए?
- 12. बूलियन अभिव्यक्तियों को दोबारा करने के लिए टूल
- 13. एक जावा को पार्स करने से तारीख को वापस लेना()
- 14. Tagsoup एक StringReader (जावा) से एचटीएमएल दस्तावेज़ को पार्स करने
- 15. नियमित अभिव्यक्तियों का उपयोग करने या नहीं करने के लिए?
- 16. सी # - वेब पेज पार्स करने के लिए सर्वश्रेष्ठ दृष्टिकोण?
- 17. जावा। उदाहरण के लिए विधि
- 18. EF के लिए ऑर्डर करने के लिए एकाधिक अभिव्यक्तियों को कैसे पास किया जाए?
- 19. लाइब्रेरी पार्स करने के लिए SQL कथन
- 20. पार्स नेस्टेड जेसन रीढ़ की हड्डी संग्रह
- 21. मार्कडाउन को पार्स करने के बारे में आप कैसे जाएंगे?
- 22. SQL पैरामीटर को पार्स करने के लिए Regex
- 23. मेलिंग पते को पार्स करने के लिए नियमित अभिव्यक्ति
- 24. HttpLog प्रारूप को पार्स करने के लिए Regex पैटर्न
- 25. जीएनयू-शैली तर्कों को पार्स करने के लिए लाइब्रेरी?
- 26. सी लाइब्रेरी अनुमानित तिथियों को पार्स करने के लिए
- 27. रीजिक्स ईमेल फॉर्म "टू" फ़ील्ड को पार्स करने के लिए
- 28. बैश स्क्रिप्ट को पार्स करने के लिए हास्केल लाइब्रेरी?
- 29. मानचित्र में स्ट्रिंग को पार्स करने के लिए कैसे करें
- 30. उपयोगकर्ता एजेंट स्ट्रिंग को पार्स करने के लिए कोड?
संबंधित: https://stackoverflow.com/questions/3422673/evaluating-a-math-expression-given-in-string -प्रपत्र – Boann