1

我已经阅读了很多建议的问题,但我现在仍然被我的学习问题所困扰,我正在尝试编写一个简单的 Lisp s-expression 解析器,但我无法弄清楚如何在没有 s-expression 的情况下解决递归性质把我的大脑打成结!

这是我所拥有的,输入是来自我的词法分析器模块的源文件中的标记化术语列表,它工作正常:(顺便说一句,GNU Prolog)

lisp_term(T) -->
        (
     null(T)
        ;
         token(T)
        ;
         sexp_open(_), lisp_term(T2), sexp_close(_), {T = lnode(T2)}
        ).

lisp_term(T) --> [], {T=end}.


sexp_open(Pos)  --> [popen(Pos)].
sexp_close(Pos) --> [pclose(Pos)].

token(token(Pos,Token)) --> [token(Pos,Token)].

null(null(Pos1)) --> [popen(Pos1), pclose(_)].

这是我的调用代码...

lisplex('../test.lisp',X),
lexpp(X),
phrase(lisp_term(A), X, Y),
format("Result:    ~w~n", [A]),
format("Remainder: ~w~n", [Y]).

词法分析器的输出是这样的列表,来源:“(你好)”

[popen(pos(1,1)),token(pos(1,2),[h,e,l,l,o]),pclose(pos(1,7))]

我不断地试图弄清楚如何处理这样的表达式:

(defun whizzle (a1 b2)
    (munge (* 10 a1) (+ b2 a1)))

也就是说,一般如何处理将词法分析器流变成解析树。您可以看到我的 DCG 规则正在尝试这样做。

我真的很感激一些帮助和指向好东西的阅读或关于如何更好地理解处理右递归情况的建议。我已经自学 Prolog 几个月了,并且非常喜欢它,但我坚持能够继续我对 DCG-s 和类似情况的理解。

谢谢,肖恩。

4

1 回答 1

2

我想你错过了名单!尝试(未经测试)

lisp_term(T) --> token(T).
lisp_term(lnode(T)) -->
     sexp_open(_), lisp_list(T), sexp_close(_).

lisp_list([H|T]) -->
     lisp_term(H), lisp_list(T).
lisp_list([]) --> [].

然后看看Lisprolog,可从 Markus Triska 的页面获得。

于 2013-09-13T10:25:09.170 回答