我仍在为学校任务中定义的一种微小语言开发一个微小的解析器。生成 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
链接到我在此处询问的有关此任务的其他问题,仅供参考; 第一个问题 第二个问题
如您所见,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”是评价。我会回到这里寻求更多帮助。注意:重点是将找到的第一个未绑定变量作为错误吐出,如果一切正常,则吐出''。显然,如果你想以另一种方式做到这一点,你可以。