2013-01-19 32 views
27

मुझे लगता है कि करने के लिए सी ++ था "अजीब" < और >, के साथ सभी अस्पष्टता के साथ एक प्रयोग किया जाता है, लेकिन एक पार्सर को लागू करने की कोशिश कर के बाद मुझे लगता है मैं एक उदाहरण जो सिर्फ के बारे में हर भाषा < और > का उपयोग करता है टूट जाता है पाया लगता है सामान्य प्रकार के लिए:जावा, सी ++, सी # इत्यादि < and > के साथ इस विशेष वाक्य रचनात्मक अस्पष्टता के आसपास कैसे मिलता है?

f(g<h, i>(j)); 

इस वाक्य रचना या तो एक सामान्य विधि कॉल (g) के रूप में व्याख्या की जा सकती है, या यह f दो तुलना की परिणाम देने के रूप में व्याख्या की जा सकती।

ऐसी भाषाओं (विशेष रूप से जावा, which I thought was supposed to be LALR(1)-parsable?) इस वाक्य रचनात्मक अस्पष्टता के आसपास कैसे मिलता है?

मैं इस से निपटने के किसी भी गैर-हैकी/संदर्भ मुक्त तरीके की कल्पना नहीं कर सकता, और मैं इस बात से परेशान हूं कि ऐसी कोई भी भाषा संदर्भ-मुक्त कैसे हो सकती है, अकेले एलएएलआर (1) - योग्य .. ।

(यह ध्यान देने योग्य है कि एक GLR पार्सर कोई संदर्भ के साथ इस बयान के लिए एक एकल पार्स वापस नहीं लौट सकते लायक !! है)

+2

+1 बड़ा सवाल है, बस एक ध्यान दें, जावा कंपाइलर में अस्पष्टता को हल करने के लिए बहुत सारे ह्यूरिस्टिक्स हैं, यह काफी अनुमान लगाता है। वे स्वयं स्वीकार करते हैं कि उनकी जेनेरिक प्रणाली टूट गई है और ऐसे मामले हैं जो विफल हो जाते हैं (हालांकि वे दर हैं), जावा 8 फीचर्स प्रस्तुति को देखते हुए वे कुछ समस्याओं की व्याख्या करते हैं और वे उन्हें जावा 8 में कैसे संबोधित करेंगे। –

+0

@ बेंजामिनग्रेनबाम: धन्यवाद। :) हेरिस्टिक के बारे में - वे अच्छे कंपाइलर त्रुटि संदेशों को उत्पन्न करने के लिए निश्चित रूप से महान हैं, लेकिन जब तक कि वे भाषा के व्याकरण के व्याकरण का हिस्सा न हों, उन्हें कानूनी रूप से अस्पष्टताओं को हल करने के लिए उपयोग नहीं किया जा सकता है, क्या वे कर सकते हैं? और यदि वे व्याकरण का हिस्सा हैं, तो व्याकरण संदर्भ-मुक्त कैसे हो सकता है (अकेले एलआर (1) - पारदर्शी) दें? – Mehrdad

+2

यह अचूक नहीं है, यह इस बात पर निर्भर करता है कि जी को – NimChimpsky

उत्तर

3

जावा में एक सामान्य विधि कॉल होगा < ज, मैं > जी (जे) तो वहाँ कोई अस्पष्टता नहीं :)

+0

वाह, आप सही हैं ... मैंने सोचा कि यह 'जी (जे)' होगा लेकिन [जाहिर है यह नहीं है] (http://ideone.com/bYyaaj)! +1 महान उत्तर, धन्यवाद :) – Mehrdad

+0

यह भी मेरी प्रतिक्रिया थी। मुझे लगता है कि यह पार्सर्स के लिए आसान बनाता है, और मुझे यह मानना ​​है कि यह वास्तव में बदसूरत हैक है। लैंगौज डिजाइनरों को डिजाइन करने पर शिकायत करने वाले कंपाइलर लोगों को नहीं सुनना चाहिए; आपको इस तरह की चीजें मिलती हैं। –

2

मैं सिर्फ कल्पना नहीं कर सकते किसी भी गैर hacky/विषय से मुक्त इस से निपटने का तरीका, और मैं इस बात से परेशान हूं कि इस तरह की कोई भी भाषा संदर्भ-मुक्त कैसे हो सकती है, अकेले एलएएलआर (1) - पारदर्शी ...

उत्तर यह है कि वे नहीं हैं (कम से कम जावा और सी ++ नहीं; मैं सी # के बारे में बहुत कम जानता हूँ)। जावा व्याकरण जिसे आप 1 99 6 से लिंक करते हैं, जेनेरिक पेश किए जाने से पहले।

आगे की चर्चा के लिए, देखें Are C# and Java Grammars LALR(x)?

+0

यहां तक ​​कि सी पूरी तरह से संदर्भ मुक्त नहीं है क्योंकि प्रतीक के उपयोग से एक अलग-अलग कोड के उपयोग से अलग किए जा सकने वाले घोषणाओं के आधार पर प्रतीक का उपयोग पहचानकर्ता या प्रकार का नाम हो सकता है। – ebohlman