Personal tools
Document Actions

odra.16 compiler

by Paul McJones last modified 2019-05-20 16:52

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!


« October 2024 »
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
 

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: