मुझे लगता है कि करने के लिए सी ++ था "अजीब" <
और >
, के साथ सभी अस्पष्टता के साथ एक प्रयोग किया जाता है, लेकिन एक पार्सर को लागू करने की कोशिश कर के बाद मुझे लगता है मैं एक उदाहरण जो सिर्फ के बारे में हर भाषा <
और >
का उपयोग करता है टूट जाता है पाया लगता है सामान्य प्रकार के लिए:जावा, सी ++, सी # इत्यादि < and > के साथ इस विशेष वाक्य रचनात्मक अस्पष्टता के आसपास कैसे मिलता है?
f(g<h, i>(j));
इस वाक्य रचना या तो एक सामान्य विधि कॉल (g
) के रूप में व्याख्या की जा सकती है, या यह f
दो तुलना की परिणाम देने के रूप में व्याख्या की जा सकती।
ऐसी भाषाओं (विशेष रूप से जावा, which I thought was supposed to be LALR(1)-parsable?) इस वाक्य रचनात्मक अस्पष्टता के आसपास कैसे मिलता है?
मैं इस से निपटने के किसी भी गैर-हैकी/संदर्भ मुक्त तरीके की कल्पना नहीं कर सकता, और मैं इस बात से परेशान हूं कि ऐसी कोई भी भाषा संदर्भ-मुक्त कैसे हो सकती है, अकेले एलएएलआर (1) - योग्य .. ।
(यह ध्यान देने योग्य है कि एक GLR पार्सर कोई संदर्भ के साथ इस बयान के लिए एक एकल पार्स वापस नहीं लौट सकते लायक !! है)
+1 बड़ा सवाल है, बस एक ध्यान दें, जावा कंपाइलर में अस्पष्टता को हल करने के लिए बहुत सारे ह्यूरिस्टिक्स हैं, यह काफी अनुमान लगाता है। वे स्वयं स्वीकार करते हैं कि उनकी जेनेरिक प्रणाली टूट गई है और ऐसे मामले हैं जो विफल हो जाते हैं (हालांकि वे दर हैं), जावा 8 फीचर्स प्रस्तुति को देखते हुए वे कुछ समस्याओं की व्याख्या करते हैं और वे उन्हें जावा 8 में कैसे संबोधित करेंगे। –
@ बेंजामिनग्रेनबाम: धन्यवाद। :) हेरिस्टिक के बारे में - वे अच्छे कंपाइलर त्रुटि संदेशों को उत्पन्न करने के लिए निश्चित रूप से महान हैं, लेकिन जब तक कि वे भाषा के व्याकरण के व्याकरण का हिस्सा न हों, उन्हें कानूनी रूप से अस्पष्टताओं को हल करने के लिए उपयोग नहीं किया जा सकता है, क्या वे कर सकते हैं? और यदि वे व्याकरण का हिस्सा हैं, तो व्याकरण संदर्भ-मुक्त कैसे हो सकता है (अकेले एलआर (1) - पारदर्शी) दें? – Mehrdad
यह अचूक नहीं है, यह इस बात पर निर्भर करता है कि जी को – NimChimpsky