2011-11-04 9 views
7

मैं पहले से ही अपने पैरों को कार्यात्मक प्रोग्रामिंग के साथ गीला कर चुका हूं; मैं हास्केल और पीएलटी योजना में परिचित हूं (हालांकि कुशल नहीं)। मैंने खिलौना भाषाओं के लिए छोटे दुभाषिया बनाने के लिए पीएलटी योजना का उपयोग किया है (पीएलएआई का संदर्भ) - मैं अनिवार्य भाषाओं के साथ बेहतर हूं।प्रोलॉग-आधारित दुभाषिया

क्या कोई मुझे उन संसाधनों के लिए निर्देशित कर सकता है जो मैं प्रोलॉग के साथ अपने चयन की खिलौना भाषा का एक छोटा दुभाषिया बनाने के लिए उपयोग कर सकता हूं?

+0

क्या आप ऐसी भाषा बनाना चाहते हैं जहां आप कुछ बाइट कोड द्वारा रनटाइम को कार्यान्वित करते हैं, या आप कुछ मेटा दुभाषिया दृष्टिकोण के लिए इच्छुक हैं? –

+0

@ महत्वपूर्ण रूप से अनंत, मैं मेटाटरप्टर दृष्टिकोण के लिए जा रहा था।आपके द्वारा वर्णित विकल्प अनुभव की कमी के कारण थोड़ा अधिक लगता है। – arkate

उत्तर

7

मैं मुख्य रूप से स्वाई-प्रोलॉग का उपयोग करता हूं, इसलिए जो कुछ मैं कहता हूं वह स्विई-प्रोलॉग से संबंधित होगा। हालांकि, अन्य प्रोलोज़ कार्यान्वयन में समान भविष्यवाणियां/पुस्तकालय हो सकते हैं (शायद थोड़ा अलग नाम के साथ) ताकि आप उनके मैनुअल खोज सकें और उन्हें ढूंढ सकें। इसके अलावा, मैं प्रोलॉग में एक कंपाइलर नहीं, एक दुभाषिया लिख ​​रहा हूं, इसलिए हो सकता है कि कुछ हिस्सों में दुभाषिया से संबंधित न हो।

SWI-Prolog's documentation site सामान को खोजने के लिए वास्तव में अच्छा है: खोज बॉक्स का उपयोग किसी भी विधेय लगता है या एक विशिष्ट खोज करने के लिए। पुस्तकालयों की एक बड़ी संख्या है लेकिन आप अनुभव प्राप्त करने के लिए कुछ सामान स्वयं लागू करना चाहेंगे। आप पहिया का पुन: आविष्कार समाप्त कर सकते हैं लेकिन यह उपयोगी होगा।

पुस्तक "द आर्ट ऑफ़ प्रोलॉग" (स्टर्लिंग, शापिरो) में प्रोलॉग में एक कंपाइलर बनाने के लिए समर्पित एक अध्याय है (और यह भी प्रोलॉग के लिए एक अच्छी किताब है)।

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

पार्सर मैं DCG उपयोग करने का सुझाव के लिए: निश्चित खंड व्याकरण: swi-prolog doc, अधिक जानकारी के लिए गूगल।
समस्या यह है कि आपको पूरी फ़ाइल को पार्स करना होगा (या कम से कम मुझे इसे अन्यथा करने का कोई तरीका नहीं मिला है)। बीटीडब्ल्यू, लेक्सर डीसीजी के साथ भी किया जा सकता है लेकिन मुझे नहीं लगता कि यह वास्तव में बेहतर है।

आप मध्यवर्ती कोड के लिए चुनते हैं, तो एक सार वाक्य रचना पेड़ पार्सर से निर्माण करने के लिए आसान है (आप भी पार्स दौरान सामान का एक बहुत का मूल्यांकन कर सकते हैं)।
अर्थात् जांच के बारे में: एक खिलौना भाषा के लिए मेरे कंपाइलर में मैं पार्सिंग के दौरान अधिकतर अर्थपूर्ण चेक (स्कोप से संबंधित, फ़ंक्शन कॉल) और बाकी को एक अलग चरण में करता हूं। यह थोड़ा गंदा

अन्य उपयोगी सामग्री है: जांच पर जोर/1, वैश्विक चर, meta predicates (maplist/[2-6]).
शुद्ध नहीं prolog और आप अपने कोड भी उन्हें कोस (और फिर आप वास्तव में कुछ बुरा दुष्प्रभाव हो सकता था) द्वारा अनिवार्य कर सकता है

प्रतीक तालिका के लिए (यदि आप इसे की जरूरत है) तुम सिर्फ/1 विधेय जोड़ने के लिए जोर इस्तेमाल कर सकते हैं: SWI-prolog गतिशील विधेय के लिए गतिशील हैश तालिकाओं का उपयोग करता है। चेतावनी: गतिशील भविष्यवाणियां स्थैतिक से धीमी होती हैं, इसलिए जब आप तालिका को पूरा करते हैं और किसी भी बदलाव को नहीं कर रहे हैं तो उन्हें स्थिर बनाने के लिए compile_predicates/1 का उपयोग करें। उदाहरण के लिए, जब मैं अपना एसटी पार्सिंग खत्म करता हूं तो तैयार होता है इसलिए मैं इसे संकलित करता हूं। एसटी के लिए एक और समाधान association lists का उपयोग करना है। वे एवीएल पेड़ों के साथ लागू होते हैं इसलिए लागत ओ (लॉग (एन)) है।

5

मार्कस ट्रिस्का (here उसका मुखपृष्ठ) दिखाएं कि कई चीजें आपके लिए दिलचस्प हो सकती हैं: उदाहरण के लिए toy LISP, या कुछ कठोर meta interpreters पर।

+0

और इंटरनेट की प्रकृति के कारण यह उत्तर मृत, संग्रह संगठन लिंक है ... https://web.archive.org/web/20121221085328/http://web.student.tuwien.ac.at/~e0225855 – oPless

+2

@ ओपेलेस: धन्यवाद, मैंने लिंक समायोजित किए हैं – CapelliC

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