Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing Haskell-Happy,数学表达式和变量解析器_Parsing_Haskell_Functional Programming_Happy - Fatal编程技术网

Parsing Haskell-Happy,数学表达式和变量解析器

Parsing Haskell-Happy,数学表达式和变量解析器,parsing,haskell,functional-programming,happy,Parsing,Haskell,Functional Programming,Happy,我正在研究一个快乐的数学表达式和变量解析器。问题是我不知道如何保存变量的值并在以后使用它。有什么想法吗 这是我如何识别表达式和变量赋值的: genExp : exp { $1 } | variable '=' exp { //here I want to save the value of the variable; something like this: insert variables $1 $3, wher

我正在研究一个快乐的数学表达式和变量解析器。问题是我不知道如何保存变量的值并在以后使用它。有什么想法吗

这是我如何识别表达式和变量赋值的:

genExp   : exp                    { $1 }
         | variable '=' exp            { //here I want to save the value of the variable; something like this: insert variables $1 $3, where 'variables' is a Data.Map }
表达式可以包含变量。例如:

a = 2 + 1
a + 2 (now the parser must print 5)

我需要在解析器解析行“a=2+1”时保存变量“a”的值,并在解析器解析行“a+2”时获取变量“a”的值。

您要做的是在表达式求值期间跟踪变量的值,而不是在解析期间。假设您将表达式解析为以下类型:

data Expr = Literal Int | Variable Var | Assign Var Expr | Add Expr Expr | ...
newtype Var = Var String deriving (Ord, Eq, Show)
然后,您可以简单地在求值函数周围传递一个映射,其中包含所有变量的当前值:

import qualified Data.Map as M
import Control.Monad.State

data Expr = Literal Int | Variable Var | Assign Var Expr | Add Expr Expr
newtype Var = Var String deriving (Ord, Eq, Show)

-- Each Expr corresponds to a single line in your language, so
-- a = 2+1
-- a + 2
-- corresponds to
-- [Assign (Var "a") (Add (Literal 2) (Literal 1)),
--  Add (Variable (Var "a")) (Literal 2)]
eval :: [Expr] -> Int
eval es = last $ evalState (mapM eval' es) M.empty -- M.empty :: M.Map Var Int
  where
    eval' (Literal n)  = return n
    eval' (Variable v) = do
      vs <- get
      case M.lookup v vs of
        Just x -> return x
        _      -> error $ "variable " ++ show v ++ " is undefined!"
    eval' (Assign v ex) = do
      x <- eval' ex
      modify (M.insert v x)
      return x
    eval' (Add a b) = do
      x <- eval' a
      y <- eval' b
      return (x+y)
导入符合条件的数据。映射为M
进口控制单体状态
data Expr=Literal Int | Variable Var | Assign Var Expr | Add Expr Expr
newtype Var=Var字符串派生(Ord、Eq、Show)
--每个表达式对应于您的语言中的一行,因此
--a=2+1
--a+2
--对应于
--[分配(变量“a”)(添加(文字2)(文字1)),
--添加(变量(变量“a”)(文字2)]
eval::[Expr]->Int
eval es=last$evalState(mapmeval'es)M.empty--M.empty::M.Map Var Int
哪里
eval'(文本n)=返回n
eval'(变量v)=do
vs返回x
_->错误$“变量”++show v++“未定义!”
eval'(分配v ex)=执行

呃,这个问题不是很清楚。你能换个说法吗?一个代码示例和您试图解决的实际问题也会很好。谢谢。我编辑了我的问题。