Haskell解析表达式

iIl*_*ion 0 parsing haskell expression

嗨,我得到了这样的代码:

data Digit = Zero | One | Two | Three | Four | Five | Six | Seven | Eight | 
             Nine 
             deriving (Eq, Show)

data Number = Single Digit | Many Digit Number deriving (Eq, Show)

data Expr = Lit Number
          | Sub Expr   
          | Sum Expr Expr 
          | Mul Expr Expr
          deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)

因此,使用此代码的想法是使用一个字符串,例如* + 2 3 * 2 + 6 - 2,将表示为((2 + 3) * (2 * (6 - 2))),然后使用它将字符串的部分放在那里的类型中.当然最后找到结果,在这种情况下40.问题是我对解析知之甚少,所以我真的不知道如何解析这样的表达式.我已经看到了一些简单的解析,其中字符串被解析为类型,如人或类似的东西.但我认为这有点复杂.如果有人有任何建议,我会非常感兴趣.

ama*_*loy 6

虽然Haskell存在复杂的解析库,并且对于这个任务非常有用,但是你的输入格式非常简单,以至于手动解析并不太强烈,使用递归函数来消耗输入并返回解析后的表达式和其余部分.要继续解析的字符串.

这是它的外观骨架:

parse :: String -> (String, Expr)
parse (' ':more) = parse more
parse ('-':more) = let (remainder, e) = parse more
                   in (remainder, Sub e)
parse ('+':more) = undefined -- TODO
parse ('*':more) = undefined -- TODO
parse s@(num:more) | isDigit num = parseNumber s
parse s = error ("unexpected input: " ++ s)

parseNumber :: String -> (String, Expr)
parseNumber s = undefined
Run Code Online (Sandbox Code Playgroud)

  • 关于monadic解析概念的一个很好的介绍是[Functional Pearls Paper](http://www.cs.nott.ac.uk/~pszgmh/pearl.pdf) (2认同)