Prolog Parser
En parser skrevet i Prolog.
%%%%%%%%%%%%%%%%% %Kristian Botnen% %%%%%%%%%%%%%%%%%
% Parserar tal digit(D) --> [D], { code_type(D, digit) }. %digits([D|T]) --> digit(D), !, digits(T). %digits([]) --> []. %integer(I) --> digit(D0), digits(D), { number_chars(I, [D0|D]) }.
% Parserar bokstav letter(L) --> [L], { code_type(L, alnum) }. % Parserar bokstavar letters([L|R]) --> letter(L), letters(R). letters([]) --> []. % Parserar en tag tagStart(tagNavn(N)) --> letter(L), letters(R), { atom_codes(N, [L | R]) }. tagStopp(tagNavn(N)) --> letter(L), letters(R), { atom_codes(N, [L | R]) }. % Parserar det som staar i mellom en tag, altaa nvnet paa den tagKropp(info(I)) --> letter(L), letters(R), { atom_codes(I, [L | R]) }. tagKropp(innhold([I])) --> expression(I). tagKropp(innhold([I0 | I])) --> expression(I0), expression(I). tagKropp([]) --> []. % Parserar eit gyldig uttrykk som er bygd opp av delane over expression(tag(T, [R])) --> "<", tagStart(T), ">", tagKropp(R), "". expression([]) --> []. % Evaluerar eit gyldig uttrykk, dvs skriv det fint ut paa skjermen i dette tilfellet :) evaluer(tag(T, [R])) :- evaluer(T), write('('), evaluer(R), write(')'). evaluer(tagNavn(T)) :- write(T). evaluer(innhold([T | R])) :- evaluer(T), evaluer(R). evaluer(info(T)) :- write(T). evaluer([]) :- []. % Test ting for aa sleppe aa skrive saa mykje kvar einaste gong, veldig kjekt :) %testing :- explode('test.txt', T), phrase(expression(E), T, H), evaluer(E). % Testing testing, her med to argument testing(File, L) :- explode(File, L). % Denne tar seg av aa lese inn ei fil, var opppgitt i oppgaava explode(File, L) :- !, see(File), next(File, L), seen. next(File, L) :- get(H), (H is -1 -> L=[]; L=[H|T], next(File, T)).
% Testdata
Strandgaten 2a
% Scriptlog av parsering av testfila Script started, file is morten.txt s1623@havengel> pl Welcome to SWI-Prolog (Version 4.0.9) Copyright (c) 1990-2000 University of Amsterdam. Copy policy: GPL-2 (see www.gnu.org)
For help, use ?- help(Topic). or ?- apropos(Word).
?- [o]. Warning: (/Home/sstud3/s1623/haust03/i121/oblig3/o.pl:30): Singleton variables: [H] % o compiled 0.00 sec, 5,888 bytes
Yes ?- testing. adress(streetname(Strandgaten)housenumber(2a))
Yes ?- % halt s1623@havengel> script stop
|