iza*_*yoi 11 parsing haskell parsec
我是Haskell的新手,我正在尝试解析表达式.我发现了Parsec,我也发现了一些文章,但我似乎不明白我必须做什么.我的问题是我想给出一个像"x ^ 2 + 2*x + 3"这样的表达式,结果是一个带参数x并返回一个值的函数.如果这是一个简单的问题,我很抱歉,但我真的需要一些帮助.谢谢!我插入的代码来自您可以在此链接上找到的文章.
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"
Run Code Online (Sandbox Code Playgroud)
Cac*_*tus 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 -}
...
Run Code Online (Sandbox Code Playgroud)
我故意省略了一些细节; 希望通过探索缺失的部分,您可以了解有关Haskell的更多信息.
作为下一步,您应该查看Readermonad以便方便地传递变量map vars,并使用Maybe或Error发出错误信号,例如引用未绑定的变量vars或除以零.
| 归档时间: |
|
| 查看次数: |
2318 次 |
| 最近记录: |