2011-06-09 13 views
28

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

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

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

उत्तर

19

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

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

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

+2

'स्रोत कोड।yacc' एक्सकोड द्वारा समर्थित फ़ाइल प्रकारों में से एक है। यदि आप एक्सकोड की Info.plist खोलते हैं, तो आपको Yacc (Bison) स्रोत फ़ाइलों के लिए मान्यता प्राप्त एक्सटेंशन की सूची दिखाई देगी; उनमें से एक है 'वाईएम'। –

+2

जानना अच्छा है, लेकिन यह काफी नहीं है जिसे मैं "दस्तावेज" कहता हूं। :-) –

+0

उह ठीक है, लेकिन अगर मैं सिर्फ फ्लेक्स का उपयोग करना चाहता हूं तो क्या होगा? क्या फ्लेक्स बॉक्स डब्ल्यू/एक्सकोड से समर्थित है? मैं एक नौसिखिया हूँ इसलिए मुझे आश्चर्य है ... – fooledbyprimes

16

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

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

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

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

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

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