2009-06-01 11 views
8

मैं यूटीएफ -8 अक्षरों को संभालने के लिए एक बाइसन पार्सर बनाने की कोशिश कर रहा हूं। मैं नहीं चाहता कि पार्सर वास्तव में यूनिकोड चरित्र मानों की व्याख्या करे, लेकिन मैं इसे बाइट्स के अनुक्रम के रूप में यूटीएफ -8 स्ट्रिंग को पार्स करना चाहता हूं।क्या बाइसन यूटीएफ -8 अक्षरों को पार्स कर सकता है?

अभी, बाइसन निम्नलिखित कोड जो समस्याग्रस्त है उत्पन्न करता है:

if (yychar <= YYEOF) 
    { 
     yychar = yytoken = YYEOF; 
     YYDPRINTF ((stderr, "Now at end of input.\n")); 
    } 

समस्या यह है कि UTF-8 स्ट्रिंग से कई बाइट एक नकारात्मक मूल्य होगा, और बाइसन एक EOF नकारात्मक मान के रूप की व्याख्या है, और बंद हो जाता है।

क्या इसके आसपास कोई रास्ता है?

उत्तर

8

bison हाँ, flex संख्या। एक बार मुझे यूटीएफ -8 एन्कोडेड फाइलों के साथ काम करने के लिए एक बाइसन पार्सर की आवश्यकता थी, मैंने अपना खुद का yylex फ़ंक्शन लिखना समाप्त कर दिया।

संपादित: मदद करने के लिए, मैं glib में उपलब्ध यूनिकोड संचालन का एक बहुत इस्तेमाल किया (वहाँ एक gunicode प्रकार और कुछ फ़ाइल/स्ट्रिंग परिवर्तन कार्यों है कि मैं उपयोगी पाया)।

+0

खैर, मेरा लेक्सर यूटीएफ -8 वर्णों को ठीक से संभालता है, लेकिन बाइसन पार्सर जैसे ही ऋणात्मक मूल्य देखता है, उतना ही पार्सिंग बंद कर देता है। कृपया सलाह दें। –

+0

क्या आप एक बार में अपनी फ़ाइल 1 बाइट पढ़ रहे हैं? या एक समय में 1 utf-8 एन्कोडेड वर्ण? एक समय में – eduffy

+0

1 बाइट। –

4

flex यहां समस्या होने पर, आप zlex पर एक नज़र डालना चाहेंगे।

+0

यह एक दिलचस्प परियोजना है, लेकिन इस प्रश्न में संबोधित समस्या को ठीक से हल नहीं करेगा। 16-बिट वर्ण यूटीएफ -8 एन्कोडेड वर्णों से अलग हैं (एक चीज के लिए यूटीएफ -8 लंबाई में 4 बाइट तक हो सकता है)। – eduffy

0

यह 4 साल पहले से एक प्रश्न है, लेकिन मुझे एक ही समस्या का सामना करना पड़ रहा है और मैं अपने विचार साझा करना चाहता हूं।

समस्या यह है कि यूटीएफ -8 में आप नहीं जानते कि कितने बाइट पढ़ने के लिए हैं। जैसा कि ऊपर बताया गया है, आप अपने स्वयं के लेक्सर का उपयोग कर सकते हैं, और इसे या तो पूरी लाइनें पढ़ सकते हैं, या इसे हर बार 4 बाइट पढ़ सकते हैं। फिर उस से यूटीएफ -8 चरित्र निकालें, और 4 बाइट्स को फिर से पूरा करने के लिए और बाइट्स पढ़ें।

+0

यद्यपि आप यह नहीं जानते कि प्रति चरित्र पढ़ने के लिए कितने बाइट्स पढ़ते हैं जब तक कि आप वास्तव में उन्हें पढ़ नहीं लेते, आपको शायद जानने की आवश्यकता नहीं है। बाइट स्ट्रीम को सही ढंग से टोकननाइज़ करने के लिए, आपको वास्तव में यह जानने की ज़रूरत है कि बाइट पैटर्न कीवर्ड, डिलीमीटर आदि के रूप में महत्वपूर्ण हैं .. लेक्सर को किसी और चीज की व्याख्या करने की आवश्यकता नहीं है; यह सिर्फ टोकन में बाइट अनुक्रम एकत्र करता है। यहां तक ​​कि यदि आप कॉलर को चरित्र-शाब्दिक टोकन को वापस रिपोर्ट करना चाहते हैं, तो वैध यूटीएफ -8 कोड अनुक्रमों से मेल खाने वाले लेक्सिकल पैटर्न नियमों को लिखना संभव है, और इनकमिंग मल्टीबाइट वर्णों को सही तरीके से स्कैन करने के लिए उपयोग करना संभव है। –

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