लेक्स/फ्लेक्स में, एक फ़ंक्शन yy_create_buffer है, उदाहरण के लिए:

bp = yy_create_buffer(yyin,YY_BUF_SIZE );

यह FILE yyin के लिए बफर bp बनाता है, जिसका आकार YY_BUF_SIZE है।

मुझे आश्चर्य है कि अगर FILE yyin इतना बड़ा है कि YY_BUF_SIZE में सभी टेक्स्ट नहीं हो सकते हैं, तो क्या लेक्स/फ्लेक्स सभी टोकन को सही ढंग से पार्स करेगा?

1
linrongbin 15 जिंदा 2020, 09:20

1 उत्तर

सबसे बढ़िया उत्तर

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

मूल लेक्स स्कैनर बफर नहीं करता था। यह केवल एक बार में एक वर्ण इनपुट पढ़ता है, वर्ण सरणी yytext में वर्तमान टोकन का निर्माण करता है। यह ठीक काम करता था जब टोकन बहुत बड़े नहीं थे, लेकिन यह सबसे कुशल समाधान नहीं है। इसलिए फ्लेक्स एक बार में डेटा के बफर को पढ़कर स्कैन को तेज करने का प्रयास करता है। फ्लेक्स भी सीधे बफर से डेटा का उपयोग करके प्रत्येक टोकन की प्रतिलिपि बनाने से बचाता है; फ्लेक्स में, yytext एक अलग सरणी होने के बजाय बफर में एक सूचक है।

इनपुट हैंडलिंग में तेजी लाने के अलावा, फ्लेक्स बफ़र्स आपको कई अतिरिक्त सुविधाएँ प्रदान करते हैं, जिसमें इन-मेमोरी बफ़र्स प्रदान करने की क्षमता और #include निर्देशों जैसी चीज़ों को संभालने के लिए उपयोगी बफर स्टैक शामिल हैं।

केवल स्मृति सीमा एक टोकन का आकार है। प्रत्येक टोकन को संसाधित होने के दौरान स्मृति में फिट होना चाहिए। जब किसी पैटर्न का स्कैन बफर के अंत तक पहुंचता है, तो फ्लेक्स पहले टोकन को बफर की शुरुआत में स्थानांतरित कर देगा और फिर यदि आवश्यक हो तो बफर का आकार बदलने का प्रयास करेगा।

yy_create_buffer को कॉल में आपके द्वारा प्रदान किया गया आकार प्रारंभिक बफर आकार है, इसकी सीमा नहीं। एक विशाल टोकन का सामना करते हुए, यदि आवश्यक हो तो मेमोरी आवंटन विफल होने तक फ्लेक्स बफर का विस्तार करना जारी रखेगा। जाहिर है, सैद्धांतिक रूप से एक टोकन इतना बड़ा होना संभव है कि यह संभव नहीं है। इसलिए (.|\n)+ जैसे पैटर्न का उपयोग न करें यदि आप उम्मीद कर रहे हैं कि आपके इनपुट स्ट्रीम में पेटाबाइट डेटा होगा। :-)

मूल लेक्स में yytext एक सरणी थी, सूचक नहीं, आकार बदलना असंभव था और संकलन-समय सरणी आकार टोकन लंबाई पर एक निश्चित सीमा निर्धारित करता था। फ्लेक्स इस संबंध में एक सुधार है, लेकिन यह बड़े टोकन के लिए अनुकूलित नहीं है और जब आपका एप्लिकेशन मेगाबाइट डेटा को एकल टोकन के रूप में संभालने का प्रयास करता है तो कुछ प्रदर्शन समस्याएं होती हैं।

2
rici 15 जिंदा 2020, 19:25