【发布时间】:2009-10-07 22:17:22
【问题描述】:
我仍在为学校任务中定义的一种小型语言开发一个小型解析器。生成 AST(抽象语法树)的解析器正在工作。我想要的是检查定义的变量,它们必须以 let 表达式为界。首先是任务中定义的方法(建议,不需要):
checkVars :: Expr -> Char
data Expr = Var Char | Tall Int | Sum Expr Expr | Mult Expr Expr | Neg Expr | Let Expr Expr Expr
deriving(Eq, Show)
一个有效的句子应该是“让 X 在 *(2,X) 中为 5”。 X 通常是 Var 而 5 通常是 int。最后一个可以是 dataExpr 类型的任何部分。要点:X 用在最后一个表达式的某处。 let 的数据类型是:
Let Expr Expr Expr
链接到我在此处询问的有关此任务的其他问题,仅供参考; First question Second question
正如您看到的 checkVars 的数据类型是 Expr,所以这里是我将提供给该函数的示例:
parseProg "let X be 4 in let Y be *(2 , X) in let Z be +(Y , X) in
+(+(X , Y) , Z)"
Let (Var 'X') (Tall 4) (Let (Var 'Y') (Mult (Tall 2) (Var 'X')) (Let
(Var 'Z') (Sum (Var 'Y') (Var 'X')) (Sum (Sum (Var 'X') (Var 'Y')) (Var
'Z'))))
Just 24
这是一个包罗万象的示例,顶部是正在解析的字符串/程序。第二部分,从第 3 行(Let)开始是 AST,是 checkVars 函数的输入。而底部“Just 24”是评价。我会回到这里寻求更多帮助。 注意:重点是将找到的第一个未绑定变量作为错误吐出,如果一切正常,则吐出''。显然,如果您想以其他方式执行此操作。
【问题讨论】:
-
我这周因为生病而错过了研讨会,如果组长回复他的电子邮件,他回复的速度很慢。
标签: parsing haskell interpreter evaluation