【发布时间】:2019-10-04 07:01:14
【问题描述】:
我是 Haskell 的新手,正在做一个任务,我正在尝试为一种简单的计算器语言制作解析函数。
我得到了一个语法,我不能改变它。我试图通过遍历字符串并递归地使用我的解析函数来解决它。
语法应该是
Expr -> Int | -Expr | + Expr Expr | * Expr Expr
Int -> Digit | Digit Int
Digit -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
所以我的函数将 Expr 语言中的字符串作为参数,并以这种格式生成抽象语法树
data Ast = Tall Int | Sum Ast Ast | Mult Ast Ast| Min Ast| Var String deriving (Eq, Show)
Ast 应该是一个抽象语法树
这就是我到目前为止在解析函数中得到的结果
parseEx :: [String] -> (Ast, [String])
parseEx [] = error "empty string"
parseEx (s:ss) | all isDigit s = (Tall (read s), ss)
| s == "-" = let (ast, ss') = parseEx ss in (Min ast, ss')
| s == "+" = let (ast, ss'), let(ast',ss'') = parseEx ss in (Sum ast ast', ss') parseEx ss' (ast', ss'')
| s == "*" = (Mult ast ast', ss'') where
(ast, ss'') = parseEx ss'
(ast', ss''') = parseEx ss''
我可以清楚地看到+ 的条件是错误的,我不能有两个let。我也有点迷失在所有这些列表中。我在想map-function 可能是我的问题的解决方案,也许它会让我的代码看起来更整洁。但我不确定如何开始,因为它必须采用[String]->Ast 的形式。简单地坚持我拥有的代码并尝试使其工作更容易吗?
【问题讨论】:
-
@n.m.好点子。 Vpe,你能澄清一下这种语言的输入字符串应该是什么样子吗?
-
@luqui 显然它确实应该是波兰符号的前缀。奇怪的。这是一种非常容易解析的语言,但不是最容易使用的语言。
-
抱歉不清楚。例如,输入可能看起来像“+ 5 6”,所以是的,我想它是前缀波兰表示法。我不知道这个词,所以谢谢你:)
标签: string parsing haskell abstract-syntax-tree