objective c एक्सकोड में बाइसन/फ्लेक्स/वाईएसी को एकीकृत करना




objective-c xcode (3)

मुझे एक महान उदाहरण मिला: https://github.com/epatel/ParserTest । यह 3 साल पुराना है लेकिन एक्सकोड 6 और 7 में काम करता है।

क्या एक्सकोड में बाइसन / फ्लेक्स / वाईएसीसी को एकीकृत करने का कोई आसान तरीका है?

मैं अपनी खुद की भाषा को पार्स करने के लिए लिखना चाहता हूं, जो मेरी ओब्जेसी वस्तुओं के साथ बातचीत करता है।

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


एक्सकोड जानता है कि yacc और flex फ़ाइलों को कैसे संसाधित करना है, और स्वचालित रूप से जेनरेट की गई कोड फ़ाइलों को आपके प्रोजेक्ट में संकलित कर देगा। चाल यह पता लगा रही है कि कौन से एक्सटेंशन की अपेक्षा है। एक्सकोड 4 में, प्रोजेक्ट सेटिंग्स प्राप्त करने के लिए स्रोत सूची में शीर्ष-स्तरीय आइटम पर क्लिक करें। अगली सूची में अपने लक्ष्य पर क्लिक करें, फिर तालिका दृश्य शीर्षलेख में नियम बनाएं। "सिस्टम लेक्स नियम" और "सिस्टम Yacc नियम" पर नीचे स्क्रॉल करें, फिर उस नियम के लिए उपयोग किए जाने वाले एक्सटेंशन के साथ टूल टिप प्राप्त करने के लिए उनमें से प्रत्येक में "स्रोत फ़ाइलों" पर कर्सर को होवर करें। (... क्या? यह स्पष्ट नहीं था?)

लेक्स के लिए, यह है: * .l * .lm * .lmm * .lpp * .lp * .lxx

Yacc के लिए, यह है: * .y * .ym * .ymm * .ypp * .yp * .yxx

यदि आपके पास लेक्स / वाईएसीसी फाइलों में कोई ऑब्जेक्टिव-सी कोड है, तो आपको .m फ़ाइल उत्पन्न करने के लिए एक्सकोड को बताने के लिए।? M एक्सटेंशन का उपयोग करना होगा; इसी तरह,। एमएम उद्देश्य-सी ++ के लिए। (मुझे अनुमान है।? पीपी,।? पी, और।? Xx सभी सी ++ हैं।) जो मैंने देखा है, यह सिर्फ काम करता है, मेकफ़ाइल की आवश्यकता नहीं है। यदि आप .flex एक्सटेंशन रखना चाहते हैं, तो आप लेक्स नियम में "लक्ष्य पर कॉपी करें" बटन पर क्लिक कर सकते हैं और उस एक्सटेंशन के लिए एक नया नियम बना सकते हैं।

अब "मजेदार" हिस्सा आपके कोड में yacc को एकीकृत करने का प्रयास कर रहा है। डिफ़ॉल्ट रूप से, yyparse () फ़ंक्शन जो पूरी चीज बनाता है, एसटीडीआईएन से इनपुट की अपेक्षा करता है जब तक कि आप इसे अन्यथा काम करने के लिए हुप्स के गुच्छा से कूद न जाएं। यदि आप yacc का उपयोग करने पर मृत-सेट हैं, तो वेब पर बहुत सारी जानकारी है कि इसे अपने सनकी पर कैसे मोड़ना है। लेकिन यदि आप lemon जैसे आधुनिक पार्सर जनरेटर का उपयोग करते हैं तो आप अपने माथे पर कम कीबोर्ड डेंट्स के साथ हवादार हो सकते हैं। सिंटैक्स yaccs पर आधारित है, और यह एलएएलआर (1) है (जो भी इसका मतलब है) तो बदलाव के बारे में जो कुछ भी आप जानते हैं / संघर्ष को कम करते हैं, अभी भी है। मुझे yacc / flex से काम करना बहुत आसान लगता है।

संपादित करें: मुझे याद है कि एक्सकोड ने बिल्ड चरण को स्वचालित रूप से .l फ़ाइल नहीं जोड़ा है, लेकिन उसने .y फ़ाइल को जोड़ा है। एक्सकोड स्रोत सूची में शीर्ष-स्तरीय आइटम पर क्लिक करके अपने निर्माण चरणों की जांच करें, आप लक्ष्य पर क्लिक करें, बिल्ड चरण तालिका शीर्षलेख पर क्लिक करें, फिर संकलन स्रोत पंक्ति का विस्तार करें। यदि आपकी .l फ़ाइल वहां नहीं है, तो उसे स्रोत सूची से खींचें।


संक्षेप में, अपनी व्याकरण फ़ाइलों को .y के बजाय एक .ym एक्सटेंशन दें। एक्सकोड ऑब्जेक्टिव-सी का समर्थन करने के लिए आवश्यक जादू के साथ बाइसन चलाएगा।

विचित्र रूप से पर्याप्त, मुझे यह सवाल मिला क्योंकि मैं वही काम करना चाहता था। मुझे ऐप्पल की कोको-डे मेलिंग सूची पर इसके बारे में एक चर्चा याद आई, लेकिन यह प्रश्न मेरी Google खोज में अधिक आया। हालांकि, मुझे कोकोबाइल्डर पर याद की गई चर्चा मिली - अंत में एक बहुत व्यापक उदाहरण है। मुझे उम्मीद है कि यह हम दोनों की मदद करता है, एलओएल!

(संपादित करें) मेरे बारे में बिल्ली से बाहर निकलता है कि जिसने कभी भी इसे खोजने में कामयाब रहे, वैसे भी - मुझे अभी भी इसके बारे में कोई आधिकारिक दस्तावेज नहीं मिला है।





bison