2011-01-24 13 views
10

क्या किसी को पता है कि व्यापक रूप से उपयोग किए जाने वाले पार्सिंग एल्गोरिदम का सबसे कमजोर परिवार क्या है जो सी कोड को पार्स कर सकता है? यही है, सी व्याकरण एलएल (1), एलआर (0), एलएएलआर (1), आदि है? मैं उत्सुक हूं क्योंकि एक साइड प्रोजेक्ट के रूप में मुझे इन परिवारों में से एक के लिए एक पार्सर जेनरेटर लिखने में दिलचस्पी है और अंततः दूसरी तरफ परियोजना के लिए सी कोड को पार्स करने में सक्षम होना चाहूंगा।सबसे सरल पार्सिंग एल्गोरिदम क्या है जो सी कोड को पार्स कर सकता है?

+0

अधिकांश पार्सर्स ऐसे तरीके से बनाए जाते हैं जो "बहुत अधिक" पहचानते हैं, और पार्सर के बाहर अतिरिक्त चेक द्वारा ओवरेज को खारिज कर दिया जाता है। यह मामला है, रेगेक्स "[।] *" सबसे कमजोर पार्सर है जो सी को पार्स करेगा, यद्यपि बहुत से अतिरिक्त अर्थपूर्ण चेक के साथ। एक बार यह स्पष्ट हो जाने के बाद, यह स्पष्ट होना चाहिए कि आप किसी भी पार्सर जेनरेटर प्रक्रिया सी, मॉड्यूल अतिरिक्त हैकिंग कर सकते हैं। (यह एक पार्सर लिखने के लिए पूरी तरह पागल लगता है जो इसकी शुरुआती जगह के रूप में बहुत कम स्वीकार करता है)। –

+0

मैं अभी इस सवाल पर फिर से चला गया। स्पष्ट व्यावहारिक उत्तर है, "हाथ से कोडित शीर्ष नीचे रिकर्सिव"। मैं अपने निचले डॉलर पर शर्त लगाता हूं कि पहला सी पार्सर कैसे बनाया गया था (YACC से बहुत पहले :) इस के शीर्ष पर दिलचस्प सवाल यह है कि मूल बातें से परे कितनी हैकनी होती है? –

उत्तर

2

ऐसा लगता है कि Bison uses an LALR(1) पार्सर। एलएएलआर पार्सर्स एलएल पार्सर्स की तुलना में अधिक मजबूत हैं, लेकिन यह भी अधिक जटिल हैं। इससे मुझे संदेह है कि एलएएलआर (1) शायद सबसे कमजोर पार्सिंग एल्गोरिदम है जो सी कोड को पार्स कर सकता है।

जब तक कि आप वास्तव में अपने स्वयं के पहचानकर्ता को रोल करने पर सेट नहीं होते हैं। ANTLR शायद ऐसा करने के लिए आपकी सबसे अच्छी शर्त होगी। एएनटीएलआर एक एलएल * एल्गोरिदम का उपयोग करता है (जो प्रभावी रूप से, एलएएलआर है)।

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