फ्लेक्स यूनिकोड का समर्थन नहीं करता है। हालांकि, फ्लेक्स "8 बिट क्लीन" बाइनरी इनपुट का समर्थन करता है। इसलिए आप यूटीएफ -8 से मेल खाने वाले लेक्सिकल पैटर्न लिख सकते हैं। आप इनपुट पैटर्न के विशिष्ट शब्दावली क्षेत्रों में इन पैटर्न का उपयोग कर सकते हैं, उदाहरण के लिए पहचानकर्ता, टिप्पणियां या स्ट्रिंग अक्षर।
यह सामान्य प्रोग्रामिंग भाषाओं के लिए अच्छी तरह से काम करेगा, जहां आप अपने कार्यान्वयन के उपयोगकर्ताओं को जोर दे सकते हैं कि स्रोत भाषा ASCII/UTF-8 में लिखी गई है (और कोई अन्य एन्कोडिंग समर्थित नहीं है, अवधि)।
यह दृष्टिकोण काम नहीं करेगा यदि आपके स्कैनर को किसी भी एन्कोडिंग में पाठ को संसाधित करना चाहिए। यदि आपको यूनिकोड तत्वों के लिए विशेष रूप से शब्दावली नियमों को व्यक्त करने की आवश्यकता है तो यह भी काम नहीं करेगा (बहुत अच्छी तरह से)। अर्थात। आपको स्कैनर में यूनिकोड वर्ण और यूनिकोड रेगेक्स की आवश्यकता है।
विचार यह है कि आप एक लेक्स नियम का उपयोग कर एक पैटर्न जो UTF-8 बाइट्स शामिल पहचान सकते हैं (और फिर शायद yytext
लेते हैं, और UTF-8 में से परिवर्तित या कम से कम उसे सत्यापित करने में।)
ASC [\x00-\x7f]
ASCN [\x00-\t\v-\x7f]
U [\x80-\xbf]
U2 [\xc2-\xdf]
U3 [\xe0-\xef]
U4 [\xf0-\xf4]
UANY {ASC}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
UANYN {ASCN}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
आप देख सकते हैं, हम पैटर्न ASCII मैच के लिए परिभाषित कर सकते हैं: http://www.kylheku.com/cgit/txr/tree/parser.l
इस अनुभाग में नीचे स्क्रॉल:
एक काम उदाहरण के लिए, इस फ़ाइल को विशेष रूप से, TXR भाषा के स्रोत कोड को देखने के characte आरएस के साथ ही यूटीएफ -8 प्रारंभ और निरंतर बाइट्स। यूटीएफ -8 एक व्याख्यात्मक संकेत है, और यह एक व्याख्यात्मक विश्लेषक जनरेटर है, इसलिए ... कोई समस्या नहीं!
कुछ स्पष्टीकरण: UANY
का मतलब है किसी भी चरित्र, एकल-बाइट ASCII या बहु-बाइट यूटीएफ -8 से मेल खाता है। UANYN
का अर्थ UANY
है लेकिन न्यूलाइन से मेल नहीं खाता है। यह टोकन के लिए उपयोगी है जो लाइनों के अंत में #
से एक टिप्पणी कहने के लिए लाइनों को तोड़ नहीं देते हैं, जिसमें अंतरराष्ट्रीय पाठ होता है।UONLY
का अर्थ केवल एक यूटीएफ -8 विस्तारित चरित्र से मेल खाता है, न कि ASCII एक। यह एक लेक्स नियम लिखने के लिए उपयोगी है जिसे कुछ विशिष्ट ASCII वर्णों को बाहर करने की आवश्यकता है (केवल नई लाइन नहीं) लेकिन सभी विस्तारित वर्ण ठीक हैं।
अस्वीकरण: ध्यान दें कि स्कैनर के नियमों एक समारोह utf8_dup_from
बुलाया विस्तृत चरित्र यूनिकोड कोड पॉइंट्स वाली स्ट्रिंग को yytext
कन्वर्ट करने के लिए इस्तेमाल करते हैं। वह कार्य मजबूत है; यह अनुक्रमों और अमान्य बाइट्स की तरह समस्याओं का पता लगाता है और उन्हें ठीक से संभालता है। अर्थात। यह कार्यक्रम सत्यापन और रूपांतरण करने के लिए इन लेक्स नियमों पर निर्भर नहीं है, केवल बुनियादी शब्दावली मान्यता के लिए। ये नियम मान्य वाक्यविन्यास के रूप में एक अतिव्यापी रूप (जैसे कई बाइट्स का उपयोग करके एएससीआईआई कोड एन्कोड किए गए) को पहचानेंगे, लेकिन रूपांतरण फ़ंक्शन उन्हें ठीक से इलाज करेगा। किसी भी मामले में, मैं प्रोग्राम स्रोत कोड में यूटीएफ -8 से संबंधित सुरक्षा मुद्दों की अपेक्षा नहीं करता हूं, क्योंकि आपको इसे चलाने के लिए स्रोत कोड पर भरोसा करना है (लेकिन प्रोग्राम द्वारा संभाला गया डेटा भरोसा नहीं किया जा सकता है!) यदि आप हैं अविश्वसनीय यूटीएफ -8 डेटा के लिए स्कैनर लिखना, ध्यान रखना!
कामकाज पर अधिक संकेत? – xiaohan2012
मैंने मेलिंग सूची से जवाब में जवाब का जवाब दिया। –
धन्यवाद। मुझे बहुत प्रेरित करने के लिए लगता है! – xiaohan2012