मैं एक बहुत ही साधारण भाषा का विश्लेषण करने की कोशिश कर रहा हूं जिसमें केवल दशमलव या बाइनरी संख्याएं होंगी। उदाहरण के लिए, यहाँ कुछ मान्य इनपुट हैं: <|>
:ऐसा क्यों लगता है कि पारसी चॉइस ऑपरेटर पार्सर्स के आदेश पर निर्भर करता है?
#b1
#d1
#b0101
#d1234
मैं Parsec की पसंद ऑपरेटर का उपयोग में समस्या हो रही। ट्यूटोरियल के मुताबिक: Write yourself a Scheme in 48 hours:
[पसंद ऑपरेटर] पहले पार्सर की कोशिश करता है, फिर यदि यह विफल हो जाता है, तो दूसरा प्रयास करता है। यदि या तो सफल होता है, तो यह उस पार्सर द्वारा लौटाए गए मान को वापस कर देता है ..
लेकिन मेरे अनुभव में, मुझे लगता है कि पार्सर्स के आदेश ने मामलों की आपूर्ति की।
import System.Environment
import Text.ParserCombinators.Parsec
main :: IO()
main = do
(x:_) <- getArgs
putStrLn ("Hello, " ++ readExp x)
bin :: Parser String
bin = do string "#b"
x <- many(oneOf "01")
return x
dec :: Parser String
dec = do string "#d"
x <- many(oneOf "")
return x
-- Why does order matter here?
parseExp = (bin <|> dec)
readExp :: String -> String
readExp input = case parse parseExp "test" input of
Left error -> "Error: " ++ show error
Right val -> "Found val" ++ show val
यहाँ कैसे मैं इस कार्यक्रम चला रहा हूँ है: यहाँ मेरी कार्यक्रम है
स्थापित कर रहा है निर्भरता
$ cabal sandbox init
$ cabal install parsec
संकलन
$ cabal exec ghc Main
भागो
$ ./Main "#d1"
Hello, Error: "test" (line 1, column 1):
unexpected "d"
expecting "#b"
$ ./Main "#b1"
Hello, Found val"1"
,210
इस प्रकार अगर मैं पारसर्स के आदेश को बदल:
parseExp = (dec <|> bin)
उसके बाद ही द्विआधारी संख्या का पता चलता है और इस कार्यक्रम दशमलव संख्या की पहचान करने में विफल रहता है।
मेरे द्वारा किए गए परीक्षणों के साथ, मुझे लगता है कि यह समस्या केवल तभी होती है जब एक पार्सर्स ने इनपुट को पार्स करना शुरू कर दिया हो। यदि एक हैश चरित्र #
पाया जाता है, तो बिन पार्सर सक्रिय होने में सक्रिय हो रहा है क्योंकि अगली वर्ण अपेक्षित है b
और d
नहीं। ऐसा लगता है कि ऐसा कुछ प्रकार का बैकट्रैक होना चाहिए जो होना चाहिए, जिसे मुझे पता नहीं है।
सहायता की सराहना करें!
लेकिन मेरे मामले में पहला पार्सर सफल नहीं होता है। यह पहले चरित्र मैचों के बाद से सक्रिय है, लेकिन बाद में विफल रहता है क्योंकि इसे अगले अपेक्षित चरित्र नहीं मिलते हैं। मुझे उम्मीद है कि अगला पार्सर सक्रिय होना चाहिए, लेकिन ऐसा नहीं होता है क्योंकि आप चिपकने वाले आउटपुट से देख सकते हैं। – mandark
@ मन्दर्क यह है कि कैसे पारसी काम करता है। मैं संपादित करूंगा। – chi
और आश्चर्य की बात है, मैंने 'attoparsec' पार्सर्स को देखा है जो '<|>' पर तर्कों के क्रम के आधार पर सफल या विफल हो सकते हैं। मुझे इसके बारे में अपना खुद का सवाल पूछना होगा। – dfeuer