1

私は提案された質問をたくさん読みましたが、今でも学習の問題に悩まされています。単純な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]).

lexer からの出力は、次のようなリストです。ソース: "(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 やこのような状況についての理解を進めることができずに困っています。

ありがとう、ショーン。

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([]) --> [].

次に、Markus Triska のページから入手できるLisprologを見てください。

于 2013-09-13T10:25:09.170 に答える