5

सबसे पहले, एएसटी पार्सिंग और बिल्डिंग के बारे में क्या पढ़ा जाए?एएसटी पार्सर कैसे बनाया जाए जो वाक्यविन्यास त्रुटियों की अनुमति देता है?

किसी भाषा (जैसे SQL) के लिए पार्सर कैसे बनाएं जो एएसटी का निर्माण करे और सिंटैक्स त्रुटियों को अनुमति दे?

उदाहरण के लिए

, के लिए "3 + 4 * 5":

+ 
/\ 
3 * 
/\ 
    4 5 

और "3 + 4 * +" सिंटैक्स त्रुटि वाला, पार्सर लगता होगा उपयोगकर्ता का मतलब है कि के लिए:

+ 
/\ 
3 * 
/\ 
    4 + 
    /\ 
    ? ? 

कहां से शुरू करें?

एसक्यूएल:

SELECT_________________ 
/   \   \ 
    .   FROM  JOIN 
/\   |  / \ 
a city_name people address ON 
           | 
           =______________ 
          /    \ 
           .____    . 
          / \   /\ 
          p address_id  a id 
+1

एएसटी हमेशा अर्थपूर्ण त्रुटियों की अनुमति देते हैं, यह एक वाक्यविन्यास त्रुटि है। – harold

+0

प्रश्न में त्रुटि का निश्चित प्रकार। धन्यवाद) – Medvedev

+0

क्या आपकी भाषा में बयान को सीमित करने का कोई तरीका है? –

उत्तर

3

कैसे पारसर्स का निर्माण करने के प्रश्न के मानक जवाब (कि ASTs निर्माण), संकलन पर मानक ग्रंथों को पढ़ने के लिए है। अहो और उलमैन की "ड्रैगन" कंपाइलर पुस्तक बहुत क्लासिक है। यदि आपको सर्वोत्तम संदर्भ सामग्री प्राप्त करने के लिए धैर्य नहीं मिला है, तो आपको अधिक परेशानी होगी, क्योंकि वे सिद्धांत प्रदान करते हैं और सूक्ष्मता की जांच करते हैं। लेकिन here is my answer जल्दी में लोगों के लिए, रिकर्सिव वंश पार्सर्स का निर्माण।

कोई अंतर्निहित त्रुटि पुनर्प्राप्ति के साथ पार्सर्स बना सकता है। इस तरह की चीज पर कई कागजात हैं, 1 9 80 के दशक में एक गर्म विषय। "विद्वान त्रुटि सुधार" के लिए शिकार, Google विद्वान देखें। मूल विचार यह है कि पार्सर, एक पार्सिंग त्रुटि का सामना करने पर, कुछ प्रसिद्ध बीकन (";" एक कथन डेलीमीटर के लिए छोड़ देता है, सी-जैसी भाषाओं के लिए बहुत लोकप्रिय है, यही कारण है कि अगर आपकी भाषा में आपकी टिप्पणी है कथन टर्मिनेटर), या सिंटैक्स त्रुटि के बिंदु पर चढ़ने के लिए विभिन्न इनपुट स्ट्रीम हटाना या सम्मिलन का प्रस्ताव है। ऐसी योजनाओं की निचली विविधता आश्चर्यजनक है। मुख्य विचार आमतौर पर जितना संभव हो सके त्रुटि के बारे में अधिक जानकारी लेना है। मैंने कभी देखा है कि सबसे दिलचस्प विचारों में से एक दो पार्सर्स, एक दूसरे से आगे एन टोकन चल रहा है, सिंटैक्स-त्रुटि भूमि-खानों की तलाश में है, और दूसरे पार्सर को इससे पहले मुकाबले में उपलब्ध एन टोकन के आधार पर फ़ीड त्रुटि मरम्मत की जा रही है वाक्यविन्यास त्रुटि। इससे दूसरे पार्सर सिंटैक्स त्रुटि पर पहुंचने से पहले अलग-अलग कार्य करने की सुविधा देता है। यदि आपके पास यह नहीं है, तो अधिकांश पार्सर बाएं संदर्भ को फेंक देते हैं और इस प्रकार मरम्मत की क्षमता खो देते हैं। (मैं इस तरह के एक योजना लागू नहीं।)

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

चाहे आप जो भी करते हैं, सिंटैक्स त्रुटि की मरम्मत बहुत मदद नहीं करती है, क्योंकि अनुमान लगाने के लिए लगभग असंभव है कि वास्तव में विश्लेषण किए गए दस्तावेज़ के लेखक क्या हैं। इससे पता चलता है कि फैंसी योजनाएं वास्तव में सहायक नहीं होंगी। मैं सरल लोगों के साथ चिपक जाता हूँ; लोगों को एक त्रुटि रिपोर्ट और पार्सिंग की कुछ अर्ध-सुंदर निरंतरता प्राप्त करने में प्रसन्नता हो रही है।

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

एक पाठ जो एक पार्सर बनाने के लिए नरक नहीं है, वह यह है कि अगर वे कुछ भी पार्स परिणाम या पेड़ के साथ उपयोगी करना चाहते हैं, तो उन्हें बहुत अधिक बुनियादी मशीनरी की आवश्यकता होगी बस पार्सर। "जीवन के बाद जीवन" के लिए मेरे जैव की जांच करें।

1

दो चीजें पार्सर कर सकता है कर रहे हैं:

  1. रिपोर्ट त्रुटि और उपयोगकर्ता फिर से कोशिश की है।
  2. त्रुटि की मरम्मत करें और आगे बढ़ें।

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

मैंने छोटी भाषाओं के लिए कुछ हाथ से लुढ़काए रिकर्सिव वंश पार्सर्स लिखे हैं। ग्रामर नियमों को स्पष्ट रूप से समझने के लिए कोड लिखते समय (एक पार्सर जनरेटर का उपयोग करने के विपरीत), त्रुटियों का पता लगाना आसान है, क्योंकि अगला टोकन उत्पादन नियम में फिट नहीं होता है। जेनरेटेड पार्सर्स एक सरल "अपेक्षित $ (TOKEN_TYPE) यहां" संदेश को थूकते हैं, जो उपयोगकर्ता के लिए हमेशा उपयोगी नहीं होता है। एक हाथ से लिखे गए पार्सर के साथ, अधिक विशिष्ट डायग्नोस्टिक संदेश देना अक्सर आसान होता है, लेकिन यह हर मामले को कवर करने में समय ले सकता है।

यदि आपका लक्ष्य रिपोर्ट की समस्या है लेकिन पार्सिंग रखने के लिए (ताकि आप देख सकें कि अतिरिक्त समस्याएं हैं या नहीं), तो आप त्रुटि के बिंदु पर पेड़ में एक विशेष एएसटी नोड डाल सकते हैं। यह पेड़ को अलग होने से रोकता है।

आपको पार्सिंग जारी रखने के लिए त्रुटि से परे किसी बिंदु पर पुनर्वितरण करना होगा। जैसा कि ईरा बैक्सटर ने अपने उत्तर में उल्लेख किया था, आप एक टोकन की तलाश कर सकते हैं, जैसे ';', जो बयानों को अलग करता है। देखने के लिए सही टोकन आप जिस भाषा को पार्स कर रहे हैं उस पर निर्भर करता है। एक और संभावना यह अनुमान लगाने के लिए है कि उपयोगकर्ता का क्या अर्थ था (उदा।, उस त्रुटि पर एक अतिरिक्त टोकन या एक अलग टोकन का अनुमान लगाएं) और फिर जारी रखें। यदि आपको अगले कुछ टोकन में एक और वाक्यविन्यास त्रुटि आती है, तो आप बैकट्रैक कर सकते हैं, एक अलग अनुमान लगा सकते हैं, और पुनः प्रयास कर सकते हैं।

+0

बहुत बहुत धन्यवाद! =) – Medvedev

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