आप नहीं इस सवाल का पहली बार एक भाषा के लिए एक विशिष्ट व्याकरण तय किया बिना, जैसा कि कुछ व्याकरण हो सकता है पूछ सकते हैं, और कुछ नहीं हो सकता।
शायद आप जावा व्याकरण के रूप में हाल ही में जावा विशिष्टताओं में प्रकाशित मतलब है। क्या आप जावा 7 के लिए मतलब है?
मुझे यकीन है कि आप विशेष रूप से सी # 4.0 के लिए, सी # के लिए एक विशिष्ट व्याकरण निर्दिष्ट कर सकते हैं Microsoft से कम से कम एक नहीं, नहीं हूँ, मुझे विश्वास नहीं है कि उन्होंने एक व्याकरण प्रकाशित किया है।
मैं आपको बता सकता मुझे नहीं लगता है कि क्योंकि यह जो पहचानकर्ता की तरह लग रहे कुछ तत्व है सी # LALR (x) हो सकता है, है, लेकिन कुछ संदर्भों में कीवर्ड हो सकता है। इसके लिए लेज़र को यह जानने की आवश्यकता है कि पार्सर यह तय करने की अपेक्षा कर रहा है कि पहचानकर्ता की तरह टोकन एक कीवर्ड है, या सिर्फ और पहचानकर्ता है। इस प्रकार पार्सर से लेक्सर तक फीडबैक होना चाहिए, या लेक्सर को टोकन दोनों का उत्पादन करना होगा और यह तय करने के लिए उन्हें पारसर को पास करना होगा। एलएएलआर पार्सर्स को बिना किसी फीडबैक के टोकन स्ट्रीम पर परिभाषित किया जाता है, और जहां प्रत्येक इनपुट टोकन में केवल एक व्याख्या होती है।
मुझे नहीं लगता कि जावा 1.5 या उससे ऊपर है, जब enum को अपने स्वयं के कीवर्ड के साथ एक विशेष प्रकार के रूप में पेश किया गया था। ऐसा इसलिए, क्योंकि जावा 1.5 compilers मौजूदा जावा 1.4 प्रोग्राम हैं जो एक चर नाम के रूप में enum, enum कुछ संदर्भों में एक कीवर्ड के रूप इलाज किया जाना चाहिए इस्तेमाल किया, और दूसरों में एक चर नाम के रूप में कार्रवाई करने के लिए के लिए। तो जावा 1.5 पार्सर में सी # के समान मुद्दे हैं।
एक व्यावहारिक मामले के रूप में, कोई वास्तविक लैंगुग एलएएलआर (1) नहीं है [पहला संस्करण जावा एक अपवाद हो सकता है] और कोई भी असली पार्सर (एएसपी एलएएलआर) बनाने वाला कोई भी इस तरह के आसपास होने के लिए हैक बनाना है।(जीसीसी ने एक एलएएलआर पार्सर के साथ एक लंबे समय तक एक भयानक प्रतीक तालिका हैक के साथ सी ++ का विश्लेषण किया, इसलिए यह एक पहचानकर्ता के बीच अंतर को एक चर के रूप में और एक टाइपिफ़ाफ उदाहरण के रूप में पहचानकर्ता के बीच अंतर बता सकता है। अब इसमें कुछ प्रकार का हाथ-लागू है रिकर्सिव वंश पार्सर, लेकिन मुझे लगता है कि भयानक हैक बनी हुई है)। तो मुझे यकीन नहीं है कि आपके प्रश्न का उत्तर देने का मूल्य।
हमारे C# 4.0 and Java 7 members of our family of language front ends दोनों जीएलआर पार्सर का उपयोग करते हुए भाषाओं को पार्स करते हैं, फीडबैक क्षमता के साथ विस्तारित होते हैं, और एक ही टोकन की दो व्याख्याओं को संसाधित करने की क्षमता। जीएलआर एलएएलआर (एक्स) मूत का सवाल बनाता है, और फीडबैक और कई व्याख्याएं हमें कई भाषाओं को संभालने देती हैं जो शुद्ध जीएलआर की क्षमता के बाहर भी होंगी।
संपादित करें: कुछ विचारों के बाद, दोनों व्याकरण अपने कीवर्ड-इन-संदर्भ को संभालने के लिए वास्तव में बदसूरत तरीका हो सकते हैं। चलिए एक उदाहरण के रूप में जावा के enum का उपयोग करें। वहाँ वास्तविक व्याकरण नियम हो गया है:
type = 'enum' '{' enum_members '}' ;
लेकिन हम भी एक पहचानकर्ता के रूप में 'enum' अनुमति देनी होगी। हम ऐसा कर सकते हैं, एक nonterminal साथ टर्मिनल टोकन पहचानकर्ता की जगह:
identifier = IDENTIFIER | 'enum' ;
और जोर देते हैं कि पहचानकर्ता lexer द्वारा उत्पादित टर्मिनल हैं। अब कम से कम लेक्सर को यह तय करना नहीं है कि enum का इलाज कैसे करें; पार्सर करता है। लेकिन एलएएलआर (एक्स) होने का मौका पाने के लिए आपके नामित व्याकरण को इस तरह आकार देना होगा।
हमारे पार्सर्स कुछ कीवर्ड को कभी-कभी पहचानकर्ताओं के रूप में उपयोग करने की अनुमति देने के लिए ऐसा करते थे। जैसा कि हमने पहले वर्णित किया है, हमने अपना पार्सिंग इंजन बदल दिया है, और ऐसा नहीं करते हैं।
मुझे इस प्रश्न को बंद करने के लिए कई सुझाव मिलते हैं। मैं तर्क समझ नहीं पा रहा हूं; सवाल काफी स्पष्ट है। –