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