SIMPL Code Generation

The target machine for the SIMPL compiler is the JVM. Code is generated from the syntax tree, using the templates given below. (Note: the BANNER is a comment string identifying the compiler and version.)

 

Node Type

Template

PROG
dType=NUM

; BANNER
.class public p1.name
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
   p1.generateCode
   p2.generateCode
   p3.generateCode
   p4.generateCode
   iload p1.varNum
   invokestatic simplIO/outputNum(I)V
   return
.limit stack p4.size+1
.limit locals symTab.size+1
.end method 

PROG
dType=BOOL

; BANNER
.class public p1.name
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
   p1.generateCode
   p2.generateCode
   p3.generateCode
   p4.generateCode
   iload p1.varNum
   invokestatic simplIO/outputLog(Z)V
   return
.limit stack p4.size+1
.limit locals symTab.size+1
.end method 

ID
ioType=OUT
use=
DECLARE
dType=
NUM

   ldc "name"
   invokestatic simplIO/registerIO(Ljava/lang/String;)V
   sipush
   istore varNum

ID
ioType=OUT
 use=DECLARE
dType=
BOOL

   ldc "name"
   invokestatic simplIO/registerIO(Ljava/lang/String;)V
   bipush
   istore varNum

ID
ioType=IN 
use=DECLARE
dType=NUM

   ldc "name"
   invokestatic simplIO/inputNum(Ljava/lang/String;)I
   istore varNum

ID
ioType=IN 
use=DECLARE
dType=BOOL

   ldc "name"
   invokestatic simplIO/inputLog(Ljava/lang/String;)Z
   istore varNum

ID
ioType=LOCAL 
use=DECLARE
dType=NUM

   sipush 0
   istore varNum

ID
ioType=LOCAL 
use=DECLARE
dType=BOOL

   bipush 0
   istore varNum

ID
use=REF

   iload varNum

SPACE

   p1.generateCode
   p2.generateCode

NULL

 

!

   p1.generateCode
   p2.generateCode

IF

   p1.generateCode
   ifeq lab1
   p2.generateCode
   goto lab2
lab1:
   p3.generateCode
lab2

WHILE

lab1:
   p1.generateCode
   ifeq lab2
   p2.generateCode
   goto lab1
lab2

<-

   p2.generateCode
   istore p1.varNum

> 

   p1.generateCode
   p2.generateCode
   if_icmpgt lab1
   bipush 0
   goto lab2
lab1:
   bipush 1
lab2

=

   p1.generateCode
   p2.generateCode
   if_icmpeq lab1
   bipush 0
   goto lab2
lab1:
   bipush 1
lab2

+
dType=NUM

   p1.generateCode
   p2.generateCode
   iadd 

+
dType=BOOL

   p1.generateCode
   p2.generateCode
   ior

-

   p1.generateCode
   p2.generateCode
   isub

*
dType=NUM

   p1.generateCode
   p2.generateCode
   imul 

*
dType=BOOL

   p1.generateCode
   p2.generateCode
   iand

/

   p1.generateCode
   p2.generateCode
   idiv 

NEG
dType=NUM

   p1.generateCode

  ineg

NEG
dType=BOOL

   bipush 1
   p1.generateCode
   ixor

NUM

   sipush name

BOOL

   bipush value