5

मैं ऐसी भाषा बनाने के लिए तैयार हूं जो डीएसएल के निर्माण के लिए बेहद उपयुक्त होगा, जो इंफिक्स, पोस्टफिक्स, उपसर्ग, या यहां तक ​​कि कई शब्दों के कार्यों की परिभाषाओं की अनुमति देकर। उदाहरण के लिए, यदि आप एक इन्फ़िक्स गुणा ऑपरेटर के रूप में निम्नानुसार निर्धारित कर सकते हैं (जहां गुणा (एक्स, वाई) पहले से ही परिभाषित किया गया है):किसी भी कारण से मैं infix, postfix, और उपसर्ग कार्यों का समर्थन करने वाली भाषा नहीं बना सकता, और और भी?

a * b => multiply(a,b) 

या एक पोस्टफ़िक्स "चुकता" ऑपरेटर:

a squared => a * a 

या एक सी या जावा शैली त्रिगुट ऑपरेटर, जो दो कीवर्ड चर के साथ बीच-बीच में शामिल है:

a ? b : c => if a==true then b else c 

जाहिर है इस तरह के एक भाषा में अस्पष्टता के लिए गुंजाइश के बहुत सारे है, लेकिन अगर यह स्थिर लिखा गया (के साथ टाइप अनुमान), तो अधिकांश अस्पष्टताओं को समाप्त किया जा सकता है, और जो लोग रहते हैं उन्हें एक वाक्यविन्यास त्रुटि माना जा सकता है (जहां उचित हो वहां ब्रैकेट जोड़कर सही किया जा सकता है)।

क्या कोई कारण नहीं है कि मैं यह नहीं देख रहा हूं कि यह बेहद मुश्किल, असंभव, या सिर्फ एक सादा बुरा विचार होगा?

संपादित करें: लोगों ने मुझे भाषाओं है कि इस या ऐसा कर सकते हैं कुछ इस तरह की ओर इशारा किया है, लेकिन मैं वास्तव में करने के लिए संकेत में रुचि कैसे मैं इसके लिए अपने खुद के पार्सर को लागू कर सकता है, या समस्याओं मैं सामना कर सकते हैं कर रहा हूँ अगर ऐसा कर रहा है।

+2

ForthLisp Reinventing? –

उत्तर

15

ऐसा करना बहुत मुश्किल नहीं है। आप प्रत्येक ऑपरेटर को फ़िक्सिटी (इंफिक्स, उपसर्ग, या पोस्टफिक्स) और प्राथमिकता असाइन करना चाहते हैं। प्राथमिकता को वास्तविक संख्या बनाएं; आप बाद में मुझे धन्यवाद देंगे। उच्च प्राथमिकता के ऑपरेटर कम प्राथमिकता के ऑपरेटरों की तुलना में अधिक कसकर बांधते हैं; श्रेष्ठता के बराबर के स्तर पर, आप कोष्ठकों के साथ बहुविकल्पी की आवश्यकता होती है सकते हैं, लेकिन आप शायद साहचर्य होने के लिए कुछ ऑपरेटरों की अनुमति के लिए पसंद करेंगे तो आप

x + y + z 

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

एक और मामला आप के लिए सावधान रहना चाहता हूँ जब आप

prefix (e) postfix 

जहां prefix और postfix एक ही पूर्वता है है। इस मामले में असंबद्धता के लिए भी ब्रांड्स की आवश्यकता होती है।

मेरा पेपर Unparsing Expressions with Prefix and Postfix Operators पीछे एक उदाहरण पार्सर है, और आप कोड डाउनलोड कर सकते हैं, लेकिन यह एमएल में लिखा गया है, इसलिए इसकी कार्यप्रणाली शौकिया के लिए स्पष्ट नहीं हो सकती है। लेकिन दृढ़ता का पूरा व्यवसाय और बहुत कुछ विस्तार से समझाया गया है।

+1

+1 वास्तविक संख्या :-) – mikera

0

Haskell सिर्फ वही है जो आप ढूंढ रहे हैं।

+0

मुझे पूरा यकीन है कि हास्केल '-' को छोड़कर उपसर्ग ऑपरेटरों को नहीं करता है, और मुझे पोस्टफिक्स के बारे में निश्चित नहीं है - अकेले अधिक जटिल संरचनाएं दें। वैसे भी, मैं सिर्फ एक खोजने के लिए ऐसी भाषा बनाने की तलाश में हूं। – sanity

+0

हास्केल में फ़ंक्शंस की फिक्स्डिटी के कार्यान्वयन * संभावित रूप से कुछ लोगों को शेड कर सकते हैं कि आप इसे अपनी भाषा में कैसे कार्यान्वित करेंगे। – yfeldblum

2

आप संचालन के आदेश के बारे में क्या करने जा रहे हैं?

a * b squared 
+0

अच्छा सवाल। मुझे लगता है कि ऑपरेटर प्राथमिकता निर्दिष्ट करने के लिए शायद कुछ तरीका है, और एक सिंटैक्स त्रुटि अगर यह अभी भी संदिग्ध है। – sanity

1

आप स्काला को देखना चाहते हैं जिसमें ऑपरेटर और विधियों के लिए एक अद्वितीय दृष्टिकोण है।

+0

मुझे इस प्रकार की चीज़ के लिए अपने स्वयं के पार्सर को लागू करने के तरीकों के लिए पॉइंटर्स में दिलचस्पी है, या ऐसी समस्याएं जो मुझे ऐसा करने में मिल सकती हैं। वास्तविकता होने के लिए – sanity

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