Skip to content

Latest commit

 

History

79 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A Compiler and Interpreter for Wirth's PL/0 Language

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.

Interpretation:

$> scala org.jetho.pl0compiler.PL0Compiler -i factorial.pl0 
720

Compiling to TAM bytecode:

$> scala org.jetho.pl0compiler.PL0Compiler factorial.pl0 fact.obj

Using the TAM Disassembler to display the generated bytecode:

$> 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  

Running the program with the TAM Interpreter:

$> java TAM.Interpreter fact.obj 
********** TAM Interpreter (Java Version 2.0) **********
720

Program has halted normally.
$> 

About

A Compiler and Interpreter for Wirth's PL/0 Language

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages