This Scala project provides an AST-based Interpreter and a TAM Bytecode Compiler for the PL/0 Programming Language by Niklaus Wirth.
In a Nutshell, this implementation supports the following concepts:
- Lexical Scoping
- Nested Procedures
- Forward References for Procedure declarations
- Recursion
- Declaration of Variables and Constants
- If and While Statements
- Conditional and arithmetic operators
- Output to Console
See http://en.wikipedia.org/wiki/PL/0 for more info on PL/0.
The Compiler generates bytecode for the Triangle Abstract Machine (TAM).
The TAM Bytecode Interpreter and Disassembler can be obtained from this website:
http://www.dcs.gla.ac.uk/~daw/books/PLPJ/
The following is a demonstration of the interpretation and compilation of a PL/0 program that calculates the factorial of 6.
$> cat factorial.pl0
VAR f;
PROCEDURE fact;
VAR x, result;
PROCEDURE fact1;
BEGIN
IF x <= f THEN
BEGIN
result := result * x;
x := x + 1;
CALL fact1;
END;
END;
BEGIN
x := 1;
result := 1;
CALL fact1;
! result;
END;
BEGIN
f := 6;
CALL fact;
END.
$> scala org.jetho.pl0compiler.PL0Compiler -i factorial.pl0 720
$> scala org.jetho.pl0compiler.PL0Compiler factorial.pl0 fact.obj
$> java TAM.Disassembler fact.obj ********** TAM Disassembler (Sun Version 2.0) ********** 0: PUSH 1 1: JUMP 28[CB] 2: PUSH 2 3: JUMP 18[CB] 4: LOAD (1) 3[L1] 5: LOAD (1) 0[SB] 6: CALL le 7: JUMPIF(0) 17[CB] 8: LOAD (1) 4[L1] 9: LOAD (1) 3[L1] 10: CALL mult 11: STORE (1) 4[L1] 12: LOAD (1) 3[L1] 13: LOADL 1 14: CALL add 15: STORE (1) 3[L1] 16: CALL (L1) 4[CB] 17: RETURN(0) 0 18: LOADL 1 19: STORE (1) 3[LB] 20: LOADL 1 21: STORE (1) 4[LB] 22: CALL (LB) 4[CB] 23: LOAD (1) 4[LB] 24: CALL putint 25: CALL puteol 26: POP (0) 2 27: RETURN(0) 0 28: LOADL 6 29: STORE (1) 0[SB] 30: CALL (SB) 2[CB] 31: POP (0) 1 32: HALT
$> java TAM.Interpreter fact.obj ********** TAM Interpreter (Java Version 2.0) ********** 720 Program has halted normally. $>