Prolog Parser

Prolog Parser

Thu 31 December 2009

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

Tagged as : prolog assembler