Я все еще работаю над крошечным парсером для крошечного языка, определенного в школьном задании. Парсер, который генерирует 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 будет 5 в * (2, X)». 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. А нижняя часть «Просто 24» - это оценка. Для которого я вернусь сюда за дополнительной помощью.
Примечание. Смысл в том, чтобы выложить первую несвязанную переменную, найденную как ошибку, и '', если все в порядке. Очевидно, что если вы хотите сделать это по-другому, вы можете.