Prolog Compiler: Dictionary Lookup and Code Generation

Computer science3.6 KB

Dictionary Lookup

lookup(Nom,dic(Nom,Value,_,_),Value):-!.
lookup(Nom,dic(X,_,L,_),Value):-Nom@<X,lookup(Nom,L,Value).
lookup(Nom,dic(X,_,_,R),Value):-Nom@>X,lookup(Nom,R,Value).

Operator Mappings

Constant Operators

opc(+,addc).
opc(-,subc).
opc(*,mulc).
opc(/,divc).

Expression Operators

opx(+,add).
opx(-,sub).
opx(*,mul).
opx(/,div).

Jump Operators

opj(=,jumpne).
opj(<,jumpge).
opj(>,jumplt).

Expression Encoding

encodeexpr(const(X),_,instr(loadc,X)).
encodeexpr(name(X),D,instr(load,Adress)):-lookup(X,D,Adress).

encodeexpr(expr(Op,Ex,const(Y)),D,(Ins;instr(Type,Y))):-
encodeexpr(Ex,D,Ins),
opc(Op,Type).

encodeexpr(expr(Op,Ex,name(Y)),D,(Ins;instr(Type,Adress))):-
encodeexpr(Ex,D,Ins),
opx(Op,Type),
lookup(Y,D,Adress).

Test Encoding

encodetest(test(OpJ,Arg1,Arg2),D,JumpLabel,(Ecode;instr(Type,JumpLabel))):-
encodeexpr(expr(-,Arg1,Arg2),D,Ecode),
opj(OpJ,Type).

Statement Encoding

Assignment

encodestatement(assign(name(X),Expr),D,(E_code;instr(store,Addres))):-
lookup(X,D,Addres),
encodeexpr(Expr,D,E_code).

If Statement

% IF (testcode)
% thencode;
% JUMP label2;
% label1: elsecode;
% label2: ...
encodestatement(if(Test,Then,Else),D,(Testcode;Thencode;instr(jump,L2);label(L1);Elsecode;label(L2))):-
encodetest(Test,D,L1,Testcode),
encodestatement(Then,D,Thencode),
encodestatement(Else,D,Elsecode).

While Statement

% label2: IF (testcode)
% thencode
% JUMP label2
% label1: ...
encodestatement(while(Test,Then),D,(label(L2);Testcode;Thencode;instr(jump,L2);label(L1))):-
encodetest(Test,D,L1,Testcode),
encodestatement(Then,D,Thencode).

Read and Write

encodestatement(read(name(X)),D,instr(read,Addres)):-lookup(X,D,Addres).
encodestatement(write(Expr),D,(Ecode;instr(write,0))):-encodeexpr(Expr,D,Ecode).

Sequence

encodestatement((S1;S2),D,(Code1;Code2)):-encodestatement(S1,D,Code1),encodestatement(S2,D,Code2).

Assembly

assemble(label(N),N,N).
assemble(instr(_,_),N0,N):-N is N0+1.
assemble((Code1;Code2),N0,N1):-assemble(Code1,N0,M),assemble(Code2,M,N1).

Memory Allocation

allocate(void,N,N):-!.
allocate(dic(_,N1,Before,After),N0,N):-
allocate(Before,N0,N1),
N2 is N1+1,
allocate(After,N2,N).

Output Printing

% funcion que printa bonico
print_instr(label(N)):-write('label'),write(N),nl.
print_instr(instr(I,N)):-write(I),write(' '),write(N),nl.
print_instr((Code1;Code2)):-print_instr(Code1),print_instr(Code2).

Compilation

compile(Source,(Code;instr(halt,0);block(L))):-
encodestatement(Source,D,Code),
assemble(Code,1,N0),
N1 is N0+1,
allocate(D,N1,N),
print_instr(Code),
L is N-N1,
write('halt'),write(' '),write('0'),nl,
write('block'),write(' '),write('1'),nl.

Download

PDF Word HTML