अंकगणित अभिव्यक्ति व्याकरण परिवर्तन


9

थियोडोर नॉरवेल (1999) द्वारा पुनरावर्ती वंश द्वारा पार्सिंग एक्सप्रेशंस लेख में लेखक अंकगणितीय अभिव्यक्तियों के लिए निम्नलिखित व्याकरण के साथ शुरू होता है:

E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | E "^" E | "(" E ")" | v

जो काफी बुरा है, क्योंकि यह अस्पष्ट और वाम-पुनरावर्ती है। इसलिए वह बाएं से पुनरावृत्ति को हटाने से शुरू होता है, और उसका परिणाम इस प्रकार है:

E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"

लेकिन मैं यह पता नहीं लगा सकता कि वह इस नतीजे पर कैसे पहुंचे। जब मैं स्वयं लेफ्ट रिक्रिएशन को हटाने की कोशिश करता हूं, तो मैं इसे निम्नलिखित तरीके से कर रहा हूं:

  1. एफआईआर, मैं उन समूहों को एक साथ समूह बनाता हूं जिनके पास एक समूह में पुनरावृत्ति नहीं है, और दूसरे समूह में अन्य (बाएं-पुनरावर्ती):

    E --> E "+" E | E "-" E | E "*" E | E "/" E | E "^" E     // L-recursive
    E --> v | "(" E ")" | "-" E
  2. अगला, मैं उन्हें नाम देता हूं और आसान जोड़तोड़ के लिए कारक:

    E --> E B E  // L-recursive; B stands for "Binary operator"
    E --> P  // not L-recursive; P stands for "Primary Expression"
    P --> v | "(" E ")" | U E   // U stands for "Unary operator"
    B --> "+" | "-" | "*" | "/" | "^"
    P --> "-"

    अब मुझे केवल पहले दो प्रस्तुतियों से निपटने की आवश्यकता है, जो अब निपटना आसान है।

  3. मैं गैर-एल-पुनरावर्ती उत्पादन (जो कि बस P, प्राथमिक अभिव्यक्ति है) से शुरू करके और वैकल्पिक पूंछ द्वारा इसका पालन करके उन पहले दो प्रस्तुतियों को फिर से लिखता Tहूं, जिन्हें मैं मूल उत्पादन के बाकी हिस्सों के रूप में परिभाषित करता हूं जो पहले बाएं-पुनरावर्ती नॉनटर्मिनल हैं (यह है, बस B E) टेल द्वारा पीछा किया T, या जो खाली हो सकता है:

    E --> P T
    T --> B E T |

    (पूंछ के लिए खाली विकल्प पर ध्यान दें)।

  4. ये दो प्रोडक्शंस मैं अब EBNF में इस तरह से लिख सकता हूं:

    E --> P {B E}

    जो लगभग क्या लेखक मिलता है, लेकिन मेरे पास है है Eके बजाय Pशून्य या अधिक पुनरावृत्ति पैटर्न (पूंछ) के अंदर वहाँ। अन्य प्रोडक्शंस मुझे वही मिलते हैं जो उन्हें मिले हैं:

    P --> v | "(" E ")" | U E
    B -> "+" | "-" | "*" | "/" | "^"
    U -> "-"

    लेकिन यहाँ भी मैं के Eबजाय Pपहले उत्पादन के लिए है P

तो, मेरा सवाल है: मैं क्या याद कर रहा हूँ? सिंटैक्स पर क्या बीजीय परिवर्तन मुझे अब उसी रूप में प्राप्त करने के लिए आगे बढ़ने की जरूरत है जैसा कि ऑटोर को मिलता है? मैं के लिए प्रतिस्थापन की कोशिश की E, लेकिन यह केवल मुझे छोरों में ले जाता है। मुझे लगता है कि मैं किसी भी तरह की जरूरत है स्थानापन्न करने Pके लिए E, लेकिन मैं इसे सही ठहराने के लिए किसी भी कानूनी परिवर्तन पता नहीं है। शायद आप जानते हैं कि अंतिम लापता कदम क्या है?


कृपया स्वरूपण के लिए LaTeX का उपयोग करने पर विचार करें। प्राइमर के लिए यहां देखें । ( इस मामले में लाटेक्स की उपयुक्तता के बारे में चर्चा के लिए यहां देखें ।)
राफेल

जवाबों:


8

लापता कदम:

E --> P T
T --> B E T |

T में फिर से लिखें:

E --> P T
T --> B P T T | 

सरलीकृत टी:

E --> P T
T --> B P T | 

के बराबर:

E --> P T
T --> {B P}

और वहां तुम हो।


1
एक अच्छे उत्तर के लिए धन्यवाद :-) अब मैं देखता हूं कि मैंने क्या याद किया है: मैंने इसे दूसरे तरीके से प्रतिस्थापित किया और यह समस्या थी। लेकिन फिर भी मुझे एक छोटा टुकड़ा समझ में नहीं आता: आप कैसे जानते हैं कि आप सुरक्षित रूप से Tएक में एक साथ विलय कर सकते हैं T? क्या उसके लिए कोई नियम है? (मुझे संदेह है कि यह बूलियन बीजीय तर्क में नियम के समान हो सकता है जो "
एए

BTW क्यों इस पोस्ट को cstheory.sx से यहाँ स्थानांतरित किया गया है और क्या अंतर है? मैं भविष्य में गलतियों से बचने के लिए जानना चाहूंगा।
SasQ

2
@SasQ CSTheory केवल सैद्धांतिक कंप्यूटर विज्ञान में अनुसंधान-स्तरीय प्रश्नों के लिए है, विवरण के लिए CSTheory के FAQ देखें।
जुहो

1
@SasQ: टीएक्सटीटी|ε उत्पन्न करता है एक्स* और ऐसा ही करता है टीएक्सटी|ε। ज़्यादा सामान्य,एल*एल*=एल* के लिये एलकोई भी भाषा। ध्यान दें कि खाली शब्द हैεजैसा कि दाहिने हाथ महत्वपूर्ण है; यह सभी व्याकरण के टुकड़ों के लिए नहीं है, जैसा किएल+एल+एल+
राफेल

@ राफेल: क्या ऐसा कुछ है जिसके लिए राजकीय नियम का पालन करना पड़ता है *? मैंने "ड्रैगन बुक" (3.3, p.91) में देखा x** = x*। क्या यह वही नियम है जिसका आपने उपयोग किया है?
SasQ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.