小编Mic*_*rry的帖子

Haskell中用于简单语言的AST的良好类型设计

我是Haskell的新手,正在研究Haskell LLVM教程.在其中,作者定义了一个简单的代数数据类型来表示AST.

type Name = String

data Expr
  = Float Double
  | BinOp Op Expr Expr
  | Var String
  | Call Name [Expr]
  | Function Name [Expr] Expr
  | Extern Name [Expr]
  deriving (Eq, Ord, Show)

data Op
  = Plus
  | Minus
  | Times
  | Divide
  deriving (Eq, Ord, Show)
Run Code Online (Sandbox Code Playgroud)

但是,这不是一个理想的结构,因为解析器实际上期望Expr一个Externwill 中的列表只包含表示变量的表达式(即在这种情况下的参数不能是任意表达式).我想让类型反映这个约束(使用QuickCheck更容易生成随机有效的AST); 但是,为了解析器函数(所有类型都有Parser Expr)的一致性,我不只是想说| Expr Name [Name].我想做这样的事情:

data Expr
  = ...
  | Var String
    ...
  | Function Name [Expr] Expr …
Run Code Online (Sandbox Code Playgroud)

parsing haskell parsec

5
推荐指数
1
解决办法
296
查看次数

标签 统计

haskell ×1

parsec ×1

parsing ×1