2012-04-02 9 views
8

मैं पारसेक के साथ कुछ पाठ पार्स करने के लिए कोशिश कर रहा हूँ पीछे नहीं है फिर "लॉगिन" इत्यादि का प्रयास करें। लेकिन यह केवल "छोड़ें" से मेल खाता है, और यदि यह विफल रहता है, तो एक त्रुटि देता है।हास्केल Text.Parsec.Combinator पसंद

ghci> parseTest singleparam (pack "login asdf") 
parse error at (line 1, column 1): 
unexpected "o" 
expecting "leave" 
ghci> parseTest singleparam (pack "leave asdf") 
LoginCmd "asdf" 

मैं क्या गलत कर रहा हूं?

उत्तर

14

पारसेक स्वचालित रूप से इस तरह (पीछे दक्षता के लिए) बैकट्रैक नहीं करता है। नियम यह है कि एक शाखा एक टोकन स्वीकार करने के बाद वैकल्पिक शाखाओं काट दिया जाता है। समाधान try (string "leave") और try (string "login") आदि

अपने उदाहरण में उपयोग करते हुए 'l' चरित्र टोकन है कि पहले "छोड़" शाखा को Parsec करता है एक स्पष्ट बैक ट्रैकिंग जोड़ने के लिए है और "के लिए लॉग इन" और की अगली शाखाओं छोड़ दिया " में शामिल होने के "।

रियल वर्ल्ड हास्केल (पुस्तक, ऑनलाइन) on parsec में अधिक जानकारी।