मैं यह समझने की कोशिश कर रहा हूं कि कोई grako द्वारा उत्पन्न पार्सर द्वारा पार्स किए गए दस्तावेज़ को फिर से कैसे बना सकता है।ग्रैको "कोड" पीढ़ी
ग्रैको स्रोत कोड में गहरी दफन करने के बाद, मेरा मानना है कि मुझे अंततः समझ में आया है कि एएसटी से जेनरेट किए गए दस्तावेज़ में कोई कैसे लौटाता है। क्या कोई कृपया जांच सकता है कि मेरी निम्नलिखित समझ सही है, और अगर मुझे अधिक सीधी आगे की विधि है तो मुझे बताएं?
- कोई एक पीईजी व्याकरण बनाता है जो पार्स करना चाहता है। ग्रैको एक पार्सर क्लास और इसके आधार पर एक सेमेटिक्स क्लास बनाता है।
- एक व्यक्ति के व्याकरण में प्रत्येक नियम के लिए एक अलग वर्ग (
grako.model.Node
का उप-वर्ग) युक्त एक पाइथन मॉड्यूल (हाथ से) बनाता है (हाथ से)। प्रत्येक वर्ग में कम से कम नियत नियम में प्रत्येक नामित तत्व के लिए पैरामीटर के साथ एक कन्स्ट्रक्टर होना चाहिए और इसके मूल्यों को कक्षा संपत्ति में संग्रहीत करना चाहिए। - एक (हाथ से) उत्पन्न अर्थ विज्ञान वर्ग उपवर्गों इसी वर्ग एक 2.
- एक के लिए टेम्पलेट परिभाषित करने
grako.codegen.ModelRenderer
का एक उपवर्ग (हाथ से) बनाता है एक अजगर मॉड्यूल चरण में बनाए गए द्वारा प्रत्येक नियम के लिए ast को बदलने के लिए किसी के व्याकरण में प्रत्येक नियम (अधिक या कम) के लिए "कोड" पीढ़ी। - एक उत्पादन को बनाने के लिए
grako.codegen.CodeGenerator().render(...)
पर टेम्पलेट युक्त नोड सबक्लास और पायथन मॉड्यूल युक्त एएसटी को खिलाता है।
क्या यह सही हो सकता है? यह बिल्कुल सहज नहीं लगता है।
- एक कदम 2 & 3 की महत्वपूर्ण प्रयास जानकारी है कि पहले से ही एएसटी में निहित है की दुकान से ज्यादा कुछ नहीं करने के लिए के माध्यम से क्यों जाना चाहते हैं?
- एएसटी से सीधे काम करने के बजाय इस दृष्टिकोण का क्या फायदा है?
- क्या चरण 2 & 3 स्वचालित करने या सहेजने का कोई तरीका है यदि कोई केवल मूल व्याकरण में दस्तावेज़ बनाना चाहता है?
- एक पीईजी व्याकरण परिभाषा को देखते हुए, क्या यह स्वचालित रूप से "कोड जनरेटर जनरेटर" बनाने के लिए सैद्धांतिक रूप से संभव है जैसे कोई "पार्सर जनरेटर" बनाता है?