9

मैं टेरेंस पार, जहां वे कहते हैं द्वारा निश्चित ANTLR संदर्भ पढ़ रहा हूँ:पार्सिंग संदर्भ संवेदनशील भाषा

सिमेंटिक विधेय संदर्भ के प्रति संवेदनशील भाषा संरचनाओं को पहचानने का एक शक्तिशाली साधन हैं ड्राइव करने के लिए रनटाइम जानकारी की अनुमति देकर मान्यता

लेकिन पुस्तक में उदाहरण बहुत सरल हैं। क्या मैं पता करने की जरूरत है: context-sensitive नियम की तरह पार्स antlr कर सकते हैं:

Xay -> XBY

ANTLR इन नियमों पार्स नहीं कर सकता है, वहाँ एक और उपकरण है कि संदर्भ के प्रति संवेदनशील व्याकरण से संबंधित है है ?

+0

ठीक है, इस नियम का अर्थ है कि हमें उस संदर्भ को सहेजने की आवश्यकता है जहां संदर्भ मुक्त व्याकरण ए -> बीसी की तरह दिखता है, अधिक जानकारी के लिए: http://en.wikipedia.org/wiki/Chomsky_hierarchy – Radi

+0

@ बार्ट: " एक्स और वाई के संदर्भ में, ए को बी द्वारा प्रतिस्थापित किया जा सकता है "। –

+0

@Ira, स्पष्टीकरण के लिए धन्यवाद! –

उत्तर

8

एएनटीएलआर केवल व्याकरण पार्स करता है जो एलएल (*) हैं। यह आपके द्वारा प्रदान किए गए उदाहरण जैसे पूर्ण संदर्भ-संवेदनशील भाषाओं के लिए व्याकरण का उपयोग नहीं कर सकता है। मुझे लगता है कि पारर का क्या मतलब था कि एएनटीएलआर कुछ भाषाओं को पार्स कर सकता है जिसके लिए कुछ (बाएं) संदर्भ बाधाओं की आवश्यकता होती है।

विशेष रूप से, एक "कमी कार्रवाई" पर अर्थ विधेय उपयोग कर सकते हैं अब तक पार्सर द्वारा संग्रहीत डेटा का निरीक्षण करने के (हम GLR पारसर्स हमारे DMS Software Reengineering Toolkit लेकिन विचार ANTLR के लिए इसी तरह की है, मुझे लगता है कि द्वारा प्रयोग किया जाता के लिए ऐसा करते हैं) , या तो अन्य अर्थपूर्ण कार्यों के आंशिक दुष्प्रभावों के रूप में, या आंशिक रूप से निर्मित पार्स पेड़ में।

हमारे डीएमएस-आधारित DMS-based Fortran front end के लिए, यह सुनिश्चित करने के लिए एक संदर्भ-संवेदनशील जांच है कि डीओ-लूप ठीक तरह से रेखांकित हैं। पर विचार करें:

DO 20, I= ... 
    DO 10, J = ... 
     ... 
20 CONTINUE 
10 CONTINUE 

पार्सर की दृष्टि से, शाब्दिक धारा इस तरह दिखता है:

DO <number> , <variable> = ... 
    DO <number> , <variable> = ... 
     ... 
<number> CONTINUE 
<number> CONTINUE 

कैसे पार्सर तो पता कर सकते हैं जो करते स्टेटमेंट से संबद्ध बयान जारी जाता है? (यह कहकर कि प्रत्येक डीओ अपने निकटतम CONTINUE से मेल खाता है, काम नहीं करेगा, क्योंकि FORTRAN एकाधिक डीओ-हेड के साथ एक CONTINUE कथन साझा कर सकता है)।

हम निम्नलिखित नियम के लिए कमी पर एक अर्थ विधेय "CheckMatchingNumbers" का उपयोग करें:

block = 'DO' <number> rest_of_do_head newline 
     block_of_statements 
     <number> 'CONTINUE' newline ; CheckMatchingNumbers 

उस नंबर डीओ कीवर्ड निम्नलिखित, और संख्या निम्न कीवर्ड मिलान जारी की जाँच करने के। यदि अर्थपूर्ण भविष्यवाणी का कहना है कि वे मेल खाते हैं, तो इस नियम के लिए कमी सफल होती है और हमने डीओ हेड को सही CONTINUE के साथ गठबंधन किया है। यदि भविष्यवाणी विफल हो जाती है, तो कोई कमी प्रस्तावित नहीं है (और यह नियम स्थानीय संदर्भ को पार्स करने के लिए उम्मीदवारों से हटा दिया गया है); नियमों के कुछ अन्य सेट को पाठ को पार्स करना है।

साझा नियमों के साथ फोरट्रान घोंसले को संभालने के लिए वास्तविक नियम और अर्थशास्त्री भविष्यवाणी जारी है, लेकिन इससे मुझे लगता है कि यह इस बिंदु को बनाता है।

आप जो चाहते हैं वह पूर्ण संदर्भ-संवेदनशील पार्सिंग इंजन है। मुझे पता है कि लोगों ने उन्हें बनाया है, लेकिन मुझे किसी भी पूर्ण कार्यान्वयन के बारे में पता नहीं है, और उम्मीद नहीं है कि वे तेज़ हों।

मैंने थोड़ी देर के लिए Quinn Taylor Jackson's MetaS grammar system का पालन किया; यह करीब आने के व्यावहारिक प्रयास की तरह लग रहा था।

+0

+1 कोई पूर्ण कार्यान्वयन नहीं है, और ये उपकरण कुशल नहीं हैं। मदद के लिए धन्यवाद – Radi

+0

@Radi: मैंने कहा कि मुझे किसी के बारे में * पता नहीं है। मुझे यकीन है कि किसी ने कहीं कहीं लागू किया है। –

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