gpt4 book ai didi

haskell - Haskell递归问题,微小的解析器。否定Expr和let表达式

转载 作者:行者123 更新时间:2023-12-02 04:18:08 24 4
gpt4 key购买 nike

data Expr =  Var Char | Tall Int | Sum Expr Expr | Mult Expr Expr | Neg Expr | Let Expr Expr Expr
deriving(Eq, Show)

parseExpr :: String -> (Expr, String)

parseExpr ('*':'(':s) = (Mult x y, s'')
where (x,',':s') = parseExpr s
(y,')':s'') = parseExpr s'
parseExpr ('+':'(':s) = (Sum x y, s'')
where (x,',':s') = parseExpr s
(y,')':s'') = parseExpr s'
parseExpr (x : xs) | isDigit x = (Tall (digitToInt x), xs)
parseExpr (x:s) = (Var x,s)
where x >= 'A' = True
x <= 'Z' = True

我的解析器在完成之前缺少两件事。从上面的数据类型开始,其缺少“Neg Expr”,而让“Expr Expr Expr”。第一部分将是这样的:
parseExpr('-' 
parseExpr('l':'e':'t':x:'b':'e

与数据类型一样,Let表达式以let开头,并接受三个Expr。
我不知道如何写出这些最后的函数。任何帮助将不胜感激。

我确实在这里就此问题提出了另一个问题, here是该问题的链接。

这是一个例子:
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'))))

最佳答案

表达式的这些部分的基本策略与其他操作相同,只是您不必解析两个子表达式,而只需解析一个或三个。对于let,它看起来像这样:

parseExpr ('l':'e':'t':s) = (Let x y z, s3)
where (x, 'b':'e':s1) = parseExpr s
(y, 'i':'n':s2) = parseExpr s1
(z, s3) = parseExpr s2

如果字符串以字母 let开头,则采用剩余的字符串( s)并尝试从中解析一个表达式。这将导致一个表达式( x)和一个剩余的字符串。我们希望剩余的字符串以字母 be开头。由于应该在其后跟随另一个表达式,因此我们再次将此字符串的其余部分( s2)提供给parseExpr来解析另一个表达式。等等。

唯一的问题是,我们不考虑可能将这些关键字(如“let”和“be”)与周围的表达式分隔开的空格。一种简单的解决方案是在这些关键字之前/之后仅需要一个空格,并更改parseExpr中的模式以明确包括这些关键字,例如:
    where (x, ' ':'b':'e':' ':s1) = parseExpr s

更加灵活的方法是添加一个 dropSpaces :: String -> String函数,该函数删除前导空格并在适当的位置被调用。

关于haskell - Haskell递归问题,微小的解析器。否定Expr和let表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1524582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com