【发布时间】:2018-05-28 08:30:26
【问题描述】:
我正在尝试在 Haskell 中编写一个 lisp 解释器,灵感来自 Python 中的 Norvig (http://norvig.com/lispy.html)。我有一个成功的标记器,如果需要,我可以链接到它。在这里,它将正确的代码输出到 Norvig 的 Python 分词器。
program = "(begin (define r 10) (* pi (* r r)))"
astTokenized = tokenize program
astTokenized == ["(","begin","(","define","r","10",")","(","*","pi","(","*","r","r",")",")",")"]
在这里我定义了我的抽象语法树数据类型,虽然我知道它已经有一些隐含的错误,因为它没有包含在列表中。
data Ast x = Val x | Node [Ast x] deriving (Show)
这是我的第一次尝试:
parse :: [[Char]] -> [Ast [Char]]
parse (x:xs)
| x == "(" = [Node (parse xs)]
| x == ")" = []
| otherwise = (Val x) : parse xs
希望,除了它在第一个 ')' 之后终止。
Prelude> parse astTokenized
[Node [Val "begin",Node [Val "define",Val "r",Val "10"]]]
在这里,我更改了 [] 的基本情况,并调整了 ')' 的条件,因此它将解析整个输入终止,但现在它只是创建了更深的树,因此无法正确分支。
parse [] = []
parse (x:xs)
| x == "(" = [Node (parse xs)]
| x == ")" = parse xs
| otherwise = (Val x) : parse xs
Prelude> parse astTokenized
[Node [Val "begin",Node [Val "define",Val "r",Val "10",Node [Val "*",Val "pi",Node [Val "*",Val "r",Val "r"]]]]]
在某种程度上,它需要允许“平行”树,而不仅仅是嵌套。任何帮助将不胜感激。
【问题讨论】:
标签: parsing haskell compilation