私はまだ学校のタスクで定義された小さな言語のための小さなパーサーに取り組んでいます。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)
有効な文は「*(2、X)でXを5にする」です。Xは通常Varであり、5は通常intです。そして最後はdataExprタイプの任意の部分にすることができます。要点:Xは最後の式のどこかで使用されています。letのデータ型は次のとおりです。
Let Expr Expr Expr
このタスクについて私が尋ねた他の質問へのリンクは、参考までにここにあります。 最初の質問 2番目の質問
ご覧のとおり、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)から始まる2番目の部分は、checkVars関数の入力であるASTです。そして下の部分「Just24」は評価です。私はもっと助けを求めてここに戻ってきます。注:重要なのは、エラーとして最初に見つかったバインドされていない変数を吐き出すことです。すべてが正常な場合は''です。明らかに、これを別の方法で実行したい場合は、可能です。