2011-01-17 17 views
11

私はHaskellを初めて使っていて、式を解析しようとしています。私はParsecについて知りましたが、いくつかの記事も見つかりましたが、私は自分が何をしなければならないか分かりません。私の問題は、 "x^2 + 2 * x + 3"のような式を与え、結果を引数xをとり値を返す関数にしたいということです。簡単な質問であれば大変申し訳ありませんが、本当に助けが必要です。ありがとう!私が挿入したコードは、this linkにある記事のものです。haskellの解析関数

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 -} 
... 

私は意図的にいくつかの詳細を省略しました。うまくいけば、欠けている部分を調べることによって、あなたはHaskellについてもっと学びます。

次のステップとして、あなたはおそらく周りの変数マップvarsを渡すための便利な方法のためにReaderモナドを見なければならない、と例えば、エラーを通知するためにMaybeErrorを使用してvarsに束縛されていない変数を参照するか、0で除算します。