मैं लेक्स और वाईएसीसी (वास्तव में फ्लेक्स और बायसन) के साथ एक कंपाइलर बना रहा हूं। भाषा किसी भी प्रतीक (जैसे सी #) के असीमित आगे संदर्भों की अनुमति देता है। समस्या यह है कि पहचानकर्ता क्या है यह जानने के बिना भाषा को पार्स करना असंभव है।मैं एक कंपाइलर में आगे संदर्भ कैसे कार्यान्वित कर सकता हूं?
एकमात्र समाधान जो मुझे पता है, वह पूरे स्रोत को लेक्स करना है, और फिर "चौड़ाई-पहले" पार्स करना है, इसलिए वर्ग घोषणाओं और कार्य घोषणाओं जैसे उच्च स्तर की चीजें उन्हें उपयोग करने वाले कार्यों से पहले पार्स हो जाती हैं। हालांकि, इसमें बड़ी फ़ाइलों के लिए बड़ी मात्रा में स्मृति होगी, और वाईएसीसी के साथ संभालना मुश्किल होगा (मुझे प्रत्येक प्रकार की घोषणा/निकाय के लिए अलग व्याकरण बनाना होगा)। मुझे लेक्सर को भी लिखना होगा (जो कि किसी भी समस्या का नहीं है)।
मुझे दक्षता के बारे में पूरी तरह से परवाह नहीं है (हालांकि यह अभी भी महत्वपूर्ण है), क्योंकि मैं इसे खत्म करने के बाद संकलक को फिर से लिखने जा रहा हूं, लेकिन मैं चाहता हूं कि वह संस्करण तेज़ हो (इसलिए यदि वहां क्या कोई तेज सामान्य तकनीक है जो लेक्स/वाईएसीसी में नहीं की जा सकती है लेकिन हाथ से किया जा सकता है, कृपया उन्हें भी सुझाव दें)। तो अभी, विकास की आसानी सबसे महत्वपूर्ण कारक है।
क्या इस समस्या के लिए कोई अच्छा समाधान है? यह आमतौर पर सी # या जावा जैसी भाषाओं के लिए कंपाइलर्स में कैसे किया जाता है?
यह खोजशब्दों के साथ कोई संबंध नहीं है से बाहर बनाने के लिए सक्षम होना चाहिए के रूप में। यह इस तरह है: एबीसी (पैकेज एबी) है। (कक्षा सी), (पैकेज ए)। (कक्षा बी)। (फ़ील्ड बी), या (फील ए)। (फील्ड बी)। (फील्ड सी), आदि। – Zifre
फिर मेरे उत्तर का दूसरा अनुच्छेद लागू होता है। आपको पार्स करने के लिए यह जानने की ज़रूरत नहीं है। इलाज '।' आपके व्याकरण में एक ऑपरेटर के रूप में। आपके एएसटी पास में आप उन्हें प्रतीक तालिका के खिलाफ जांच सकते हैं। – U62
ठीक है, मुझे लगता है कि मुझे केवल एएसटी की बजाय एक पार्स पेड़ बनाना होगा। जैसा कि आपने कहा था कि वे अलग हैं। यदि कोई और बेहतर उत्तर के साथ आता है तो मैं इसे स्वीकार करूंगा, लेकिन मैं वास्तव में ऐसा नहीं करता ... – Zifre