2012-02-24 12 views
5

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

मैं एसआईसीपी पढ़ रहा हूं, और यह योजना के भीतर से काफी सरल है, लेकिन मैं ओओ फैशन में सी ++ में दुभाषिया और कंपाइलर को कार्यान्वित करना चाहता हूं।

कृपया ध्यान रखें कि मैं केवल सीखने के उद्देश्यों के लिए ऐसा कर रहा हूं, इसलिए मैं वास्तव में ऐसा करने का सबसे आसान या तेज़ तरीका नहीं ढूंढ रहा हूं, बल्कि इसे करने का सही और पुन: प्रयोज्य तरीका ढूंढ रहा हूं।

मैं कुछ योजना कार्यान्वयन है कि लोगों को पार्स एस भाव और आसानी से उत्पादन विपक्ष कोशिकाओं, कुछ इस तरह में देखा है:

struct Sexpr 
    { 
    }; 

    struct Cons : public Sexpr 
    { 
    Sexpr* left; 
    Sexpr* right; 
    }; 

    struct IntAtom : Sexpr 
    { 
    int value; 
    }; 

और एक साथ योजना Atom, या कुछ और के प्रत्येक प्रकार के लिए Sexpr के उपवर्ग उन पंक्तियों।

मुझे यकीन नहीं है, लेकिन यह मेरे लिए एक हैक जैसा लगता है ... क्या यह काम पाठक के बजाय दुभाषिया द्वारा नहीं किया जाना चाहिए?

मैं क्या जानना चाहता हूं कि यह एस-एक्सप्रेशन पढ़ने का सबसे अच्छा (या सही) तरीका माना जाता है, या यह पार्सर की तुलना में दुभाषिया का काम है? क्या पार्सर को विपक्षी कोशिकाओं पर भरोसा करने के बजाय अपना स्वयं का एएसटी होना चाहिए?

+0

यदि मैं यह सही पढ़ रहा हूं, तो प्रश्न को पार्सिंग के साथ बहुत कुछ नहीं करना है। इसके बजाय, मुझे लगता है कि आप पूछ रहे हैं: एस-अभिव्यक्ति डेटा प्रकार के लिए सबसे उचित प्रतिनिधित्व क्या है। क्या आप सहमत हैं? – dyoo

+0

@dyoo हां और नहीं। हां, आप सही हैं, मैं एस-एक्सप्रेशन के लिए सबसे उपयुक्त प्रतिनिधित्व की तलाश में हूं। और नहीं, आप गलत हैं, इस सवाल को स्पष्ट रूप से पार्सिंग के साथ करना है। अगर मैं केवल सेक्सप्र के लिए सबसे उपयुक्त प्रतिनिधित्व की तलाश में था, तो इसमें कोई संदेह नहीं होगा कि यह विपक्षी कोशिकाएं होगी। हालांकि, मैं विशेष रूप से ** पार्सिंग के लिए sexpr का सबसे उचित प्रतिनिधित्व ढूंढ रहा हूं। – ivanmp

+0

ठंडा। अच्छी स्पष्टीकरण। फिर: एक चीज जो पार्सिंग कार्य को अलग कर सकती है वह स्रोत स्थान जानकारी की आवश्यकता है। सादा विपक्ष कोशिकाओं को याद नहीं है कि वे मूल स्रोत से कहां से आए थे। पार्सिंग के दौरान, आप त्रुटि संदेशों का समर्थन करना चाह सकते हैं जो स्रोत को इंगित कर सकते हैं। पार्सिंग के लिए हमें और क्या चीजें चाहिए? – dyoo

उत्तर

3

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

यह अतिरिक्त जानकारी पॉइंटर्स से स्रोत, और स्वच्छ मैक्रोज़ के साथ त्रुटि संदेशों जैसी चीजों को सक्षम करती है।

कृपया ध्यान दें कि मेरा मतलब है कि "अधिक मूल्यों" अर्थ में "समृद्ध" है, न कि किसी भी गैर-मूल्य-तटस्थ तरीके से।

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

3

आप अपने वाक्य रचना में कुछ हद तक पूरा होना चाहते हैं, तो आप

sexpr ::= atom | sexpr sexpr 
atom ::= nil | intatom | etc. 

का समर्थन करने की आवश्यकता होगी लेकिन वह अधिक सामान्य की तुलना में सबसे sexpr आपके सामने आ जाएगा। एस-एक्सप्रप्र का सबसे आसान और सबसे आम रूप जो एलआईएसपी/योजना में है (बी बी डी) जहां ए, बी, सी, डी परमाणु या सूचियां हैं। जोड़ी के रूप में यह [ए [बी [सी [डी नील]]]] है, जिसका अर्थ है कि आपके conses के सभी दाएं किनारे सूचियां हैं।

तो अगर आप सफाई के लिए जा रहे हैं, तो आप सिर्फ

class sexpr {}; 
class atom : sexpr {}; 
class s_list : forward_list<smart_ptr<sexpr>> {}; 
+0

क्या आप अपना उत्तर प्रारूपित कर सकते हैं? – ivanmp

+0

कोशिश कर रहा है, क्षमा करें :-) –

+0

कोई समस्या नहीं! यह मेरे मन में जो कुछ था, उसके साथ कुछ है, लेकिन मेरे पास दो प्रश्न हैं: 1) क्या इसका मतलब यह है कि मुझे इस बिंदु (पार्सर) पर 'विपक्षी कोशिकाओं' के बारे में चिंता नहीं करना चाहिए और इसे दुभाषिया को एक समस्या के रूप में छोड़ देना चाहिए, और इस तरह के एएसटी का उपयोग करें जैसा आपने दिखाया है? 2) मुझे कुछ गलत हो सकता है, लेकिन Sexpr से s_list उत्तराधिकारी नहीं होना चाहिए? – ivanmp

3

जबकि एक शायद आगे और पीछे का तर्क कर सकते हैं भर में क्या "सही" दृष्टिकोण है, मेरी राय, दृष्टिकोण आप में सुझाव है-का उपयोग कर कर सकता पढ़ने, संकलन, मूल्यांकन, और प्रसंस्करण के लिए समान डेटा संरचनाएं-वह है जो आपको लिस्प और "कोड डेटा" मंत्र के बारे में सबसे ज्यादा सिखाएगी, और विशेष रूप से, quote ऑपरेटर का वास्तव में क्या अर्थ है (जो काफी गहरी बात है)।

यह भी आकस्मिक रूप से, अधिकांश लिस्पस (दिलचस्प रूप से, योजना सहित नहीं) पारंपरिक रूप से काम करता है।

तो हाँ, पाठक लिस्प डेटा उत्पन्न करता है: conses, symbols, Lisp संख्या, तार, et cetera, उपयोगकर्ता स्तर के लिस्प कोड के साथ ठीक वही सामान होगा। यह शेष कार्यान्वयन को सरल और अधिक निर्देशक दोनों बना देगा। रैकेट में (

रैकेट (और कुछ अन्य योजना कार्यान्वयन) वाक्यविन्यास वस्तुओं के लिए एक अमीर प्रतिनिधित्व का उपयोग करें, ताकि वे उन्हें संलग्न गुण का संकेत हो सकता है:

+0

आपके उत्तर के लिए धन्यवाद! मेरा प्राथमिक लक्ष्य सामान्य रूप से कंपाइलर्स और दुभाषियों के बारे में सबसे ज्यादा सीखना है, जरूरी नहीं कि लिस्प्स, यही कारण है कि मैं इसके लिए सबसे सही दृष्टिकोण के बारे में सोच रहा हूं।मैंने योजना चुना क्योंकि मैंने सोचा था कि यह शुरू करने के लिए एक साधारण भाषा थी (कम से कम कुछ सबसेट), मैंने इसके साथ काम किया है, लेकिन आखिरी लेकिन कम से कम नहीं, मुझे यह भी पसंद है। :) आपकी आखिरी पंक्ति से आपका क्या मतलब है? – ivanmp

+0

@ivanmp मेरा मतलब था कि यदि आप लिस्प के बारे में जानने की कोशिश कर रहे हैं, तो यह इस तरह से करने के लिए अधिक * निर्देशक * है। हां, * निर्देशक * वह शब्द है जिसे मैं ढूंढ रहा था। :) कार्यान्वयन भी आसान होगा क्योंकि आपको विभिन्न चरणों के लिए अलग-अलग डेटा संरचनाओं से निपटने की ज़रूरत नहीं है, और कुछ डेटा को चरणों को "किसी भी अन्य रूप में परिवर्तित किए बिना" सौंप दिया जा सकता है (जैसा कि मामले में 'quote')। दूसरी ओर, यदि आप आम तौर पर संकलन के बारे में जानने की कोशिश कर रहे हैं, विशेष रूप से लिस्प नहीं, तो शायद कोई भी तरीका ठीक है। –

+1

मेरा मतलब यह लाइन था: _ यह भी आकस्मिक रूप से, अधिकांश लिस्पस (** दिलचस्प रूप से, योजना सहित नहीं **) पारंपरिक रूप से काम करता है ._ – ivanmp

1

आप इसे कैसे किया गया है इसके उदाहरण के लिए this c/c++ s-expr parser library पर एक नज़र डालना चाहेंगे।

यह आधार प्रतिनिधित्व की तरह लग रहा है:

struct elt { 
    int type; 
    char *val; 
    struct elt *list; 
    struct elt *next; 
}; 

और मैं उनके डॉक्स से बोली:

के बाद से एक तत्व या तो सूची या परमाणु हो सकता है, तत्व संरचना एक प्रकार सूचक है यह या तो सूची या VALUE हो सकता है। यदि प्रकार सूचक LIST है, तो संरचना सदस्य "सूची" इस तत्व द्वारा प्रतिनिधित्व सूची के शीर्ष पर एक सूचक होगा। यदि प्रकार सूचक VALUE है, तो संरचना सदस्य "वैल" में स्ट्रिंग के रूप में तत्व द्वारा प्रतिनिधित्व परमाणु होगा। दोनों मामलों में, "अगला" सूचक वर्तमान एस-अभिव्यक्ति के अगले तत्व पर इंगित करेगा।

अतिरिक्त here एस-एक्सप्रप्रड पाठकों के अन्य कार्यान्वयन की पूरी सूची है जो कि बहुत से भाषाओं में रुचि हो सकती है।

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