2011-12-04 16 views
17

मुझे आश्चर्य है कि क्या सी # और जावा व्याकरण एलएएलआर (एक्स) हैं? यदि हां, एक्स का मूल्य क्या है?सी # और जावा ग्रामर एलएएलआर (एक्स) हैं?

संपादित करें:

सही जवाब स्वीकार करने के बाद, मुझे लगता है कि इस तरह से क्यू बदलने के लिए बेहतर है:

कोई LALR (एक्स) पार्सर कि जावा की वर्तमान विज्ञप्ति पार्स सकता है (संस्करण 7) या सी # (संस्करण 4)? यदि हां, एक्स का मूल्य क्या है?

+1

मुझे इस प्रश्न को बंद करने के लिए कई सुझाव मिलते हैं। मैं तर्क समझ नहीं पा रहा हूं; सवाल काफी स्पष्ट है। –

उत्तर

13

आप नहीं इस सवाल का पहली बार एक भाषा के लिए एक विशिष्ट व्याकरण तय किया बिना, जैसा कि कुछ व्याकरण हो सकता है पूछ सकते हैं, और कुछ नहीं हो सकता।

शायद आप जावा व्याकरण के रूप में हाल ही में जावा विशिष्टताओं में प्रकाशित मतलब है। क्या आप जावा 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 का इलाज कैसे करें; पार्सर करता है। लेकिन एलएएलआर (एक्स) होने का मौका पाने के लिए आपके नामित व्याकरण को इस तरह आकार देना होगा।

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

+0

आपके फलदायी उत्तर के लिए धन्यवाद ईरा। आपके एनम उदाहरण का जिक्र करते हुए, अब मुझे यकीन है कि जावा 7 और सी # 4 भाषाओं को एलएएलआर (एक्स) पार्सर्स द्वारा पार्स नहीं किया जा सकता है। – hsalimi

+1

@hsalimi: सही व्याख्या यह है कि आप उन्हें शुद्ध एलएएलआर (एक्स) पार्सर से पार्स नहीं कर सकते हैं। लोग अपने पास व्हाटवेवर पार्सिंग तकनीक ले कर काम कर रहे पार्सर्स बनाते हैं, एक व्याकरण का निर्माण करते हैं जो पार्सिंग तकनीक की सीमाओं का सम्मान करता है (मूल रूप से इसके बारे में कोई विकल्प नहीं है), और फिर इसे काम करने के लिए लेक्सर/पार्सर में कुछ हैकिंग कर रहा है। –

+0

धन्यवाद आपके उत्तर और टिप्पणियों के लिए ईरा। इसके अलावा मैं यह भी मानता हूं कि सत्य विवरण में है। :-) – hsalimi

13

जावा व्याकरण (संस्करण 1.0) LALR माना जाता है (1); this site एक व्याकरण प्रदान करता है और सूचना है कि

व्याकरण यंत्रवत् बीमा करने के लिए चेक किया गया है के साथ शुरू होता है कि यह LALR है (1)।

मैं यकीन नहीं है कि सी # LALR है नहीं कर रहा हूँ (1), लेकिन वहाँ एक C# parser written in bison उपलब्ध यहाँ जिससे पता चलता है कि यह शायद LALR (1) (यह सोचते हैं कि आप पूर्वता घोषणाओं के लिए अनुमति देते हैं) है।

क्या इसके लायक है के लिए, आम तौर पर LALR (1) केवल LALR इस्तेमाल किया पार्सर है। यदि आपको व्याकरण के लिए एलएएलआर (2) जैसे कुछ उपयोग करने की आवश्यकता है, तो आम तौर पर एक एलएएलआर (1) पार्सर का उपयोग स्पष्ट प्राथमिकता असंबद्धता, या एक जीएलआर पार्सर जैसे अधिक शक्तिशाली पार्सर के साथ करना बेहतर होता है।

आशा है कि इससे मदद मिलती है!

+2

धन्यवाद, लेकिन मुझे लगता है कि निर्दिष्ट दस्तावेज़ जावा के प्रारंभिक संस्करण से संबंधित है। क्या आप सुनिश्चित हैं कि नई जावा भाषा का नमूना (जेनेरिक, आदि सहित) अभी भी एलएएलआर (1) है? – hsalimi

+0

सी # स्पेक में सी # के लिए एक व्याकरण है। –

+1

"सी # spec"? आपका मतलब ईसीएमए स्पेक है? यह सी # 4.0 नहीं है, और एमएस ने वैसे भी उस spec को लागू नहीं किया है। –

संबंधित मुद्दे