2010-01-05 16 views
5

उत्पन्न करते समय बहुत सरल एएनटीएलआर त्रुटि हैंडलिंग उदाहरण की तलाश करना मैं सी कोड उत्पन्न करना चाहता हूं। मैं इनपुट फ़ाइल से नहीं पढ़ूंगा, एक समय में एक पंक्ति (उदाहरण के लिए, एक कंपाइलर हो सकता है)। इसके बजाय, मैं एक समय में एक पंक्ति के रूप में उपयोगकर्ता इनपुट पार्सिंग कर रहा हूँ।सी कोड

मैं पता लगाने के लिए और lexer/पार्सर में बुरा इनपुट संभाल, जैसे

/* lexer tokens */ 
foo : "FOO"; 
bar : "BAR"; 
baz : "BAZ"; 
/* grammar*/ 
grammar : foo "=" BAZ 
     | foo "=" BAR 
     | <some non-existent Antrl-else> : {printf(stderr, "bad input\n");} 
     ; 

ठीक है, अगर मैं lexer/पार्सर में यह नहीं पकड़ सकते पसंद करेंगे, ऐसा लगता है जैसे मैं displayRecognitionError() उपयोग करने की आवश्यकता पर कैसे??

क्या कोई मुझे एक बहुत ही सरल उदाहरण पर इंगित कर सकता है जो सी कोड उत्पन्न करता है और अमान्य इनपुट के कुछ त्रुटि प्रबंधन को दिखाता है?

धन्यवाद!


ठीक है, उपहार, yippee!

लेकिन असली, कामकाजी उत्तर के साथ, वास्तविक, कामकाजी उत्तर के लिए। नहीं "wxample के बिना विधि X() का उपयोग करें।

+1

एफवाईआई: यह बकाया दिन समाप्त होने के बाद सबसे अधिक वोटों के साथ उत्तर पर जाएगा, भले ही आप कोई जवाब स्वीकार करते हैं या नहीं। –

+1

शायद यह धागा मदद की है: http://markmail.org/message/pumvrybnhvfme5h6#query:rulecatch%20antlr%20c+page:1+mid:3jjjdzbecknrq644+state:results (उस प्रश्न पर पोस्ट किए गए विभिन्न उत्तरों को नोट करें!) –

+1

मुझे लगता है कि आप अपने उदाहरण में printf का उपयोग कर रहे हैं। क्या आप सी या सी ++ का उपयोग कर रहे हैं? – chollida

उत्तर

5

जावा में एक मान्यता अपवाद हैंडलिंग इस तरह जाना होगा:

grammar X; 

// ... 

@rulecatch{ 
    catch(RecognitionException rex) { 
    // do something 
    } 
} 

// parser rules 

// lexer rules 

दूसरे शब्दों में, बस @rulecatch{ ... } ब्लॉक के अंदर कुछ कस्टम सी कोड जोड़ें।

+0

बार्ट, मुझे संदेह है कि यह सबसे अच्छा जवाब है जो मुझे मिलेगा। मैं इसे कुछ दिनों के लिए खोल दूंगा, अगर किसी ने कुछ शानदार सी डेमो कोड दिया है तो जूट्स, तो अगर आपको नहीं तो जवाब दें। आपकी मदद के लिए धन्यवाद – Mawg

+1

कोई समस्या नहीं है। अगर मुझे कुछ समय लगता है, तो मैं थोड़ा सी डेमो भी चाबुक कर सकता हूं, लेकिन मेरा सी कम से कम कहने के लिए जंगली है! –

+1

मैंने सी रनटाइम को तुरंत देखा है: 'कॉन्फ़िगर करें' और 'सी' के लिए रनटाइम को 'बनाना' और एक लेक्सर और पार्सर उत्पन्न करना ठीक है, लेकिन इन लेक्सर और पार्सर का उपयोग करने वाली मुख्य विधि के साथ एक छोटा सा एप्लीकेशन लिखना फाइलें नहीं थीं, और मुझे इस पर अधिक समय बिताना पसंद नहीं आया, क्षमा करें। मुझे उम्मीद है कि कोई और आपको इसके साथ हाथ देने में सक्षम होगा। लेकिन क्या आपने कोशिश की कि मैंने क्या सिफारिश की? यदि आपने कोशिश की लेकिन असफल रहा, तो यह उल्लेख करने में मदद कर सकता है कि वास्तव में क्या गलत हुआ। सौभाग्य। –

7

जो आप सबसे अधिक संभावना रखते हैं displayRecognitionError() फ़ंक्शन है। इस फ़ंक्शन को उन मामलों में बुलाया जाता है जिनमें आप रुचि रखते हैं, और सी रनटाइम का हिस्सा हैं।

यदि आप इस फ़ंक्शन का उपयोग करने का उदाहरण देखना चाहते हैं, तो this mailing list post देखें। यद्यपि यह कोड सी और सी ++ को मिश्रित करता है, लेकिन आपको इससे बाहर निकलने में सक्षम होना चाहिए।

+0

बहुत बहुत धन्यवाद, मैं इसे देख लूंगा। क्षमा करें कि मैंने पहले से ही एक जवाब स्वीकार कर लिया है; मैंने दूसरे की उम्मीद नहीं की थी। – Mawg

+1

कोई चिंता नहीं - उम्मीद है कि यह आपकी मदद करता है –