% Left-Corner-Parsing ohne Links % Simon Clematide "Programmiertechniken in der Computerlinguistik II" Sommer 2005 % Unterlagen dazu im Skript /* Beispielaufrufe lcp(s, [a,man,sleeps]-[]). verbose_lcp(s, [a,man,sleeps]-[]). Hinweis: Der geschwaetzige Parser gibt die gemachten Schritte erst aus, nachdem eine Analyse gefunden wurde. Falls er keine findet, gibt's auch keinerlei Infos ueber die gemachten Schritte :-( */ lcp(C, [Word|Rest]-RestDiff) :- word(Word, LC), complete(LC, C, Rest-RestDiff). complete(C, C, S-S). complete(LC, C, S-Rest) :- rule(LHS, [LC|Sisters]), lcp_sisters(Sisters, S-SistersRest), complete(LHS, C, SistersRest-Rest). lcp_sisters([], S-S). lcp_sisters([C|Cs], S-Rest) :- lcp(C, S-SisterRest), lcp_sisters(Cs, SisterRest-Rest). /*** Grammatik ***/ word(a, det). word(man, n). word(sleeps, v). rule(s, [np, vp]). rule(np, [det,n]). rule(vp, [v]). /* Definitionen fuer geschwaetzigen Parser Aengstliche bitte wegschauen... */ :- use_module(library(lists)). verbose_lcp(C, S) :- lcp(C, S, I), write_infos(I). lcp(C, [Word|S2]-S, [[accept,Word,K]|Info]) :- word(Word, K), complete(K, C, S2-S, Info). lcp(C, S2-S, [[epsilon,LHS,C]|Info]) :- rule(LHS, []), lc_link(LHS, C), complete(LHS, C, S2-S, Info). complete(C, C, S-S, [[completed,C]]). complete(LC, C, S1-S, [[complete,P,LC,Rest]|Info]) :- rule(P, [LC|Rest]), lc_sisters(Rest, S1-S2, SysInfo), complete(P, C, S2-S,CInfo), append(SysInfo,CInfo,Info). lc_sisters([C|Cs], S1-S, I) :- lcp(C, S1-S2, LCPI), lc_sisters(Cs, S2-S,IS), append(LCPI,IS, I). lc_sisters([], S-S, []). write_infos([]). write_infos([[completed,C]|Rest]) :- format("COMPLETED: ~p~n", [C]), write_infos(Rest). write_infos([[complete, P, LC, Sisters]|Rest]) :- format("COMPLETE LC: ~p SISTERS: ~p LHS: ~p~n", [LC,Sisters, P]), write_infos(Rest). write_infos([[accept, W, C]|Rest]) :- format("ACCEPT WORD: ~p CATEGORY: ~p~n", [W,C]), write_infos(Rest). write_infos([[epsilon, LHS, C]|Rest]) :- format("APPLY EPSILON: ~p --> eps WHILE PARSING: ~p~n", [LHS,C]), write_infos(Rest).