【问题标题】:DCG, right-recursion and how to express it clearlyDCG,右递归以及如何清楚地表达它
【发布时间】:2013-09-17 19:00:33
【问题描述】:

我已经阅读了很多建议的问题,但我现在仍然被我的学习问题所困扰,我正在尝试编写一个简单的 Lisp s 表达式解析器,但我不知道如何解决 s 的递归性质- 表达不会让我的大脑陷入困境!

这就是我所拥有的,输入是来自我的词法分析器模块的源文件的标记化术语列表,可以正常工作:(顺便说一下 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]).

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

[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 和类似情况的理解。

谢谢, 肖恩。

【问题讨论】:

    标签: recursion prolog grammar dcg


    【解决方案1】:

    我认为您缺少列表!尝试(未经测试)

    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'page 获得。

    【讨论】:

    • 这是一个很好的链接,也是一个有启发性的答案。当我回到家时,我会仔细研究它,看看它对我有什么帮助。谢谢! :)
    • CapelliC,我又上路了!!!谢谢。完成与答案的业务。我喜欢! :)
    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2011-03-18
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多