2012-07-29 13 views
5

क्या वाक्यविन्यास त्रुटि होने पर "अपेक्षित टोकन" सूची उत्पन्न करने का कोई ज्ञात तरीका है? मैं नींबू जनरेटर के रूप में नींबू का उपयोग कर रहा हूँ।नींबू पार्सर जनरेटर का उपयोग करके "अपेक्षित टोकन"

उत्तर

9

यह काम करने के लिए लगता है:

%syntax_error { 
     int n = sizeof(yyTokenName)/sizeof(yyTokenName[0]); 
     for (int i = 0; i < n; ++i) { 
       int a = yy_find_shift_action(yypParser, (YYCODETYPE)i); 
       if (a < YYNSTATE + YYNRULE) { 
         printf("possible token: %s\n", yyTokenName[i]); 
       } 
     } 
} 

यह सब संभव टोकन कोशिश करता है और उन है कि वर्तमान पार्सर राज्य में लागू होते हैं प्रिंट करता है।

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

+2

बिल्कुल मैं जो पूछ रहा था! हालांकि, आप yy_find_shift_action के पहले पैरामीटर के रूप में 'yypParser' भूल गए हैं :) –

1

नींबू में ऐसी सूची उत्पन्न करने के लिए कोई सीधी विधि नहीं है। लेकिन आप नींबू उपकरण के डीबग आउटपुट और जेनरेट पार्सर के डीबग ट्रेस का उपयोग करके ऐसा करने का प्रयास कर सकते हैं। ParseTrace फ़ंक्शन को कॉल करने के बाद शिफ्ट की पार्सर प्रिंट्स सूची उत्पन्न होती है और इसे कम करता है यह इनपुट स्ट्रीम पर लागू होता है। वाक्यविन्यास त्रुटि से पहले अंतिम शिफ्ट में त्रुटि से पहले वर्तमान स्थिति की संख्या होती है। अपने पार्सर के लिए * .out फ़ाइल में इस स्थिति को ढूंढें और इसके लिए अपेक्षित टोकन की सूची देखें।

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