2011-02-01 24 views
5

रेलरोड आरेख संदर्भ-मुक्त व्याकरण को देखने के लिए एक लोकप्रिय तरीका हैं और आप इन आरेखों में बैकस-नौर फॉर्म को मानचित्र बना सकते हैं। लेकिन some variants of BNF, उदाहरण के लिए W3C-BNF अपवादों की अनुमति देता है (क्योंकि संदर्भ-मुक्त भाषाएं अंतर के तहत बंद नहीं होती हैं, इन अपवादों को नियमित होना चाहिए)। मैं रेलरोड आरेख में अपवादों के साथ एक व्याकरण को देखना चाहता हूं। क्या मुझे ग्राफिकल नोटेशन में अपना स्वयं का एक्सटेंशन आविष्कार करना चाहिए या किसी ने पहले से इसका प्रयोग किया है?क्या अपवादों को पकड़ने के लिए रेलरोड आरेखों का विस्तार है?

यहाँ अपवाद के साथ एक नियम का एक उदाहरण है (हाँ, आप भी बिना किसी अपवाद के इस विशेष व्याकरण व्यक्त कर सकते हैं, लेकिन उस समय नहीं है):

comment := "<!--" (string - "--") "-->" 

एक अपवाद किसी भी नियमित व्याकरण हो सकता है। मैं तीर या लाइन के कुछ विशेष प्रकार (यहाँ विस्मयादिबोधक चिह्न से दर्शाया गया) द्वारा गैर टर्मिनल प्रतीकों से जुड़े अपवाद जोड़ने के बारे में सोचा:

[<] → [!] → [-] → [-] → (string) → [-] → [-] → [>] 
          ! 
          ! → [-] → [-] → ↯ 

पुनश्च: व्याकरण गलत था, यह होना चाहिए

comment := "<!--" (string - (string "--" string | string "-")) "-->" 

शायद अस्वीकृति का गैर-अंतर्ज्ञानी उपयोग एक कारण है कि औपचारिक व्याकरण में इसका उपयोग क्यों नहीं किया जाता है?

उत्तर

4

हाल ही में डब्ल्यू 3 सी व्याकरण के लिए Railroad Diagram Generator लिखते समय, मैंने कुछ समय के लिए सोचा कि इसका प्रतिनिधित्व कैसे किया जाए, लेकिन मैं ऐसे समाधान के साथ नहीं आया जो मैं खुश था। किसी भी उदाहरण का पालन करने के लिए कोई उदाहरण नहीं मिला।

यह केवल सेट-अंतर ऑपरेटर नहीं है, जिसके लिए परंपरागत रेलरोड आरेखों में कोई ग्राफिकल समतुल्य नहीं है। कोडपॉइंट्स, रेंज और पूरक के लिए नोटेशन भी ठीक से फिट नहीं होता है।

अंत में मैंने ग्राफिकल रूप से मॉडल को विस्तारित करने से बचाया। मैंने जो किया वह व्याकरण खंड को पकड़ने के लिए एक टर्मिनल बॉक्स खींचता है जिसमें मूल नोटेशन में समतुल्य रेल मार्ग नहीं है। इसे शाब्दिक बक्से से अलग करने के लिए, यह इटालिक्स में स्थापित है। यहाँ एक्सएमएल सिफारिश से एक उदाहरण है:

XML comment railroad diagram

EBNF उत्पादन किया गया था:

Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' 

संपादित:

एक अलग आकार के लिए जेकब के प्रस्ताव के बाद, अनसुलझे EBNF अभिव्यक्ति कर रहे हैं अब हेक्सागोन में दिखाया गया है:

enter image description here

+1

दिलचस्प। मैं कोडपॉइंट्स और श्रेणियों के लिए अलग-अलग आकार के बॉक्सिंग का उपयोग करता हूं। इस तरह के एक बॉक्स में सरल नियमित अभिव्यक्ति भी लगाई जा सकती है। तो तीन प्रकार के बक्से होंगे: टर्मिनल प्रतीकों, nonterminal प्रतीकों, और पैटर्न प्रतीकों। इन पैटर्न बक्से में गैर-टर्मिनल प्रतीकों को अपने "चार - '-' 'जैसे एक समझौता करना एक समझौता है जिसे बेहतर किया जा सकता है। एक बॉक्स को चित्रित करने के बारे में जिसमें अन्य बक्से के रूप में एक पटर शामिल है? – Jakob

+0

आप सही हैं, एक टर्मिनल बॉक्स काफी उपयुक्त नहीं है, इसलिए मैंने तदनुसार अपना जेनरेटर बदल दिया। – Gunther

+0

अच्छा समाधान। मैंने इसे "अंतर" बॉक्स में बढ़ा दिया। मतभेदों के साथ आप व्याकरण को अधिक पठनीय लिख सकते हैं, लेकिन यह पार्स करना अधिक कठिन हो सकता है: http: // imgur।com/inAKK – Jakob