मैंने कई पेपर, लेख और अनुभाग 4.1.4, कंपाइलर के अध्याय 4 : सिद्धांत, तकनीक और उपकरण (2 डी संस्करण) (उर्फ "द ड्रैगन बुक") पढ़ा है, जो सभी वाक्य रचना संकलक त्रुटि सुधार के विषय पर चर्चा करते हैं। हालांकि, कई आधुनिक संकलक के साथ प्रयोग करने के बाद, मैंने देखा है कि वे सिमेंटिक त्रुटियों के साथ-साथ सिंटैक्टिक त्रुटियों से भी उबर जाते हैं।
मैं काफी अच्छी तरह से एल्गोरिदम और तकनीकों को संकलक संबंधित त्रुटियों से उबरने के पीछे समझ रहा हूं, हालांकि मैं यह बिल्कुल नहीं समझता कि एक संकलक एक त्रुटि से कैसे पुनर्प्राप्त कर सकता है।
मैं वर्तमान में अपने सार सिंटैक्स ट्री से कोड उत्पन्न करने के लिए विज़िटर पैटर्न की थोड़ी भिन्नता का उपयोग कर रहा हूं। निम्नलिखित अभिव्यक्तियों को संकलित करने वाले मेरे संकलक पर विचार करें:
1 / (2 * (3 + "4"))
कंपाइलर निम्नलिखित सार सिंटैक्स ट्री उत्पन्न करेगा:
op(/)
|
-------
/ \
int(1) op(*)
|
-------
/ \
int(2) op(+)
|
-------
/ \
int(3) str(4)
कोड-जनरेशन चरण फिर विज़िटर पैटर्न का उपयोग करके सार सिंटैक्स ट्री की पुनरावृत्ति करेगा और प्रकार की जाँच करेगा। सार सिंटैक्स ट्री को तब तक ट्रेस किया जाएगा जब तक कि कंपाइलर अभिव्यक्ति के अंतरतम भाग में नहीं आ जाता; (3 + "4")
। संकलक तब प्रत्येक पक्ष की जाँच करता है और देखता है कि वे शब्दार्थ के समकक्ष नहीं हैं। कंपाइलर एक प्रकार की त्रुटि उठाता है। यहीं पर समस्या है। अब कंपाइलर को क्या करना चाहिए ?
कंपाइलर को इस त्रुटि से उबरने के लिए और भावों के बाहरी हिस्सों को टाइप करते रहना है, इसे अभिव्यक्ति के अगले भाग के लिए , अभिव्यक्ति के अंतरतम भाग के मूल्यांकन से कुछ प्रकार ( int
या str
) वापस करना होगा । लेकिन यह बस एक प्रकार से वापस नहीं आता है । चूंकि एक प्रकार की त्रुटि हुई, कोई प्रकार नहीं घटाया गया था।
एक संभावित समाधान जो मैंने पोस्ट किया है, वह यह है कि यदि एक प्रकार की त्रुटि होती है, तो एक त्रुटि उठाई जानी चाहिए, और एक विशेष मान जो यह दर्शाता है कि एक प्रकार की त्रुटि हुई है, को पिछले अमूर्त सिंटैक्स ट्री ट्रैवर्सल कॉल पर लौटाया जाना चाहिए। यदि पिछले ट्रैवर्सल कॉल इस मान का सामना करते हैं, तो वे जानते हैं कि अमूर्त सिंटैक्स ट्री में एक प्रकार की त्रुटि गहरी हुई, और एक प्रकार की कटौती करने की कोशिश से बचना चाहिए। जबकि यह विधि काम करने लगती है, यह बहुत ही अयोग्य लगती है। यदि एक अभिव्यक्ति का अंतरतम भाग अमूर्त वाक्य रचना के पेड़ में गहरा है, तो संकलक को केवल यह महसूस करने के लिए कई पुनरावर्ती कॉल करना होगा कि कोई वास्तविक काम नहीं किया जा सकता है, और बस हर एक से वापस आ सकते हैं।
क्या मैं ऊपर वर्णित विधि का उपयोग करता हूं (मुझे संदेह है)। यदि हां, तो क्या यह कुशल नहीं है? यदि नहीं, तो कंपाइल शब्द त्रुटियों से उबरने के लिए वास्तव में क्या तरीके इस्तेमाल किए जाते हैं?