DCG,右递归以及如何清楚地表达它

时间:2013-09-13 07:13:57

标签: recursion prolog grammar dcg

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

这是我所拥有的,输入是来自我的lexer模块的源文件中的标记化术语列表,工作正常:(顺便说一下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和这样的情况。

谢谢, 肖恩。

1 个答案:

答案 0 :(得分: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([]) --> [].

然后查看Markus Triska提供的Lisprolog page