odra.16 compiler
A simple compiler, based on this paper: Alain Colmerauer. 1978. Metamorphosis Grammars. In Natural Language Communication with Computers, Leonard Bolc (Ed.). Springer-Verlag, Berlin, Heidelberg, 133-189. Additional information about the program is in the book: Feliks Kluźniak and Stanisław Szpakowicz. Prolog (Polish). Wydawnictwa Naukowo-Techniczne (Warszawa), 1983.
* ********************************************************************** * * * PROGRAM POCHODZI Z PRACY: ALAIN COLMERAUER: * * METAMORPHOSIS GRAMMARS, IN: L BOLC(ED), * * NATURAL LANGUAGE COMMUNICATION WITH COMPUTERS, LECTURE * * NOTES IN COMPUTER SCIENCE VOL 63, SPRINGER VERLAG, 1978^ * * DODATKOWY OPIS PROGRAMU ZNAJDUJE SIE W KSIAZCE: * * F KLUZNIAK,S SZPAKOWICZ: PROLOG,WNT,W DRUKU^ * * * * *********************************************************************. -AJOP(".",1,"X'(X'X)")! ** (0) APPEL DES DIFFERENTES PHASES . +COMPILER -LIGNE -LECTURE(*U)-PRETRAITEMENT(*U,*V) -ANALYSE(*V,*W) -SYNTHESE(*W,*X) -ASSEMBLAGE(*X,*Y) -IMPRESSION(*Y). ** (1) LECTURE DU PROGRAMME SOURCE. +LECTURE(*L.*U) -/ -LUB(*K) -TR(*K.NIL,*L) -SUITELIRE(*L,*U). +SUITELIRE(POINT,NIL) -/. +SUITELIRE(BLANC,*U) -/ -LECTURE(*U). +SUITELIRE(*K,*M.*U) -LU(*L) -TR(*L.NIL,*M) -SUITELIRE(*M,*U). +TR(".",POINT) -/. +TR(" ",BLANC) -/. +TR("*",ETOILE) -/. +TR("(",PGAUCHE) -/. +TR(")",PDROITE) -/. +TR(*K.NIL,*K). ** (2) PRETRAITEMENT DU PROGRAMME SOURCE. +PRETRAITEMENT(*U,*V) -SYNTAXE(UNITES(*V).NIL,*U) -SORTIR(*V). %UNITES(*U.*X) == %UNITE(*U) -/ %ESPACE %UNITES(*X). %UNITES(NIL) ==. %ESPACE == #BLANC -/. %ESPACE ==. %UNITE(EN(*X)) == #*K -CHIFFRE(*K) -/ %CHIFFRES(*U) -UNIV(*X,(*K.*U).NIL). %UNITE(*Y) == #*K -LETTRE(*K) -/ %ALPHANUMS(*U) -UNIV(*X,(*K.*U).NIL)-CHGT(*X,*Y). %UNITE(*K) == #*K. %CHIFFRES(*K.*U) == #*K -CHIFFRE(*K) -/ %CHIFFRES(*U). %CHIFFRES(NIL) ==. %ALPHANUMS(*K.*U) == #*K -ALPHANUM(*K) -/ %ALPHANUMS(*U). %ALPHANUMS(NIL) ==. +ALPHANUM(*K) -LETTRE(*K) -/. +ALPHANUM(*K) -CHIFFRE(*K). +CHGT(*X,*X) -*X -/. +CHGT(*X,ID(*X)). +ALORS. +DEBUT. +ECRIRE. +ET. +FAIRE. +FIN. +INF. +JUSQUA. +LIRE. +NON. +OU. +REPETER. +SI. +SINON. +TANTQUE. +VERS. ** (3) ANALYSE DU PROGRAMME SOURCE. +ANALYSE(*S,*I) -SYNTAXE(PROG(*I).NIL,*S) -/ -SORTIR(*I) .+ANALYSE(*S,*I) -LIGNE -SORM("ERREUR DE SYNTAXE") -LIGNE -IMPASSE. %PROG(*I) == %INST(*I) #POINT. %INST(SUITE.*I.*S) == #DEBUT -/ %INST(*I) %SUITEDINST(*S) #FIN. %INST(AFFEC.*X.*Y) == #ID(*X) #: #= -/ %EXP(ARIT,1,*Y) . %INST(TANTQ.*B.*I) == #TANTQUE -/ %EXP(BOOL,1,*B) #FAIRE %INST(*I). %INST(REPET.*B.*I) == #REPETER -/ %INST(*I) #JUSQUA %EXP(BOOL,1,*B) . %INST(VERS.*X) == #VERS #ID(*X) -/ . %INST(LIRE.*X) == #LIRE #ID(*X) -/. %INST(ECRIRE.*X) == #ECRIRE -/ %EXP(ARIT,1,*X). %INST(*SI.*B.*S) == #SI -/ %EXP(BOOL,1,*B) %RESTESI(*SI,*S) . %INST(ETIQU.*X.*I) == #ID(*X) #: -/ %INST(*I) . %INST(SUITE.NIL) == . %RESTESI(SI1,*I) == #FAIRE -/ %INST(*I). %RESTESI(SI2,*I.*J) == #ALORS%INST(*I) #SINON %INST(*J). %SUITEDINST(*I.*S) == #^ -/ %INST(*I) %SUITEDINST(*S). %SUITEDINST(NIL) ==. %EXP(*T,3,*X) == #PGAUCHE -/ %EXP(*T,1,*X) #PDROITE. %EXP(ARIT,3,*X) == #ID(*X) -/. %EXP(ARIT,3,EN(*X)) == #EN(*X) -/. %EXP(BOOL,3,NON.*B) == #NON -/ %EXP(BOOL,3,*B). %EXP(BOOL,3,*R.*X.*Y) == -/ %EXP(ARIT,1,*X) #*R -RELATION(*R) %EXP(ARIT,1,*Y) . %EXP(*T,*N,*X) == -INF(*N,3) -PLUS(*N,1,*M) %EXP(*T,*M,*Y) -/ %RESTEXP(*T,*N,*Y,*X). %EXP(ARIT,1,*X)==%RESTEXP(ARIT,1,EN(0),*X). +RELATION(=) -/. +RELATION(INF). %RESTEXP(*T,*N,*X,*Z) == #*R -OPERATEUR(*R,*T,*N) -/ -PLUS(*N,1,*M) %EXP(*T,*M,*Y) %RESTEXP(*T,*N,*R.*X.*Y,*Z) . %RESTEXP(*T,*N,*X,*X) ==. +OPERATEUR(OU,BOOL,1) -/. +OPERATEUR(ET,BOOL,2) -/. +OPERATEUR(+,ARIT,1) -/. +OPERATEUR(-,ARIT,1) -/. +OPERATEUR(ETOILE,ARIT,2). ** (4) SYNTHESE DU CODE MACHINE. +SYNTHESE(*I,*S) -SYNTAXE(PRO(*I).NIL,*S) -SORTIR(*S) . %PRO(*I) == %INS(*I,*U.*V.*W) #CODE(STOP) %ALLOCATION(*V) %ALLOCATION(*W). %INS(SUITE.NIL,*D) == -/. %INS(SUITE.*I.*S,*D)==-/%INS(*I,*D)%INS(SUITE.*S,*D). %INS(ETIQU.*X.*I,*U.*V.*W) == #ETIQ(*E) -/ -ADR(*X,*E,*U) %INS(*I,*U.*V.*W) . %INS(AFFEC.*X.*Y,*U.*V.*W) == -/ -ADR(*X,*E,*V) %EXPARIT(*Y,*V.*W) #CODE(RANG.*E) . %INS(TANTQ.*B.*I,*D) == #ETIQ(*E) -/ %SIVA(NON.*B, *F,*D) %INS(*I,*D) #CODE(VERS.*E) #ETIQ(*F) . %INS(REPET.*B.*I,*D) == #ETIQ(*E) -/ %INS(*I,*D) %SIVA(NON.*B,*E,*D). %INS(VERS.*X,*U.*V.*W) == #CODE(VERS.*E) -/ -ADR(*X,*E,*U). %INS(LIRE.*X,*U.*V.*W)==#CODE(LIRE)#CODE(RANG.*E)-/ -ADR(*X,*E,*V). %INS(ECRIRE.*X,*U.*V.*W) == -/ %EXPARIT(*X,*V.*W) #CODE(ECRI). %INS (SI2.*B.*I.*J, *D) == -/ %SIVA( *B, *E, *D ) %INS (*J, *D ) #CODE( VERS.*F ) #ETIQ(*E) %INS (*I,*D) #ETIQ(*F) . %INS(SI1.*B.VERS.*X, *U.*V.*W ) == -/ %SIVA(*B,*E,*U. *V.*W )-ADR(*X,*E,*U). %INS(SI1.*B.*I,*D) == %SIVA(NON.*B,*E,*D) %INS(*I,*D) #ETIQ(*E). %ALLOCATION(NIL) == -/. %ALLOCATION((*X.*E).*U) == #ETIQ(*E) #CODE(ALLO.*Y) -CONTENU(*X,*Y) %ALLOCATION(*U). +CONTENU(EN(*X),*X) -/. +CONTENU(*X,RIEN). %SIVA(OU.*B.*C,*E,*D)==-/%SIVA(*B,*E,*D)%SIVA(*C,*E,*D). %SIVA(ET.*B.*C,*E,*D) == -/%SIVA(NON.*B,*F,*D) %SIVA(*C,*E,*D) #ETIQ(*F) . %SIVA(NON.NON.*B,*E,*D)==-/%SIVA(*B,*E,*D). %SIVA(NON.OU.*B.*C, *E,*D) == -/ %SIVA(ET.(NON.*B).NON.*C,*E , *D). %SIVA(NON.ET.*B.*C,*E,*D) == -/ %SIVA( OU.(NON.*B).NON.*C, *E, *D). %SIVA(NON.*R.*S,*E,*D) == -/%SIVA((NON.*R).*S,*E,*D). %SIVA(*R.*X.*Y,*E,*U.*V.*W) == %EXPARIT(-.*X.*Y,*V.*W) #CODE(*Q.*E) -HOMOLOGUE(*R,*Q). %EXPARIT(*R.*X.*Y,*V.(RIEN.*E).*W) == -COMPLEXE(*Y) -/ %EXPARIT(*Y,*V.(RIEN.*E).*W) #CODE(RANG.*E) %EXPARIT(*X,*V.*W) #CODE(*Q.*E) -HOMOLOGUE(*R,*Q). %EXPARIT(*R.*X.*Y,*V.*W) == -/ -HOMOLOGUE(*R,*Q) -ADR(*Y,*E,*V) %EXPARIT(*X,*V.*W) #CODE(*Q.*E). %EXPARIT(*X,*V.*W) == #CODE(CHAR.*E) -ADR(*X,*E,*V). +COMPLEXE(*R.*X.*Y). +HOMOLOGUE(=,VERZ) -/. +HOMOLOGUE(NON.=,VENZ) -/. +HOMOLOGUE(INF,VERN) -/. +HOMOLOGUE(NON.INF,VENN) -/. +HOMOLOGUE(+,PLUS) -/. +HOMOLOGUE(-,MOIN) -/. +HOMOLOGUE(ETOILE,FOIS). +ADR(*X,*E,(*X.*E).*U) -/. +ADR(*X,*E,(*Y.*F).*U) -ADR(*X,*E,*U). ** (5) ASSEMBLAGE DU CODE MACHINE. +ASSEMBLAGE(*X,*U) -ASS(*X,*U,0). +ASS(ETIQ(*N).*X,*U,*N) -/ -ASS(*X,*U,*N). +ASS(CODE(*C).*X,*C.*U,*N) -/ -PLUS(*N,1,*M) -ASS(*X,*U,*M). +ASS(NIL,NIL,*N) -/. +ASS(*X,*U,*N) -SORM("ERREUR% 2 FOIS LA MEME ETIQUETTE") -LIGNE -IMPASS. ** (6) IMPRESSION FINALE. +IMPRESSION(*X) -LIGNE -IMP(0,*X) -LIGNE -LIGNE. +IMP(*N,*X.*Y) -/ -SORT(*N) -SORM(" ") -SORT(*X) -LIGNE -PLUS(*N,1,*M) -IMP(*M,*Y). +IMP(*N,NIL) -SORT(*N) -SORM(" END ") -LIGNE. ** (7) IMPRESSION DE RESULTATS INTERMEDIAIRES. +TRACE -SUPP(+(OK).NIL) -/. +TRACE -AJOUT(+(OK).NIL). +SORTIR(*X) -OK -/ -LIGNE -SORT(*X) -LIGNE. +SORTIR(*X). -TRACE! -COMPILER! DEBUT LIRE N^ LIRE M^ SI NON N=5 ET(M INF 10 OU M=50) ALORS ECRIRE 0 SINON ECRIRE (2+N)*(10+M) FIN. -TRACE! -COMPILER! DEBUT LIRE N^ SI 10 INF N FAIRE VERS TROPGRAND^ I:= 0^ F:= 1^ TANTQUE I INF N FAIRE DEBUT I:= I+1^ F:= I*F FIN^ ECRIRE F^ TROPGRAND: FIN. -COMPILER! DEBUT FLAG:= 1^ TANTQUE NON FLAG = 0 FAIRE DEBUT LIRE M^ LIRE N^ SI M = 0 OU N = 0 ALORS FLAG:= 0 SINON TANTQUE NON M = N FAIRE DEBUT TANTQUE M INF N FAIRE N:= N-M^ K:= N^ N:= M^ M:= K FIN^ SI FLAG = 1 FAIRE ECRIRE M FIN FIN. -COMPILER! DEBUT ZERUJ: WYNIK:= 0^ CZYTAJ: LIRE OPERATOR^ LIRE LICZBA^ SKOCZ: SI OPERATOR=0 ALORS VERS KONIEC SINON SI OPERATOR=1 ALORS VERS DODAJ SINON SI OPERATOR =2 ALORS VERS ODEJMIJ SINON SI OPERATOR = 3 ALORS VERS POMNOZ SINON SI OPERATOR = 4 ALORS VERS PODZIEL SINON SI OPERATOR=5 ALORS VERS WYPISZ SINON DEBUT ECRIRE WYNIK^ ECRIRE -9999^ ECRIRE 0^ ECRIRE 9999^ VERS END FIN^ WYPISZ: ECRIRE WYNIK^ VERS ZERUJ^ DODAJ: WYNIK:= WYNIK+LICZBA^ VERS CZYTAJ^ ODEJMIJ: WYNIK:= WYNIK-LICZBA^ VERS CZYTAJ^ POMNOZ: WYNIK:= WYNIK*LICZBA^ VERS CZYTAJ^ PODZIEL: DEBUT ECRIRE WYNIK^ ECRIRE -8888^ ECRIRE 0^ ECRIRE 8888^ VERS END FIN^ SI LICZBA = 0 FAIRE SI WYNIK INF 0 ET LICZBA INF 0 OU 0 INF WYNIK ET 0 INF LICZBA ALORS ZNAK:= 1 SINON ZNAK:= -1^ SI WYNIK INF 0 FAIRE WYNIK:= -WYNIK^ SI LICZBA INF 0 FAIRE LICZBA:= -LICZBA^ ILORAZ:= 0^ TANTQUE (ILORAZ+1)*LICZBA INF WYNIK FAIRE ILORAZ:= ILORAZ+1^ WYNIK:= ILORAZ^ SI ZNAK INF 0 FAIRE WYNIK:= -WYNIK^ VERS CZYTAJ^ KONIEC : ECRIRE WYNIK^ ECRIRE 1111^ ECRIRE 2222^ ECRIRE -1111^ END: FIN. -TTY!