diff --git a/.classpath b/.classpath
index 802676a..6818152 100644
--- a/.classpath
+++ b/.classpath
@@ -1,7 +1,11 @@
-
+
+
+
+
+
@@ -27,5 +31,27 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
index f7205cc..918a6d8 100644
--- a/.project
+++ b/.project
@@ -15,8 +15,14 @@
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+ org.eclipse.m2e.core.maven2Nature
org.eclipse.jdt.core.javanature
org.eclipse.xtext.ui.shared.xtextNature
diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs
new file mode 100644
index 0000000..d4313d4
--- /dev/null
+++ b/.settings/org.eclipse.jdt.apt.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.apt.aptEnabled=false
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 3a21537..ff1c9b8 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,11 +1,14 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.processAnnotations=disabled
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/.vscode/settings.json b/.vscode/settings.json
index bc8ea05..0e14d8e 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,24 +1,3 @@
{
- "latex-workshop.latex.toolchain": [
- {
- "command": "pdflatex",
- "args": [
- "-synctex=1",
- "-shell-escape",
- "-interaction=nonstopmode",
- "-file-line-error",
- "%DOC%"
- ]
- },
- {
- "command": "pdflatex",
- "args": [
- "-synctex=1",
- "-shell-escape",
- "-interaction=nonstopmode",
- "-file-line-error",
- "%DOC%"
- ]
- }
- ]
+ "java.configuration.updateBuildConfiguration": "disabled"
}
\ No newline at end of file
diff --git a/lib/ant-1.10.2.jar b/lib/ant-1.10.2.jar
new file mode 100644
index 0000000..26a4c3c
Binary files /dev/null and b/lib/ant-1.10.2.jar differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..5abee31
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,25 @@
+
+ 4.0.0
+
+ pp.s1184725.boppi
+ boppi
+ 1.0-SNAPSHOT
+ jar
+
+ boppi
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/src/pp/s1184725/boppi/antlr/BoppiCore.g4 b/src/pp/s1184725/boppi/antlr/BoppiCore.g4
new file mode 100644
index 0000000..e69de29
diff --git a/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4 b/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4
new file mode 100644
index 0000000..e69de29
diff --git a/src/pp/s1184725/boppi/type/TypeVar.java b/src/pp/s1184725/boppi/type/TypeVar.java
new file mode 100644
index 0000000..66439ef
--- /dev/null
+++ b/src/pp/s1184725/boppi/type/TypeVar.java
@@ -0,0 +1,17 @@
+package pp.s1184725.boppi.type;
+
+/**
+ * Type-level variable.
+ *
+ * @author Frank Wibbelink
+ *
+ */
+public class TypeVar implements Type {
+
+ @Override
+ public int getSize() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+}
diff --git a/test.boppi.iloc b/test.boppi.iloc
new file mode 100644
index 0000000..c779ef9
--- /dev/null
+++ b/test.boppi.iloc
@@ -0,0 +1,532 @@
+fst_ptr <- 0
+slot1 <- 4
+header <- 8
+off_oref <- -8
+off_osize <- -4
+off_next <- 0
+off_size <- 4
+
+ // memlib - simple memory allocator for ILOC
+ //
+ // This library maintains a single-linked list (of monotonically increasing addresses) of free
+ // slots in memory and a reference count for occupied slots. Each slot contains a tuple `(next
+ // free slot address,size)` followed by `size` free bytes. The memory is initiliased with a
+ // pointer to the first free slot at `#fst_ptr` and one free slot at `#slot1` of size
+ // `brk-slot1-header`. When a piece of memory is requested for allocation, a tuple
+ // `(reference count, size)` followed by `size` bytes for the object is formed. The calling
+ // convention of the functions in this library consists of pushing the return address followed by
+ // any arguments (in order) to the stack. Any return values will be pushed to the stack likewise.
+ //
+ // Requires a register `brk` for the highest address available for heap allocation.
+ // Requires an instruction `halt` when memory runs out
+ //
+ // @author Frank Wibbelink
+ // initialise
+memlib_: loadI 0 => m_0
+ loadI @slot1 => m_1
+ subI brk,@slot1 => m_2
+ subI m_2,@header => m_2
+ storeAI m_1 => m_0,@fst_ptr // pointer to first slot
+ storeAI m_0 => m_1,@off_next // next slot is null
+ storeAI m_2 => m_1,@off_size // first slot size
+ jumpI -> ememlib_
+ // allocate memory
+ // searches through the free slots for either a slot size of ~~exactly #4+8 or a size of~~ at
+ // least #4+16
+ // stack: [return address, object size] -> [object address]
+memalloc: loadI 0 => m_0
+ pop => m_s // load size
+ loadI @fst_ptr => m_p // load previous address (base pointer)
+ loadAI m_p,@off_next => m_c // load current address (first slot)
+ma_loop: cmp_EQ m_0,m_c => m_1 // check if address pointer is null
+ cbr m_1 -> ma_null,ma_cont // if null, go to end and return null pointer
+ma_cont: loadAI m_c,@off_size => m_1 // load slot size
+ cmp_EQ m_1,m_s => m_2 // check if request fits exactly
+ cbr m_2 -> ma_yxct,ma_nxct
+ma_nxct: subI m_1,@header => m_1 // subtract free slot size
+ cmp_GE m_1,m_s => m_1 // check if request fits
+ cbr m_1 -> ma_found,ma_next
+ma_next: i2i m_c => m_p
+ loadAI m_p,@off_next => m_c
+ jumpI -> ma_loop
+ma_yxct: loadAI m_c,@off_next => m_n // location of next free slot
+ jumpI -> ma_final
+ma_found: addI m_s,@header => m_1
+ add m_1,m_c => m_n // location of new free slot
+ loadAI m_c,@off_size => m_1
+ subI m_1,@header => m_1
+ sub m_1,m_s => m_1 // size of new free slot
+ storeAI m_1 => m_n,@off_size
+ loadAI m_c,@off_next => m_1 // location of next free slot
+ storeAI m_1 => m_n,@off_next
+ma_final: storeAI m_n => m_p,@off_next // link previous free slot to new
+ addI m_c,@header => m_c // move to object location
+ loadI 1 => m_1
+ storeAI m_1 => m_c,@off_oref // set reference count to 1
+ storeAI m_s => m_c,@off_osize // set object size
+ma_zerc: cbr m_s -> ma_zerl,ma_null // zero memory
+ma_zerl: subI m_s,1 => m_s
+ cstoreAO m_0 => m_c,m_s
+ jumpI -> ma_zerc
+ma_null: pop => m_1 // load return address
+ push m_c // store object address
+ jump -> m_1
+ // increase reference count of object
+ // stack: [return address, object address] -> []
+memaddref: loadI 0 => m_0
+ pop => m_n // load object address
+ cmp_EQ m_0,m_n => m_1
+ cbr m_1 -> mr_ynul,mr_nnul // check if null pointer
+mr_ynul: haltI 1865445997
+mr_nnul: loadAI m_n,@off_oref => m_1
+ addI m_1,1 => m_1
+ storeAI m_1 => m_n,@off_oref
+ pop => m_1 // load return address
+ jump -> m_1
+ // decrease reference count of object
+ // frees memory if count goes to zero
+ // stack: [return address, object address] -> []
+memfree: loadI 0 => m_0
+ pop => m_n // load object address
+ cmp_EQ m_0,m_n => m_1
+ cbr m_1 -> mf_ynul,mf_nnul // check if null pointer
+mf_ynul: haltI 1865442925
+mf_nnul: loadAI m_n,@off_oref => m_1
+ subI m_1,1 => m_1
+ cmp_GT m_1,m_0 => m_2
+ cbr m_2 -> mf_exit,mf_free
+mf_exit: storeAI m_1 => m_n,@off_oref
+ pop => m_1 // load return address
+ jump -> m_1
+mf_free: subI m_n,@header => m_n
+ loadI @fst_ptr => m_p
+ loadAI m_p,@off_next => m_c
+mf_loop: cmp_EQ m_0,m_c => m_1 // loop until the surrounding free blocks are found
+ cbr m_1 -> mf_halt,mf_cont // check if address pointer is null
+mf_halt: haltI 1882220141 // halt program; object beyond last free slot (or memory corrupted)
+mf_cont: cmp_EQ m_c,m_n => m_1
+ cbr m_1 -> mf_hal2,mf_con2
+mf_hal2: haltI 1717855853 // halt program; object is free slot
+mf_con2: cmp_LE m_c,m_n => m_1
+ cbr m_1 -> mf_next,mf_done
+mf_next: i2i m_c => m_p
+ loadAI m_p,@off_next => m_c
+ jumpI -> mf_loop
+mf_done: loadAI m_p,@off_size => m_1
+ addI m_1,@header => m_1
+ add m_1,m_p => m_2
+ cmp_EQ m_2,m_n => m_2
+ cbr m_2 -> mf_yprv,mf_nprv
+mf_yprv: loadAI m_n,@off_size => m_2 // merge with previous free slot
+ add m_1,m_2 => m_1 // new size of previous free slot
+ storeAI m_1 => m_p,@off_size
+ i2i m_p => m_n
+ jumpI -> mf_dprv
+mf_nprv: storeAI m_n => m_p,@off_next // link previous free slot with new
+mf_dprv: loadAI m_n,@off_size => m_1
+ addI m_1,@header => m_1
+ add m_1,m_n => m_2
+ cmp_EQ m_2,m_c => m_2
+ cbr m_2 -> mf_ynxt,mf_nnxt
+mf_ynxt: loadAI m_c,@off_size => m_2 // merge with next free slot
+ add m_1,m_2 => m_1 // new size of next free slot
+ storeAI m_1 => m_n,@off_size
+ loadAI m_c,@off_next => m_1
+ storeAI m_1 => m_n,@off_next // move link of next's next to new free slot
+ pop => m_1 // load return address
+ jump -> m_1
+mf_nnxt: storeAI m_c => m_n,@off_next // link new free slot with next
+ pop => m_1 // load return address
+ jump -> m_1
+ // copy object to location
+ // stack: [return address, object address, destination] -> []
+memcopy: loadI 0 => m_0
+ haltI 1835626101 // unimplemented
+ pop => m_1 // load return address
+ jump -> m_1
+ememlib_: nop
+ // end of memlib
+ // stdlib - generic subroutines for ILOC
+ //
+ // This library contains a few common subroutines for Boppi.
+ //
+ // @author Frank Wibbelink
+ // initialise
+stdlib_: jumpI -> estdlib_
+ // write a boolean to output
+ // stack: [return address, bool] -> []
+stdbout: pop => m_1 // get boolean
+ loadI 0 => m_2 // load zero-length string
+ push m_2
+ cbr m_1 -> sbout_t,sbout_f
+sbout_t: cout "true"
+ jumpI -> sbout_e
+sbout_f: cout "false"
+sbout_e: pop => m_1 // load return address
+ jump -> m_1
+ // write an array of characters (a string) to output
+ // stack: [return address, address] -> []
+stdsout: pop => m_1 // get address
+ loadAI m_1,@off_osize => m_2 // get length
+sout_lc: cbr m_2 -> sout_ll,sout_le // check if any character to push
+sout_ll: subI m_2,1 => m_2 // iterate backward
+ cloadAO m_1,m_2 => m_c // get character
+ cpush m_c // push character
+ jumpI -> sout_lc // repeat
+sout_le: loadAI m_1,@off_osize => m_2 // get length
+ push m_2 // push string length
+ cout "" // print string
+ pop => m_1 // get return address
+ jump -> m_1
+ // read a character from input
+ // stack: [return address] -> [char]
+stdcin: cin "" // get line
+ pop => m_1 // get length
+ cbr m_1 -> scin_t,stdcin // repeat until at least one character
+scin_t: cpop => m_2 // save character
+scin_lc: subI m_1,1 => m_1 // decrement char count
+ cbr m_1 -> scin_ll,scin_le
+scin_ll: cpop => m_0 // discard character
+ jumpI -> scin_lc // repeat
+scin_le: loadI 0 => m_0 // reset zero register
+ pop => m_1 // get return address
+ cpush m_2 // push result character
+ jump -> m_1
+ // read an array of characters (a string) from input
+ // the memalloc label cannot be used, so address 28 is used instead
+ // stack: [return address] -> [address]
+stdsin: cin "" // get line
+ pop => m_2 // get length
+ push m_2 // save length
+ loadI #ssin_a => m_1 // call malloc
+ push m_1 // call malloc
+ push m_2 // call malloc
+ loadI 28 => m_c // call malloc
+ jump -> m_c // call malloc
+ssin_a: pop => m_1 // get array address
+ pop => m_2 // get length
+ i2i m_1 => m_n // load character iterator
+ssin_c: cbr m_2 -> ssin_l,ssin_e // pop characters into the array
+ssin_l: subI m_2,1 => m_2
+ cpop => m_c // pop character
+ cstore m_c => m_n // save character
+ addI m_n,1 => m_n // increment iterator
+ jumpI -> ssin_c
+ssin_e: pop => m_2 // get return address
+ push m_1 // push array address
+ jump -> m_2
+estdlib_: nop
+ // end of stdlib
+ loadI 0 => r_nul // initialise zero register
+ loadI 217 => r_arp // malloc
+ push r_arp // malloc
+ loadI 28 => r_arp // malloc
+ push r_arp // malloc
+ jumpI -> memalloc // malloc
+ pop => r_arp // malloc
+ addI r_arp,16 => r_arp // construct main AR
+ jumpI -> s0 // define f1 - jump over body
+ nop // define f1 - entry point
+ addI r_arp,0 => r_1 // add offset
+ load r_1 => r_1 // load address
+ storeAI r_1 => r_arp,-12 // define f1 - move result
+ loadAI r_arp,-8 => r_2 // load ref count
+ loadI 1 => r_1 // one
+ cmp_LE r_2,r_1 => r_2 // check more than one ref
+ cbr r_2 -> ycl1,ncl2 // remove vars if last reference
+ycl1: nop // cleanup target
+ncl2: nop // no cleanup target
+ loadAI r_arp,-8 => r_1 // define f1 - load return address
+ jump -> r_1 // define f1 - go to return address
+s0: nop // define f1 - skip target
+ loadI 238 => r_1 // malloc
+ push r_1 // malloc
+ loadI 12 => r_1 // malloc
+ push r_1 // malloc
+ jumpI -> memalloc // malloc
+ pop => r_1 // malloc
+ loadI 220 => r_2 // define f1 - load target address
+ storeAI r_2 => r_1,0 // define f1 - set target address
+ storeAI r_arp => r_1,4 // define f1 - copy ARP
+ loadI 20 => r_2 // define f1 - load AR size
+ storeAI r_2 => r_1,8 // define f1 - set AR size
+ storeAI r_1 => r_arp,4 // define f1 - set function reference
+ i2i r_arp => ART // AR incRef
+ cmp_NE ART,r_nul => r_1 // AR incRef
+ cbr r_1 -> aril3,arid4 // AR incRef
+aril3: loadI 253 => r_1 // AR incRef
+ push r_1 // AR incRef
+ subI ART,16 => r_1 // AR incRef
+ push r_1 // AR incRef
+ jumpI -> memaddref // AR incRef
+ loadAI ART,-16 => ART // AR incRef
+ cmp_NE ART,r_nul => r_1 // AR incRef
+ cbr r_1 -> aril3,arid4 // AR incRef
+arid4: nop // AR incRef
+ loadI 0 => r_1 // false
+ cbr r_1 -> if_t5,if_e7 //
+if_t5: nop //
+ addI r_arp,4 => r_1 // add offset
+ load r_1 => r_1 // load address
+ loadI 266 => r_3 // memaddref
+ push r_3 // memaddref
+ push r_1 // memaddref
+ jumpI -> memaddref // memaddref
+ loadAI r_1,4 => r_2 // add new reference
+ i2i r_2 => ART // AR incRef
+ cmp_NE ART,r_nul => r_3 // AR incRef
+ cbr r_3 -> aril8,arid9 // AR incRef
+aril8: loadI 275 => r_3 // AR incRef
+ push r_3 // AR incRef
+ subI ART,16 => r_3 // AR incRef
+ push r_3 // AR incRef
+ jumpI -> memaddref // AR incRef
+ loadAI ART,-16 => ART // AR incRef
+ cmp_NE ART,r_nul => r_3 // AR incRef
+ cbr r_3 -> aril8,arid9 // AR incRef
+arid9: nop // AR incRef
+ addI r_arp,0 => r_2 // add offset
+ load r_2 => r_3 // load reference
+ cmp_EQ r_3,r_nul => r_4 // remove old reference
+ cbr r_4 -> ynul10,nnul11 // remove old reference
+nnul11: nop // remove old reference
+ loadI 288 => r_4 // free
+ push r_4 // free
+ push r_3 // free
+ jumpI -> memfree // free
+ loadAI r_3,4 => r_3 // remove old reference
+ i2i r_3 => ART // AR decRef
+ cmp_NE ART,r_nul => r_4 // AR decRef
+ cbr r_4 -> ardl12,ardd13 // AR decRef
+ardl12: loadI 297 => r_4 // AR decRef
+ push r_4 // AR decRef
+ subI ART,16 => r_4 // AR decRef
+ push r_4 // AR decRef
+ jumpI -> memfree // AR decRef
+ loadAI ART,-16 => ART // AR decRef
+ cmp_NE ART,r_nul => r_4 // AR decRef
+ cbr r_4 -> ardl12,ardd13 // AR decRef
+ardd13: nop // AR decRef
+ynul10: nop // remove old reference
+ store r_1 => r_2 // to f
+ load r_2 => r_3 // load reference
+ loadI 308 => r_5 // memaddref
+ push r_5 // memaddref
+ push r_3 // memaddref
+ jumpI -> memaddref // memaddref
+ loadAI r_3,4 => r_4 // add new reference
+ i2i r_4 => ART // AR incRef
+ cmp_NE ART,r_nul => r_5 // AR incRef
+ cbr r_5 -> aril14,arid15 // AR incRef
+aril14: loadI 317 => r_5 // AR incRef
+ push r_5 // AR incRef
+ subI ART,16 => r_5 // AR incRef
+ push r_5 // AR incRef
+ jumpI -> memaddref // AR incRef
+ loadAI ART,-16 => ART // AR incRef
+ cmp_NE ART,r_nul => r_5 // AR incRef
+ cbr r_5 -> aril14,arid15 // AR incRef
+arid15: nop // AR incRef
+ cmp_EQ r_1,r_nul => r_3 // remove old reference
+ cbr r_3 -> ynul16,nnul17 // remove old reference
+nnul17: nop // remove old reference
+ loadI 328 => r_3 // free
+ push r_3 // free
+ push r_1 // free
+ jumpI -> memfree // free
+ loadAI r_1,4 => r_1 // remove old reference
+ i2i r_1 => ART // AR decRef
+ cmp_NE ART,r_nul => r_3 // AR decRef
+ cbr r_3 -> ardl18,ardd19 // AR decRef
+ardl18: loadI 337 => r_3 // AR decRef
+ push r_3 // AR decRef
+ subI ART,16 => r_3 // AR decRef
+ push r_3 // AR decRef
+ jumpI -> memfree // AR decRef
+ loadAI ART,-16 => ART // AR decRef
+ cmp_NE ART,r_nul => r_3 // AR decRef
+ cbr r_3 -> ardl18,ardd19 // AR decRef
+ardd19: nop // AR decRef
+ynul16: nop // remove old reference
+ addI r_arp,0 => r_4 // add offset
+ load r_4 => r_4 // load address
+ loadI 348 => r_2 // memaddref
+ push r_2 // memaddref
+ push r_4 // memaddref
+ jumpI -> memaddref // memaddref
+ loadAI r_4,4 => r_3 // add new reference
+ i2i r_3 => ART // AR incRef
+ cmp_NE ART,r_nul => r_2 // AR incRef
+ cbr r_2 -> aril20,arid21 // AR incRef
+aril20: loadI 357 => r_2 // AR incRef
+ push r_2 // AR incRef
+ subI ART,16 => r_2 // AR incRef
+ push r_2 // AR incRef
+ jumpI -> memaddref // AR incRef
+ loadAI ART,-16 => ART // AR incRef
+ cmp_NE ART,r_nul => r_2 // AR incRef
+ cbr r_2 -> aril20,arid21 // AR incRef
+arid21: nop // AR incRef
+ addI r_arp,0 => r_2 // add offset
+ load r_2 => r_1 // load reference
+ cmp_EQ r_1,r_nul => r_3 // remove old reference
+ cbr r_3 -> ynul22,nnul23 // remove old reference
+nnul23: nop // remove old reference
+ loadI 370 => r_3 // free
+ push r_3 // free
+ push r_1 // free
+ jumpI -> memfree // free
+ loadAI r_1,4 => r_1 // remove old reference
+ i2i r_1 => ART // AR decRef
+ cmp_NE ART,r_nul => r_3 // AR decRef
+ cbr r_3 -> ardl24,ardd25 // AR decRef
+ardl24: loadI 379 => r_3 // AR decRef
+ push r_3 // AR decRef
+ subI ART,16 => r_3 // AR decRef
+ push r_3 // AR decRef
+ jumpI -> memfree // AR decRef
+ loadAI ART,-16 => ART // AR decRef
+ cmp_NE ART,r_nul => r_3 // AR decRef
+ cbr r_3 -> ardl24,ardd25 // AR decRef
+ardd25: nop // AR decRef
+ynul22: nop // remove old reference
+ store r_4 => r_2 // to f
+ load r_2 => r_3 // load reference
+ loadI 390 => r_5 // memaddref
+ push r_5 // memaddref
+ push r_3 // memaddref
+ jumpI -> memaddref // memaddref
+ loadAI r_3,4 => r_1 // add new reference
+ i2i r_1 => ART // AR incRef
+ cmp_NE ART,r_nul => r_5 // AR incRef
+ cbr r_5 -> aril26,arid27 // AR incRef
+aril26: loadI 399 => r_5 // AR incRef
+ push r_5 // AR incRef
+ subI ART,16 => r_5 // AR incRef
+ push r_5 // AR incRef
+ jumpI -> memaddref // AR incRef
+ loadAI ART,-16 => ART // AR incRef
+ cmp_NE ART,r_nul => r_5 // AR incRef
+ cbr r_5 -> aril26,arid27 // AR incRef
+arid27: nop // AR incRef
+if_e7: nop // end target
+ loadI 409 => r_3 // malloc
+ push r_3 // malloc
+ loadI 8 => r_3 // malloc
+ push r_3 // malloc
+ jumpI -> memalloc // malloc
+ pop => r_3 // malloc
+ loadI 2 => r_2 // 2
+ storeAI r_2 => r_3,0 // store array element
+ loadI 2 => r_4 // 2
+ storeAI r_4 => r_3,4 // store array element
+ addI r_arp,8 => r_2 // add offset
+ load r_2 => r_1 // load reference
+ cmp_EQ r_1,r_nul => r_4 // remove old reference
+ cbr r_4 -> ynul28,nnul29 // remove old reference
+nnul29: nop // remove old reference
+ loadI 423 => r_4 // free
+ push r_4 // free
+ push r_1 // free
+ jumpI -> memfree // free
+ynul28: nop // remove old reference
+ store r_3 => r_2 // to arr
+ load r_2 => r_4 // load reference
+ loadI 430 => r_5 // memaddref
+ push r_5 // memaddref
+ push r_4 // memaddref
+ jumpI -> memaddref // memaddref
+ cmp_EQ r_3,r_nul => r_4 // remove old reference
+ cbr r_4 -> ynul30,nnul31 // remove old reference
+nnul31: nop // remove old reference
+ loadI 437 => r_4 // free
+ push r_4 // free
+ push r_3 // free
+ jumpI -> memfree // free
+ynul30: nop // remove old reference
+ addI r_arp,8 => r_2 // add offset
+ load r_2 => r_2 // get array object
+ loadI 0 => r_4 // 0
+ loadAI r_2,-4 => r_3 // check array index
+ divI r_3,4 => r_3 // check array index
+ cmp_LT r_4,r_3 => r_3 // check array index
+ cmp_GE r_4,r_nul => r_1 // check array index
+ and r_3,r_1 => r_1 // check array index
+ cbr r_1 -> nob33,oob32 // check array index
+oob32: haltI 1634692962 // array index out of bounds
+nob33: multI r_4,4 => r_4 // multiply index by size
+ add r_2,r_4 => r_2 // get array index address
+ load r_2 => r_2 // load address
+ addI r_arp,8 => r_1 // add offset
+ load r_1 => r_1 // get array object
+ loadI 1 => r_3 // 1
+ loadAI r_1,-4 => r_5 // check array index
+ divI r_5,4 => r_5 // check array index
+ cmp_LT r_3,r_5 => r_5 // check array index
+ cmp_GE r_3,r_nul => r_4 // check array index
+ and r_5,r_4 => r_4 // check array index
+ cbr r_4 -> nob35,oob34 // check array index
+oob34: haltI 1634692962 // array index out of bounds
+nob35: multI r_3,4 => r_3 // multiply index by size
+ add r_1,r_3 => r_1 // get array index address
+ load r_1 => r_1 // load address
+ add r_2,r_1 => r_2 // +
+ out "",r_2 //
+ loadAI r_arp,0 => r_1 // remove reference get var
+ cmp_EQ r_1,r_nul => r_3 // remove reference
+ cbr r_3 -> ynul36,nnul37 // remove reference
+nnul37: nop // remove reference
+ loadI 474 => r_3 // free
+ push r_3 // free
+ push r_1 // free
+ jumpI -> memfree // free
+ loadAI r_1,4 => r_1 // remove reference
+ i2i r_1 => ART // AR decRef
+ cmp_NE ART,r_nul => r_3 // AR decRef
+ cbr r_3 -> ardl38,ardd39 // AR decRef
+ardl38: loadI 483 => r_3 // AR decRef
+ push r_3 // AR decRef
+ subI ART,16 => r_3 // AR decRef
+ push r_3 // AR decRef
+ jumpI -> memfree // AR decRef
+ loadAI ART,-16 => ART // AR decRef
+ cmp_NE ART,r_nul => r_3 // AR decRef
+ cbr r_3 -> ardl38,ardd39 // AR decRef
+ardd39: nop // AR decRef
+ynul36: nop // remove reference
+ loadAI r_arp,4 => r_1 // remove reference get var
+ cmp_EQ r_1,r_nul => r_3 // remove reference
+ cbr r_3 -> ynul40,nnul41 // remove reference
+nnul41: nop // remove reference
+ loadI 496 => r_3 // free
+ push r_3 // free
+ push r_1 // free
+ jumpI -> memfree // free
+ loadAI r_1,4 => r_1 // remove reference
+ i2i r_1 => ART // AR decRef
+ cmp_NE ART,r_nul => r_3 // AR decRef
+ cbr r_3 -> ardl42,ardd43 // AR decRef
+ardl42: loadI 505 => r_3 // AR decRef
+ push r_3 // AR decRef
+ subI ART,16 => r_3 // AR decRef
+ push r_3 // AR decRef
+ jumpI -> memfree // AR decRef
+ loadAI ART,-16 => ART // AR decRef
+ cmp_NE ART,r_nul => r_3 // AR decRef
+ cbr r_3 -> ardl42,ardd43 // AR decRef
+ardd43: nop // AR decRef
+ynul40: nop // remove reference
+ loadAI r_arp,8 => r_1 // remove reference get var
+ cmp_EQ r_1,r_nul => r_3 // remove reference
+ cbr r_3 -> ynul44,nnul45 // remove reference
+nnul45: nop // remove reference
+ loadI 518 => r_3 // free
+ push r_3 // free
+ push r_1 // free
+ jumpI -> memfree // free
+ynul44: nop // remove reference
+ subI r_arp,16 => r_arp // deconstruct main AR
+ loadI 524 => r_2 // free
+ push r_2 // free
+ push r_arp // free
+ jumpI -> memfree // free
diff --git a/test.boppi.txt b/test.boppi.txt
new file mode 100644
index 0000000..53bff68
--- /dev/null
+++ b/test.boppi.txt
@@ -0,0 +1,5 @@
+var (int)->int f;
+function int f1(int x) x;
+if false then f := f1; f := f fi;
+var int[] arr; arr := [2,2];
+print(arr[0]+arr[1]);