2011-01-17 11 views
11

में पार्सिंग फ़ंक्शन मैं हास्केल के लिए नया हूं और मैं अभिव्यक्तियों का विश्लेषण करने की कोशिश कर रहा हूं। मुझे पारसेक के बारे में पता चला और मुझे कुछ लेख भी मिले लेकिन मुझे समझ में नहीं आता कि मुझे क्या करना है। मेरी समस्या यह है कि मैं "x^2 + 2 * x + 3" जैसी अभिव्यक्ति देना चाहता हूं और परिणाम एक ऐसा फ़ंक्शन होता है जो तर्क x लेता है और एक मान देता है। मुझे बहुत खेद है अगर यह एक आसान सवाल है लेकिन मुझे वास्तव में कुछ मदद की ज़रूरत है। धन्यवाद! मैंने जो कोड डाला है वह आलेख से है जिसे आप this link पर पा सकते हैं।हैकेल

import Control.Monad(liftM) 
import Text.ParserCombinators.Parsec 
import Text.ParserCombinators.Parsec.Expr 
import Text.ParserCombinators.Parsec.Token 
import Text.ParserCombinators.Parsec.Language 

data Expr = Num Int  | Var String | Add Expr Expr 
      | Sub Expr Expr | Mul Expr Expr | Div Expr Expr 
      | Pow Expr Expr 
      deriving Show 

expr :: Parser Expr 
expr = buildExpressionParser table factor 
    <?> "expression" 

table = [[op "^" Pow AssocRight], 
     [op "*" Mul AssocLeft, op "/" Div AssocLeft], 
     [op "+" Add AssocLeft, op "-" Sub AssocLeft]] 
    where 
     op s f assoc 
      = Infix (do{ string s; return f}) assoc 
factor = do{ char '(' 
     ; x <- expr 
     ; char ')' 
     ; return x} 
    <|> number 
    <|> variable 
    <?> "simple expression" 

number :: Parser Expr 
number = do{ ds<- many1 digit 
     ; return (Num (read ds))} 
    <?> "number" 

variable :: Parser Expr 
variable = do{ ds<- many1 letter 
     ; return (Var ds)} 
    <?> "variable" 
+0

मेरे पास कुछ लेख हैं जो मुझे कुछ लेखों में मिला है लेकिन यह पोस्ट करना ठीक है, भले ही यह मेरा नहीं है? – izayoi

+0

कृपया इसे पोस्ट करें क्योंकि अन्य इसे भी उपयोगी पा सकते हैं। मूल स्रोत के लिए एक लिंक शामिल करना सुनिश्चित करें। –

उत्तर

13

यह चर के साथ अभिव्यक्तियों के लिए सिर्फ एक पार्सर है। वास्तव में अभिव्यक्ति की व्याख्या करना एक पूरी तरह से अलग मामला है।

आपको एक ऐसा फ़ंक्शन बनाना चाहिए जो पहले से पार्स किए गए अभिव्यक्ति और चर के लिए मान लेता है, और अभिव्यक्ति का मूल्यांकन करने का परिणाम देता है। स्यूडोकोड:

evaluate :: Expr -> Map String Int -> Int 
evaluate (Num n) _ = n 
evaluate (Var x) vars = {- Look up the value of x in vars -} 
evaluate (Plus e f) vars = {- Evaluate e and f, and return their sum -} 
... 

मैंने जानबूझकर कुछ विवरण छोड़े हैं; उम्मीद है कि लापता हिस्सों की खोज करके, आप हास्केल के बारे में और जानेंगे।

अगले कदम के रूप, तो आप शायद Reader इकाई पर चारों ओर चर नक्शा vars पारित करने के लिए एक सुविधाजनक तरीका के लिए दिखना चाहिए, और Maybe या Error का उपयोग कर, त्रुटियों संकेत करने के लिए उदा एक वेरिएबल का संदर्भ देना जो vars, या शून्य से विभाजन में बाध्य नहीं है।