2009-04-08 18 views
6

मेरे पास एक ऐसा एप्लिकेशन है जहां मेरे पास पहले से ही एक प्रकार के व्याकरण के लिए एक पार्सर है और मुझे किसी अन्य उद्देश्य के लिए दूसरा अलग व्याकरण जोड़ने की आवश्यकता है।क्या एक ही आवेदन में दो या दो से अधिक लेक्स/वाईएसी पार्सर्स संभव है

क्या यह एक से अधिक होना संभव है?

और यदि ऐसा है तो आप एक और प्रवेश बिंदु कैसे प्राप्त करते हैं?

धन्यवाद

डेविड एलन चिड़िया

उत्तर

8

मैं बाइसन को --name-prefix विकल्प का उपयोग करके यह करने के लिए लगता है कि आप कर सकते हैं, और फ्लेक्स के लिए --prefix विकल्प।

दोनों मामलों में वे आपको अपनी पसंद के उपसर्ग के साथ उत्पन्न कार्यों पर उपयोग किए गए डिफ़ॉल्ट "yy" उपसर्ग को प्रतिस्थापित करने की अनुमति देते हैं।

+0

मैं लेक्स और वाईएसी का उपयोग कर रहा हूं लेकिन यह जानना अच्छा है कि क्या हम फ्रीवेयर संस्करणों में बदल जाते हैं। धन्यवाद डेव –

+0

आह, लेकिन आपने उन्हें अपने टैग में उल्लेख किया है ... – Alnitak

+0

सच। यदि वे इसे काम करने के लिए एकमात्र तरीका है तो फ्लेक्स और बाइसन का उपयोग करना है। हम उनका उपयोग करने के लिए बदल जाएगा। –

2

हां, यह संभव है।

yacc में एक-फ्लैग होना चाहिए, जहां आप डिफ़ॉल्ट "yy" के बजाय एक अलग उपसर्ग निर्दिष्ट कर सकते हैं।

लेक्स conatins द्वारा उत्पन्न फ़ाइल केवल एक प्रतीक बाहर इस्तेमाल किया: yylex। उदाहरण के लिए, आप -Dyylex = mySecondLex के साथ संकलित कर सकते हैं।

+0

मुझे इसे जांचना होगा, लेकिन यही वही है जो मुझे चाहिए। धन्यवाद डेव। –

+0

मुझे आशा है कि yacc के आपके संस्करण में यह ध्वज है। अन्यथा, आप बाइसन पर स्विच कर सकते हैं, यह वास्तव में अलग नहीं है। – Ingo

+0

उनके प्रतीकों जैसे yytext और इतने पर नहीं हैं (yywrap?) जिनका उपयोग बाहर भी किया जाता है? –

1

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

इस तरह, आप उसी एप्लिकेशन में विभिन्न व्याकरणों का उपयोग कर सकते हैं, और व्याकरण बदलना नया स्रोत कोड नहीं बनाता बल्कि बल्कि नई तालिका फाइलें (जिसे एम्बेडेड संसाधन या इसी तरह के रूप में शामिल किया जा सकता है) बनाते हैं।

+0

हम मो में सिस्टम को बदलने की स्थिति में नहीं हैं लेकिन भविष्य में देखने के लिए एक हो सकते हैं। धन्यवाद डेव। –

1

मानक लेक्स और yacc के पास ऐसा करने का कोई तरीका नहीं है। फ्लेक्स और बाइसन कुछ अन्य कार्यान्वयन के रूप में करते हैं। चूंकि आपने कहा (एक टिप्पणी में) कि आप फ्लेक्स और बाइसन का उपयोग नहीं कर रहे हैं, लेक्स और yacc के कौन से संस्करण हैं जिनका उपयोग आप कर रहे हैं?

+0

POSIX को '-p उपसर्ग' ('yy' के स्थान पर) के साथ प्रतीक उपसर्ग परिवर्तनों का समर्थन करने के लिए yacc की आवश्यकता है। दिलचस्प बात यह है कि इसे लेक्स के लिए जरूरी नहीं है; मुझे लगता है कि व्यावहारिक रूप से कई लोग व्याख्यात्मक विश्लेषक को कोड-कोड करते हैं और इसलिए यह इतना महत्वपूर्ण नहीं था। –