2008-08-26 16 views
10

हम अपने सी ++ प्रोग्राम में उपयोगकर्ता परिभाषित सूत्रों को देखना चाहते हैं। उदा। मान v = x + (y - (z - 2))/2। बाद में कार्यक्रम में उपयोगकर्ता एक्स, वाई और जेड परिभाषित करेगा -> कार्यक्रम को गणना के परिणाम को वापस करना चाहिए।
सोमवेन बाद में फॉर्मूला बदल सकता है, इसलिए अगली बार कार्यक्रम को फॉर्मूला को पार्स करना चाहिए और नए मान जोड़ना चाहिए।

कोई विचार/संकेत इस तरह कुछ कैसे करें?

अभी तक मैं इन सूत्रों की गणना करने के लिए एक पार्सर लिखने के समाधान के लिए आया था - शायद इसके बारे में कोई विचार?उपयोगकर्ता परिभाषित सूत्रों की गणना (सी ++ के साथ)

उत्तर

3

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

0

Spirit (उदाहरण के लिए) का उपयोग करने के लिए पार्स (और 'अर्थपूर्ण क्रिया' यह एक अभिव्यक्ति वृक्ष बनाने के लिए प्रदान करता है जिसे आप फिर से उपयोग कर सकते हैं, उदाहरण के लिए, मूल्यांकन) काफी सरल समाधान की तरह लगता है। उदाहरण के लिए, यदि आवश्यक हो, तो अंकगणितीय अभिव्यक्ति there के लिए आप व्याकरण पा सकते हैं ... (अपने आप के साथ आने के लिए यह काफी आसान है)।

नोट: आत्मा बहुत सीखने के लिए सरल है, और इस तरह के कार्यों के लिए काफी अनुकूल है।

0

वहाँ आम तौर पर यह करने के दो तरीके, तीन संभावित कार्यान्वयन के साथ है:

  1. के रूप में आप अपने आप पर छुआ गया है, एक पुस्तकालय सूत्रों
  2. मूल्यांकन करने के लिए कोड में सूत्र संकलन

यहां दूसरा विकल्प आमतौर पर ऐसा कुछ संकलित करके किया जाता है जिसे प्लगइन के रूप में लोड किया जा सकता है, या इसे एक अलग प्रोग्राम में संकलित किया जा सकता है जिसे तब लागू किया जाता है और आवश्यक आउटपुट उत्पन्न करता है।

सी ++ के लिए मुझे लगता है कि मूल्यांकन के लिए लाइब्रेरी शायद कहीं मौजूद होगी, इसलिए मैं कहां से शुरू करूंगा।

0

आप अपने खुद के लिखने के लिए चाहते हैं, "औपचारिक ऑटोमेटा" और/या "परिमित राज्य मशीन व्याकरण"

सामान्य तौर पर आप क्या करेंगे स्ट्रिंग पार्स, एक ढेर पर अक्षर धक्का के रूप में आप जाना है के लिए खोज । फिर अक्षरों को पॉप करना शुरू करें और पॉप-अप के आधार पर कार्य करें। यदि आप रिवर्स-पॉलिश नोटेशन के समीकरणों को मजबूर करते हैं तो कोड को आसान बनाना आसान है।

1

आप संचालन और उप-अभिव्यक्तियों के वृक्ष के रूप में अपने सूत्र का प्रतिनिधित्व कर सकते हैं। आप ऑपरेशन प्रकारों और चर के लिए प्रकार या स्थिरांक परिभाषित करना चाह सकते हैं।

फिर आप आसानी से पर्याप्त, एक विधि है कि पेड़ के माध्यम से recurses बारे में जो कुछ भी आप में पारित महत्व देता करने के लिए उचित संचालन को लागू करने के कर सकते हैं।

0

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

यदि आप कमांड लाइन से ऐसा करने की योजना बना रहे हैं (जो कि मुझे आपकी पोस्ट से प्राप्त इंप्रेशन है), तो आपको शायद स्वीकार्य इनपुट का एक सख्त सेट परिभाषित करना चाहिए (उदाहरण के लिए केवल एक अक्षर चर, कोई सफेद जगह, और केवल कुछ गणितीय प्रतीकों:() + - */आदि)।

उसके बाद, आप की आवश्यकता होगी: इनपुट चार सरणी में
पढ़ें
आदेश चर और कार्यों की एक सूची का निर्माण करने में यह पार्स
उन कार्यों पूरे करें - BOMDAS क्रम में

1

बिल्डिंग अपने

) पोस्टफ़िक्स संकेतन (एक ठेठ compsci असाइनमेंट) (मैं एक ढेर का उपयोग करें) ) मान आप चाहते हैं) प्राप्त करने के लिए प्रतीक्षा करने के लिए इन्फ़िक्स से समीकरण परिवर्तित: इस के लिए खुद पार्सर एक सीधी-सपाट आपरेशन होना चाहिए इन्फ़िक्स वस्तुओं के ढेर पॉप, जहां जरूरत ) प्रदर्शन में चर के लिए मूल्य गिर परिणाम

0

ANTLR आप एक पार्सर/संकलक कि उपयोगकर्ता इनपुट की व्याख्या करेगा, फिर विज़िटर पद्धति का उपयोग कर गणना पर अमल बना सकते हैं के साथ। A good example is here, लेकिन यह सी # में है। आपको इसे अपनी आवश्यकताओं के लिए जल्दी से अनुकूलित करने में सक्षम होना चाहिए और सी ++ का उपयोग अपने विकास मंच के रूप में करना चाहिए।

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