2013-02-22 42 views
8

मैं 48 घंटे के ट्यूटोरियल में स्वयं को एक योजना लिख ​​रहा हूं।हास्केल पारसेक, एक स्ट्रिंग को [स्ट्रिंग]

symbol :: Parser Char 
symbol = oneOf "!#$%&|*+-/:<=>[email protected]^_~" 

यह प्रतीकों के लिए बहुत अच्छा है, लेकिन यदि मेरे पास कीवर्ड की एक सूची है तो क्या होगा? (यानी संरचना, int)

क्या कोई सूची में अनुकूलित किया जा सकता है? यह आदर्श है जो मैं चाहता हूं, नीचे दिखाया गया है।

keywords :: Parser String 
keywords = oneOf ["struct","int",..etc] 

या मुझे Text.Parsec.Char आयात करना चाहिए और कीवर्ड की सूची में मानचित्र स्ट्रिंग करने का प्रयास करना चाहिए?

मैं टोकननाइज़ करने का प्रयास कर रहा हूं और सिर्फ यह जानना चाहता हूं कि इस सड़क पर जाने वाले अन्य लोगों से सर्वोत्तम प्रथाएं क्या थीं।

divOrMod = string "div" 
       <|> string "mod" 

http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-Parsec-Char.html

+0

अरे, मेरे पास उस ट्यूटोरियल के बारे में कुछ प्रश्न हैं ... क्या मैं आपको नहीं पूछ सकता अगर आपको कोई फर्क नहीं पड़ता? – hashcode55

उत्तर

11

इस के सामान्य रूप the choice combinator है, जो निम्न प्रकार है::

choice :: Stream s m t => [ParsecT s u m a] -> ParsecT s u m a 

मूल रूप से, आप दे

डॉक्स कुछ इस तरह उपयोग करने के लिए कहते हैं यह पार्सर्स की एक सूची है, और यह तब तक कोशिश करता है जब तक कि कोई सफल न हो जाए। choice(<|>) का उपयोग करके कार्यान्वित किया गया है, इसलिए यह उस दृष्टिकोण के समान है।

आपके मामले में, कीवर्ड हैं, लेकिन अन्य पारसर्स की एक सूची से मिलान करने के, तो आप सिर्फ String रों की एक सूची से अधिक मैप कर सकते हैं string और फिर उस पर choice का उपयोग करें।

दूसरी ओर, mapM string कुछ पूरी तरह से अलग करेगा - यह सभी क्रम में सफल होने के लिए उम्मीद करेगा।

+1

कुंजी = ["वर्ग", "कन्स्ट्रक्टर" ...] कीवर्ड = पसंद $ मानचित्र स्ट्रिंग कुंजी। क्या मैं पारसेक का एक नया संस्करण उपयोग कर रहा हूं? कोई उदाहरण नहीं (Text.Parsec.Prim.Stream s0 m0 char) 'स्ट्रिंग' –

+1

@ डेव के उपयोग से उत्पन्न होता है: इसे एक स्पष्ट प्रकार हस्ताक्षर देने का प्रयास करें। –

+0

आह मैं देखता हूं। धन्यवाद! :) –