2009-06-27 18 views
5

मैं एक जावास्क्रिप्ट पार्सर ढूंढना चाहता हूं जो सरल अभिव्यक्तियों को संभाल और मूल्यांकन कर सकता है। पार्सर नियमित गणितीय अभिव्यक्तियों का मूल्यांकन करने और पैरामीटर के साथ कस्टम कार्यों का समर्थन करने में सक्षम होना चाहिए। इसे स्ट्रिंग हैंडलिंग का भी समर्थन करना है। स्ट्रिंग concatenation || के साथ ऑपरेटर समर्थन को प्राथमिकता दी जाती है, लेकिन यह ठीक है अगर + चाल चलती है।सरल अभिव्यक्ति के लिए जावास्क्रिप्ट पार्सर

एक अभिव्यक्ति के उदाहरण है कि पार्सर द्वारा नियंत्रित किया जाना चाहिए:

3 * (2 + 1) - 1

2 * समारोह (2, 2)

समारोह ('हैलो दुनिया ', 0, 5) || 'आप'

क्या किसी ने ऐसी चीज लागू की है या मुझे कुछ ऐसा कहां मिल सकता है?

+0

आप एक जावास्क्रिप्ट पार्सर के लिए देख रहे हैं एक अलग भाषा में चलाने के लिए? जावास्क्रिप्ट पार्सर के सी ++ कार्यान्वयन की तरह? या जावास्क्रिप्ट के लिए जावास्क्रिप्ट में कुछ? –

+0

क्षमा करें अगर मैं इस बारे में स्पष्ट नहीं था। नहीं, मेरा मतलब जावास्क्रिप्ट में लिखा गया एक पार्सर है जो ऊपर वर्णित सरल अभिव्यक्ति का विश्लेषण और मूल्यांकन करता है। –

+0

ज्ञात "कस्टम" कार्यों का सेट है? –

उत्तर

8

मेरे पास ActionScript parser का एक संशोधित संस्करण है (एएस में लिखा गया है, पार्स एएस नहीं है) जो कस्टम फ़ंक्शंस का समर्थन करता है, लेकिन तार नहीं। हालांकि स्ट्रिंग समर्थन को जोड़ना शायद आसान होगा। मैं इसे कहीं भी अपलोड करूंगा ताकि आप इसे http://silentmatt.com/parser2.jshttp://silentmatt.com/parser3.js पर प्राप्त कर सकें।

संपादित करें: मैंने तारों के लिए आसानी से बुनियादी समर्थन जोड़ा। यह भागने के दृश्यों का समर्थन नहीं करता है और जेएसएफक्शन काम नहीं करता है, लेकिन इसे काम करने में केवल कुछ मिनट लग गए। कॉन्सटेनेशन ऑपरेटर को "||" में बदलना बहुत आसान होना चाहिए।

यहाँ कैसे आप अपने उदाहरण भाव का मूल्यांकन करेंगे:

js> var parser = new Parser(); 
js> parser.parse("3 * (2 + 1) - 1").evaluate(); 
8 
js> parser.parse("2 * func(2; 2)").evaluate({ func:Math.pow }); 
8 
js> function substr(s, start, end) { return s.substring(start, end); } 
js> parser.parse("func('hello world'; 0; 5) + ' you'").evaluate({ func:substr }); 
hello you 

मुझे याद नहीं कि मैं क्यों तर्क विभाजक के रूप में अर्धविराम इस्तेमाल किया; मुझे लगता है कि इसमें कार्यों और अंतर्निहित "ऑपरेटर" कार्यों के बीच अंतर करने के साथ कुछ करना है।

एक और संपादित करें:

मैं इस एक छोटे से खेल रहा है, और अब वहाँ http://silentmatt.com/parser3.js में बेहतर स्ट्रिंग समर्थन के साथ एक संस्करण है (toJSFunction काम करता है, और आप मानक जावास्क्रिप्ट दृश्यों से बचने का उपयोग कर सकते हैं)। यह + के बजाय स्ट्रिंग कॉन्सटेनेशन ऑपरेटर के रूप में सभी कार्यों और || के लिए तर्क अलग करने के लिए अल्पविरामों का भी उपयोग करता है, जो केवल अतिरिक्त है।

+0

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

+0

एक और टिप्पणी ... मैथ्यू, क्या मैं यह कहना भूल गया था कि आप महान हैं! मैं वास्तव में तीसरे संस्करण के आदमी में संशोधन की सराहना करता हूं। अच्छा काम करते रहो। शुभकामनाएं। –

+0

कोई समस्या नहीं है। मैं थोड़ी देर के लिए इसके साथ खेलने का मतलब था (मैंने इसे कई महीनों तक छुआ नहीं है)। बहुत सारे क्रेडिट राफेल ग्राफ को जाते हैं, जिन्होंने मूल संस्करण लिखा था। –

3

मान लिया जाये कि आप जावास्क्रिप्ट में एक जावास्क्रिप्ट पार्सर मतलब है, तो आप शायद चाहते eval()

देखें: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval

बस ऐसे ही eval ध्यान दें, यदि अनुचित तरीके से उपयोग, एक सुरक्षा जोखिम का प्रतिनिधित्व कर सकते हैं।

+0

नहीं, eval मेरे लिए कोई विकल्प नहीं है। जैसा कि आपने कहा था, यह सुरक्षा जोखिम पेश करेगा, और मेरे मामले में जोखिम वास्तव में उच्च है। मैं ऊपर वर्णित क्या करने के लिए एक कस्टम और सीमित पार्सर चाहता हूँ। लेकिन धन्यवाद –

3

उपयोग नहीं किया है, लेकिन एक त्वरित गूगल का पता चलता है http://jsfromhell.com/classes/math-parser

संपादित:

क्या आप पहली कड़ी की पहुंच से बाहर हो सकता है क्या करना चाहते हैं, तो आप भी इस पर एक नज़र हो सकता था डगलस क्रॉकफ़ोर्ड का "parser for Simplified JavaScript"

यह सिर्फ एक पार्सर है, इसलिए आपको अपने सभी मूल्यांकन स्वयं करना होगा। हालांकि, यह कुछ हद तक आसान बना देगा और यह eval का उपयोग नहीं करता है।

+0

धन्यवाद। यह एक वादा करता है और मेरे अनुरोध के निकटतम मैच, हालांकि, इसमें स्ट्रिंग समर्थन की कमी है। तारों का समर्थन करने के लिए इसे संशोधित करना मुश्किल है, क्योंकि यह पार्सिंग के अनुकूलित (लेकिन अच्छे) तरीके के बजाय रिकर्सिव दृष्टिकोण पर रिले नहीं करता है। क्या कोई स्ट्रिंग का समर्थन करने के लिए इसे संशोधित करने में मदद कर सकता है? –

0

मनमाने ढंग से पार्सर्स/कंपाइलर्स बनाने के तरीके के लिए इस ट्यूटोरियल को देखें। (मूल रूप से यह व्याकरण से व्याकरण से पुनरावर्ती मूल पार्सर्स के निर्माण को स्वचालित करता है, जिसका अर्थ है कि आप आसानी से अपना अभिव्यक्ति वाक्यविन्यास बदल सकते हैं)। संपूर्ण ट्यूटोरियल जावास्क्रिप्ट में किया जाता है, इसलिए यह आपको सीधे लागू होता है।

http://www.bayfronttechnologies.com/mc_tutorial.html

2

कोशिश math.js:

http://mathjs.org

एक व्यापक और आसान के साथ आता है पार्सर, जो भी अपने उदाहरण अभिव्यक्ति में की तरह काम और चर और कार्यों का उपयोग का समर्थन करता है का उपयोग करें। "देशी" जावास्क्रिप्ट के साथ निर्बाध रूप से एकीकृत करता है: आप पार्सर्स स्कोप से चर और फ़ंक्शन सेट और सेट कर सकते हैं।

आपका उदाहरण कोड के रूप में मूल्यांकन किया जाएगा:

var parser = math.parser(); 
parser.set('func', function() { 
    // ... do something ... 
}); 
parser.eval('3 * (2 + 1) - 1'); 
parser.eval('2 * func(2, 2)'); 
parser.eval('func("hello world", 0, 5) + " you"'); 

कार्य भी पार्सर ही (वर्तमान में केवल एकल लाइन कार्यों) में परिभाषित किया जा सकता:

parser.eval('function f(x, y) = x^y'); 
parser.eval('f(2, 3)'); // 8 
संबंधित मुद्दे