के साथ int या float पार्सिंग मैं FParsec का उपयोग करके फ़ाइल को पार्स करने का प्रयास कर रहा हूं, जिसमें या तो फ्लोट या int मान शामिल हैं। मुझे दो समस्याओं का सामना करना पड़ रहा है जिनके लिए मुझे अच्छा समाधान नहीं मिल रहा है। जब स्ट्रिंग "3.0"
और pfloat
3.0
वापस आ जाएगी जब एक ही स्ट्रिंग को पार्स पार्स करनेFParsec
दोनों pint32
और pfloat
सफलतापूर्वक एक ही स्ट्रिंग पार्स होगा, लेकिन अलग-अलग जवाब देने, उदा pint32
3
वापस आ जाएगी। क्या pint32
का उपयोग कर फ़्लोटिंग पॉइंट वैल्यू को पार्स करना संभव है और यदि स्ट्रिंग "3.0"
है तो यह असफल हो सकता है?
दूसरे शब्दों में, वहाँ निम्नलिखित कोड काम करने के लिए एक तरीका है:
let parseFloatOrInt lines =
let rec loop intvalues floatvalues lines =
match lines with
| [] -> floatvalues, intvalues
| line::rest ->
match run floatWs line with
| Success (r, _, _) -> loop intvalues (r::floatvalues) rest
| Failure _ ->
match run intWs line with
| Success (r, _, _) -> loop (r::intvalues) floatvalues rest
| Failure _ -> loop intvalues floatvalues rest
loop [] [] lines
कोड सही तरीके से floatvalues
सूची में सभी चल बिन्दु मान रखने जाएगा का यह टुकड़ा है, लेकिन क्योंकि pfloat
रिटर्न "3.0"
जब पार्स करने स्ट्रिंग "3"
, सभी पूर्णांक मान भी floatvalues
सूची में रखे जाएंगे।
ऊपर कोड उदाहरण थोड़ा मेरे लिए अनाड़ी लगता है, इसलिए मैं वहाँ अनुमान लगा रहा हूँ यह करने के लिए एक बेहतर तरीका होना चाहिए। मैंने choice
का उपयोग करके उन्हें संयोजित करने पर विचार किया, हालांकि दोनों पार्सर्स को काम करने के लिए उसी प्रकार को वापस करना होगा। मुझे लगता है कि मैं फ्लोट के लिए एक विकल्प के साथ एक भेदभावपूर्ण संघ बना सकता हूं और एक int के लिए एक और और pfloat
से उत्पादन को |>>
ऑपरेटर का उपयोग करके परिवर्तित कर सकता हूं। हालांकि, मैं सोच रहा हूं कि कोई बेहतर समाधान है या नहीं?
वैसे @bytebuster, मुझे टेस्ट स्ट्रिंग पर pCombined चलाने में कुछ परेशानी हो रही है, यह त्रुटि संदेश देता है '' संयोजक 'कई को एक पार्सर पर लागू किया गया था जो इनपुट लेने के बिना सफल होता है और पार्सर को बदले बिना किसी अन्य तरीके से राज्य। ''। क्या ईओएफ को संभालने की ज़रूरत है? – Chepe
ग्रेट, धन्यवाद @bytebuster! एक और बात, मैंने 'कई' संयोजक को हटा दिए जाने के बाद स्ट्रिंग '2" पर पार्सर चलाने की कोशिश की, और फिर मुझे वही समस्या मिली जो मैंने ऊपर वर्णित की थी, अर्थात् यह एक फ्लोट के रूप में लौटाया गया था क्योंकि फ्लोट पार्सर int पार्सर से पहले आता है। इसका समाधान करने के तरीके पर कोई विचार? – Chepe
@chepe, कृपया अद्यतन संस्करण की जांच करें। उम्मीद है कि यह दोनों मुद्दों को संबोधित करता है। – bytebuster