2012-09-08 9 views
6

यह एक व्यावहारिक से एक "सिद्धांत रूप में" प्रश्न है। वह क्रम है जिसमें Yacc प्रोडक्शंस को कम करता है, और परिभाषित लेक्सर से नए टोकन पढ़ता है। यही कारण है, अगर मैं टोकन के सेट निम्नलिखित था:क्या Yacc में परिभाषित कमी का आदेश है?

INTEGER_BEGIN 
INTEGER_VALUE 
LESS_THAN 
INTEGER_BEGIN 
INTEGER_VALUE 

Yacc, इसके सिमेंटिक भीतर,, lexer से LESS_THAN टोकन पढ़ सकते हैं इससे पहले कि यह एक भी बात करने के लिए INTEGER BEGIN INTEGER_VALUE कम कर देता है, जैसे प्रस्तुतियों का एक सेट दिया:

expr : expr LESS_THAN expr 
    | integer 

integer : INTEGER_BEGIN INTEGER_VALUE 

इन परिवर्तनों के नियम क्या हैं यदि इन्हें अर्थपूर्ण कार्रवाइयों के साथ परिभाषित किया गया है?

उत्तर

4

हां यह कर सकता है। Yacc एक एलएएलआर (1) पार्सर बनाता है - (1) का अर्थ लुकहेड के 1 टोकन है - इसलिए यह उस नियम को कम करने से पहले नियम के लिए टोकन के अंत से पहले 1 टोकन पढ़ सकता है। अर्थपूर्ण कार्रवाइयों का अस्तित्व अप्रासंगिक है, क्योंकि अर्थपूर्ण कार्रवाई नियम को कम करने से ठीक पहले चलाने के लिए कुछ सी कोड है।

ध्यान दें कि इस बात की कोई गारंटी नहीं है कि यह हमेशा टोकन को आगे पढ़ेगा। Yacc या bison द्वारा बनाए गए पार्सर कभी-कभी 'डिफ़ॉल्ट कटौती' का उपयोग करता है - कहता है कि यह पहले टोकन को पढ़ने के बिना नियम को कम कर सकता है। ऐसा तब होता है जब किसी नियम की कमी अगले टोकन से स्वतंत्र होती है।

इस विशिष्ट उदाहरण में, integer नियम के लिए एक डिफ़ॉल्ट कमी का उपयोग किया जा सकता है, इसलिए यह बिना किसी दृश्य के इसे कम कर सकता है, लेकिन फिर कोई गारंटी नहीं है - डिफ़ॉल्ट कटौती कुछ (लेकिन सभी नहीं) कार्यान्वयन द्वारा उपयोग की जाने वाली अनुकूलन है याक।

+0

क्या यह जानने का कोई तरीका है कि यह हुआ है या नहीं? –

+0

http://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html में डिफ़ॉल्ट कटौती के अर्थशास्त्र का पूर्ण विवरण शामिल है, और जैसा कि आपने नोट किया है, लेक्सर के देरी से इनकार करने का कारण बनता है। –

+0

बाइसन के कुछ संस्करणों में, आप यह देखने के लिए कार्रवाई में 'if (yychar == YYEMPTY) 'देख सकते हैं कि आप डिफ़ॉल्ट कमी में हैं (इसलिए कोई लुकहेड पढ़ा नहीं गया है), लेकिन यह बहुत पोर्टेबल नहीं है। –

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