2010-02-18 14 views
9

मैं एक ऐसा एप्लिकेशन लिख रहा हूं जो उपयोगकर्ता को बूलियन अभिव्यक्ति दर्ज करने की अनुमति देता है। मुझे रनटाइम पर दर्ज बूलियन अभिव्यक्ति का मूल्यांकन करने की क्षमता की आवश्यकता है और मैं एक पार्सर और एक एक्सप्रेसइन सत्यापनकर्ता की तलाश में हूं।बूलियन और मैथ एक्सप्रेशन पार्सर

पार्सर
पार्सर एक स्ट्रिंग के रूप में एक बूलियन अभिव्यक्ति लेने के लिए और सही/गलत वापस जाने के लिए की जरूरत है।

उदाहरण:

 
string expression = "(1 == 1) && (1 > 0)"; 
Parser parser = new Parser(); 
boolean result = parser.parse(expression); // Result should be True. 

बूलियन अभिव्यक्ति मैं भी यह गणित को संभालने की ज़रूरत से निपटने के अलावा।

 
expression = "((1 + 1 * 2) == 1)"; 
result = parser.parse(expression); // Result should be False. 

मान्य
तो यह है कि मैं उपयोगकर्ता बता सकते हैं कि वहाँ दर्ज किया जा रहा मैं भी वाक्य रचना को मान्य करने के लिए एक तरह से की जरूरत है अभिव्यक्ति के साथ एक समस्या है।

मैं .NET कॉम्पैक्ट फ्रेमवर्क का उपयोग कर सी # में काम कर रहा हूं, लेकिन अगर आपको किसी अन्य भाषा में लिखी गई चीज़ के बारे में पता है जो उपयोगी हो सकता है।

आपकी सहायता के लिए धन्यवाद। टॉम

उत्तर

3

http://www.antlr.org

antlr व्याकरण दोनों पार्स करने और मूल्यांकन के लिए अनुमति देने के लिए तैयार किया जा सकता।

यहाँ एक उदाहरण है: http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator

+0

+1। यदि आप इसे देखते हैं और इसे खारिज करते हैं, तो सोचते हैं कि यह बहुत परेशानी है, कृपया पुनर्विचार करें। मैं आपको एक व्याकरण विकास उपकरण के रूप में एएनटीएलआरवर्क्स का उपयोग करने की सलाह देता हूं और इसे अपने विजुअल स्टूडियो प्रोजेक्ट पेड़ में लेक्सर और पार्सर क्लास आउटपुट करता हूं। यह अपेक्षाकृत निर्बाध है और इसे अपने व्याकरण को ट्विक करना आसान है और जल्दी ही अपने .NET दुनिया में इसके प्रभाव देख सकते हैं। –

+0

ऊपर "आप" द्वारा, मेरा मतलब था थॉमस ओपी। –

+0

@ क्रिस किसान: यह सी # कॉम्पैक्ट फ्रेमवर्क को लक्षित कर रहा है ... इसके लिए थोड़ा भारी हो सकता है ... – t0mm13b

0

मुझे यह आसान बनाने के लिए किसी भी पुस्तकालयों के बारे में पता नहीं है, लेकिन आपके पास वास्तव में केवल दो उपप्रवाह हैं। आपको पोस्टफिक्स कनवर्टर के लिए एक इंफिक्स बनाने की आवश्यकता है, फिर बूलियन और गणित संचालन के लिए मूल कैलक्यूलेटर लिखें।

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

यदि आप "पोस्टफिक्स के लिए इन्फिक्स" और "स्टैक आरपीएन कैलकुलेटर" google पर हैं, तो आप शायद अधिक संसाधन पा सकते हैं।

+2

यदि आप "eval" वाली भाषा में बाहर निकल सकते हैं, तो समस्या हल हो जाती है। आप सच या झूठ की तलाश करते हैं, और बाकी सब कुछ के लिए, आप जानते हैं कि आप अमान्य हैं। –

+0

मुझे लगता है कि "eval" पूरी तरह से जाने का गलत तरीका है। यह संभावित रूप से आसान है, लेकिन यह खतरनाक है कि लोगों को आपकी भाषा में कानूनी कोड लिखने दें। यह बेहतर है, आईएमएचओ, इन अभिव्यक्तियों के लिए उपलब्ध एक विशिष्ट और सीमित व्याकरण है। एएनटीएलआर के लिए –

0

आप ऐसा करने के लिए dotMath लाइब्रेरी का उपयोग करने में सक्षम हो सकते हैं।

0

यहाँ Codeproject पर एक उत्कृष्ट मूल्यांकन पार्सर, eval विधि का उपयोग करता है और CodeDOM या ऐसा कुछ पर निर्भर नहीं करता है कि है। यहाँ antlr का उपयोग कर एक expression evaluator निर्माण, यह भी एक ही साइट पर पर एक उत्कृष्ट लेख ..

आशा इस मदद करता है, सादर, टॉम है।

0

इस प्रकार की चीज एफ # की रोटी और मक्खन है। आप इसे आज़मा सकते हैं। पार्सिंग के लिए, रिकर्सिव वंश का उपयोग करें, फिर आप परिणाम के पेड़ पर दौड़ सकते हैं। यदि आपके पास इनपुट भाषा का नियंत्रण है, तो आप एक उद्धरण ऑपरेशन के साथ प्राप्त कर सकते हैं।

2

मान लिया जाये कि आप अपने वाक्य रचना थोड़ा बदल सकते हैं, एक एम्बेडेड डेटाबेस इस T-SQL की तरह एक प्रश्न के साथ आप के लिए काम करने दें:

select case when <Expression> then 1 else 0 end as Result 

अपने उदाहरण का उपयोग करना:

select case when ((1 = 1) and (1 > 0)) then 1 else 0 end as Result 
select case when ((1 + 1 * 2) = 1) then 1 else 0 end as Result 
+1

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

6

हमारी परियोजना NCalc (लेक्सिंग/पार्सिंग के नीचे ANTLR के साथ) का उपयोग कर रहा है और हम इससे बहुत खुश हैं।

एनसीएएलसी एक गणितीय अभिव्यक्ति .NET में मूल्यांकनकर्ता है। एनसीएएलसी अभिव्यक्ति को पार्स कर सकता है और परिणाम का मूल्यांकन कर सकता है, स्थिर या गतिशील पैरामीटर और कस्टम फ़ंक्शन समेत।

हमारे आवेदन की आवश्यकता है कि यह पूर्ण और कॉम्पैक्ट फ्रेमवर्क दोनों के लिए क्रॉस-संकलित हो। तुलनात्मक रूप से सरल बदलावों के साथ हम दोनों फ्रेमवर्क स्वादों के लिए एनसीएएलसी और एएनटीएलआर दोनों काम करने में सक्षम थे।

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