मैं शिफ्ट-कम पार्सिंग के बारे में जानने की कोशिश कर रहा हूं। मान लीजिए कि हमें निम्नलिखित व्याकरण है, पुनरावर्ती नियम है कि आपरेशन के आदेश लागू करने, ANSI C Yacc grammar से प्रेरित का उपयोग कर:शिफ्ट-कम करें: कब कम करना बंद करें?
S: A;
P
: NUMBER
| '(' S ')'
;
M
: P
| M '*' P
| M '/' P
;
A
: M
| A '+' M
| A '-' M
;
और हम 1 + 2 पार्स करने के लिए उपयोग कर रहा पार्स पाली-को कम करना चाहते हैं। सबसे पहले, 1 को NUMBER के रूप में स्थानांतरित किया गया है। मेरा सवाल यह है कि, फिर यह पी को कम कर दिया जाता है, फिर एम, फिर ए, फिर आखिरकार एस? यह कैसे पता चलेगा कि कहां रुकना है?
मान लीजिए कि यह एस के सभी तरीकों को कम करता है, फिर '+' को बदल देता है। अब हम एक ढेर युक्त होगा:
S '+'
हम पाली '2', में कटौती हो सकती है:
S '+' NUMBER
S '+' P
S '+' M
S '+' A
S '+' S
अब, अंतिम पंक्ति के दोनों तरफ, एस हो सकता है पी, एम, ए, या NUMBER, और यह अभी भी इस अर्थ में मान्य होगा कि कोई भी संयोजन टेक्स्ट का सही प्रतिनिधित्व होगा। पार्सर इसे
A '+' M
ताकि यह संपूर्ण अभिव्यक्ति को ए, फिर एस को कम कर सके? दूसरे शब्दों में, अगले टोकन को स्थानांतरित करने से पहले इसे कम करने के लिए कैसे पता चलता है? क्या यह एलआर पार्सर पीढ़ी में एक महत्वपूर्ण कठिनाई है?
संपादित करें: प्रश्न में नया इस प्रकार है।
अब मान लीजिए कि हम 1+2*3
पार्स करते हैं। कुछ बदलाव/कमी संचालन निम्नानुसार हैं:
Stack | Input | Operation
---------+-------+----------------------------------------------
| 1+2*3 |
NUMBER | +2*3 | Shift
A | +2*3 | Reduce (looking ahead, we know to stop at A)
A+ | 2*3 | Shift
A+NUMBER | *3 | Shift (looking ahead, we know to stop at M)
A+M | *3 | Reduce (looking ahead, we know to stop at M)
क्या यह सही है (दिया गया है, यह अभी तक पूरी तरह से विश्लेषण नहीं किया गया है)? इसके अलावा, 1 प्रतीक से दिखने से हमें A+M
A
को कम करने के लिए भी नहीं बताया जाता है, ऐसा करने के परिणामस्वरूप *3
पढ़ने के बाद एक अपरिहार्य वाक्यविन्यास त्रुटि होगी?
आपके द्वारा प्रदान किए गए व्याकरण के लिए '1 + 2' एक शिफ्ट उत्पन्न नहीं करता है/कम नहीं करता है? – mcabral
नहीं। बाइसन बिना किसी शिकायत के स्वीकार करता है (इसे% टोकन NUMBER \ n %% \ n ... \ n %%, निश्चित रूप से लपेटने के बाद)। –