2012-06-06 14 views
8

क्या बीएनएफ या एबीएनएफ ने निषेध का समर्थन किया है। यह सेट के कुछ सदस्यों को बाहर रखा गया है? मुझे इसके वाक्यविन्यास में ऐसा कोई निषेध ऑपरेटर नहीं मिला।बीएनएफ में निषेध का प्रतिनिधित्व कैसे करें?

उदाहरण के लिए, मान लीजिए S सभी अक्षरांकीय तार कि बराबर नहीं"foo" लिए कर रहे हैं का सेट है S के लिए BNF क्या है?

+0

मुझे लगता है कि अलग-अलग पात्रों का उपयोग करके स्ट्रिंग का निर्माण करके इसे एक जटिल तरीके से परिभाषित करना संभव है। – Jus12

+1

हां, आप कर सकते हैं। आपने सामान्य रूप से अस्वीकृति के बारे में पूछा। आपके विशिष्ट उदाहरण के लिए, यह व्याकरण चाल करेगा: एस = नहीं किसी भी * | 'एफ' नहीं किसी भी * | 'एफ' 'ओ' नहीं किसी भी *; notF = 'a' | ... 'ई' | 'जी' | ... 'जेड'; नहीं ओ = 'ए' | ... | 'एन' | 'पी' | ... 'जेड'; कोई = 'ए' | ... | 'जेड'; –

उत्तर

3

संदर्भ मुक्त व्याकरण "अंतर" या "पूरक" के तहत बंद नहीं हैं। इसलिए जब आप अपने बीएनएफ में ऑपरेटर "घटाव" जोड़ने का निर्णय ले सकते हैं, तो परिणाम एक संदर्भ मुक्त व्याकरण नहीं होगा, भले ही इसे व्यक्त करने का एक आसान तरीका हो। नतीजा: लोग संदर्भ-मुक्त व्याकरण व्यक्त करने के लिए उपयोग किए जाने वाले बीएनएफ व्याकरण में ऐसे ऑपरेटरों को अनुमति नहीं देते हैं।

+2

तो मौजूदा कंपाइलर्स कैसे जांचते हैं कि चर आरक्षित शब्द नहीं हैं? – Jus12

+4

मुख्य शब्दों को पहचानना आमतौर पर लेजर में किया जाता है, न कि पार्सर। आमतौर पर एक लेक्सर * ऑर्डर * तुलना करता है, इसलिए आप पहले खोजशब्दों की तलाश करते हैं। अगर और केवल अगर यह विफल रहता है, तो आपके पास कुछ अन्य पहचानकर्ता है। –

+0

अधिक परिष्कृत योजनाएं पहचानकर्ताओं को उस संदर्भ में कीवर्ड के रूप में मानती हैं जिसमें उन्हें कीवर्ड के रूप में माना जा सकता है। इसके लिए लेक्सर और पार्सर को पसंद करने के लिए बातचीत करने की आवश्यकता होती है, और/या पार्सर कीवर्ड और पहचानकर्ता विकल्पों दोनों को आजमाने की कोशिश करता है, और यदि यह काम करता है तो कीवर्ड विकल्प चुनें। हम इसे अपने पार्सर्स के साथ करते हैं और यह काफी अच्छी तरह से काम करता है। –

2

बीएनएफ में नहीं होने पर, ईबीएनएफ में को छोड़कर (आमतौर पर "-" के रूप में परिभाषित किया गया है)। आपके मामले में, वाक्य रचना होगा:

alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9"|"A"|...|"Z"; 
S= (alphaNum,{alphaNum}) - "foo"; 

या यदि आप चाहते हैं कि उसे असंवेदनशील मामला है:

foo="f"|"F","o"|"O","o"|"O"; 
alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9"|"A"|...|"Z"; 
S= (alphaNum,{alphaNum}) - foo; 

यह एक अलग स्वीकृति मानदंडों से टिप्पणी जो होगा में किया गया था में जो परिणाम इसके बराबर:

alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9"; 
S= alphaNum - "f", {alphaNum} 
    |"f", alphaNum - "o", {alphaNum} 
    |"f", "o", alphaNum - "o", {alphaNum}; 

यह स्ट्रिंग्स "एफ" और "एफओ" छोड़ देता है।

हालांकि, यह ध्यान रखना महत्वपूर्ण है कि ईरा बैक्सटर के जवाब में यह है कि कुछ भी छोड़कर (अस्वीकृत) कारक समस्याएं पैदा करेगा।

4.7 वाक्यात्मक अपवाद

एक वाक्यात्मक-अपवाद एक वाक्यात्मक कारक विषय कि प्रतीकों में से दृश्यों वाक्यात्मक-अपवाद द्वारा का प्रतिनिधित्व समान रूप से हो सकता है प्रतिबंध के होते हैं: यह भी ISO standard में बताया गया है द्वारा प्रतिनिधित्व किया गया एक वाक्य रचनात्मक-कारक जिसमें कोई मेटा-पहचानकर्ता नहीं है।

नोट - एक वाक्यात्मक-अपवाद एक मनमाना वाक्यात्मक-कारक होने की अनुमति दी है, तो विस्तारित BNF भाषाओं का एक व्यापक वर्ग विषय से मुक्त व्याकरण से, प्रयास जो रसेल के लिए नेतृत्व सहित निर्धारित कर सकते हैं जैसे विरोधाभास, उदाहरण के लिए

xx = "A" - xx; 

क्या "ए" xx का एक उदाहरण है? ऐसा लाइसेंस अवांछनीय है और इसलिए सिंटैक्टिक-अपवाद का रूप प्रतिबंधित है जो सुरक्षित साबित हो सकते हैं। इस प्रकार एक सिंटैक्टिक-कारक सामान्य रूप से कुछ संदर्भ-मुक्त व्याकरण के बराबर है, एक वाक्य रचनात्मक अपवाद हमेशा नियमित व्याकरण के बराबर होता है। यह दिखाया जा सकता है कि संदर्भ-मुक्त व्याकरण और नियमित व्याकरण के बीच का अंतर हमेशा एक और संदर्भ मुक्त व्याकरण है; इसलिए इस वाक्य के अनुसार एक वाक्य रचनात्मक शब्द (और इसलिए व्याकरण परिभाषित) कुछ संदर्भ मुक्त व्याकरण के बराबर है।

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