DCG, дясна рекурсия и как да я изразим ясно

Прочетох много от предложените въпроси, но все още съм заседнал с проблема си с обучението в момента, опитвам се да напиша прост анализатор на s-израз на Lisp и не мога да разбера как да се справя с рекурсивния характер на 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 и ситуации като тази.

Благодаря, Шон.


person Emacs The Viking    schedule 13.09.2013    source източник


Отговори (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' страница.

person CapelliC    schedule 13.09.2013
comment
това е страхотна връзка, както и просветляващ отговор. Ще го разгледам внимателно, когато се прибера и ще видя как ще ми помогне. Благодаря! :) - person Emacs The Viking; 13.09.2013
comment
CapelliC, пак съм на път!!! Благодаря. Свършихме работата с отговора. Обичам SO! :) - person Emacs The Viking; 13.09.2013