diff --git a/.classpath b/.classpath deleted file mode 100644 index 6818152..0000000 --- a/.classpath +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index 0a71914..0000000 --- a/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - boppi2 - - - - - - org.eclipse.xtext.ui.shared.xtextBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - org.eclipse.xtext.ui.shared.xtextNature - - diff --git a/build.xml b/build.xml index 5d2cb03..6a7e69d 100644 --- a/build.xml +++ b/build.xml @@ -1,5 +1,5 @@ - + @@ -71,7 +71,7 @@ - + @@ -89,7 +89,9 @@ - + + + @@ -99,32 +101,20 @@ - - + - - - - - - - - - - - - - - + @@ -132,12 +122,14 @@ - + - + - + + + diff --git a/lib/ant-1.10.2.jar b/lib/ant-1.10.2.jar deleted file mode 100644 index 26a4c3c..0000000 Binary files a/lib/ant-1.10.2.jar and /dev/null differ diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 5abee31..0000000 --- a/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - 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/iloc/Simulator.java b/src/pp/iloc/Simulator.java index d864a16..3f15a21 100644 --- a/src/pp/iloc/Simulator.java +++ b/src/pp/iloc/Simulator.java @@ -13,6 +13,7 @@ import pp.iloc.model.Num; import pp.iloc.model.Op; import pp.iloc.model.OpClaz; import pp.iloc.model.OpCode; +import pp.iloc.model.Operand.Type; import pp.iloc.model.Program; import pp.iloc.parse.FormatException; diff --git a/src/pp/s1184725/boppi/BoppiCoreChecker.java b/src/pp/s1184725/boppi/BoppiCoreChecker.java deleted file mode 100644 index b6a161c..0000000 --- a/src/pp/s1184725/boppi/BoppiCoreChecker.java +++ /dev/null @@ -1,114 +0,0 @@ -package pp.s1184725.boppi; - -import java.util.logging.Logger; -import java.util.stream.Collectors; - -import org.antlr.runtime.ANTLRFileStream; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ParseTree; -import org.antlr.v4.runtime.tree.ParseTreeWalker; - -import pp.s1184725.boppi.antlr.*; -import pp.s1184725.boppi.antlr.BoppiCoreParser.*; -import pp.s1184725.boppi.exception.*; -import pp.s1184725.boppi.type.*; - -/** - * This class performs type checking and variable assignment on a bare parse - * tree. - * - * @author Frank Wibbelink - */ -public class BoppiCoreChecker extends BoppiCoreBaseListener { - public static void main(String[] args) { - BoppiCoreLexer lexer = new BoppiCoreLexer(ToolChain.getCharStream(BoppiCoreChecker.class, "test/test2.core")); - BoppiCoreParser parser = new BoppiCoreParser(new CommonTokenStream(lexer)); - ParseTree ast = parser.program(); - Logger logger = Logger.getLogger("TEST"); - Annotations annotations = checkProgram(ast, logger); - System.out.println(ToolChain.getAnnotatedDOT(ast, annotations)); - } - - private Annotations an; - private Logger log; - - /** - * Checks and annotates a program. Problems are reported to the given - * logger. - * - * @param ast - * the program's AST - * @param logger - * the logger object to write warnings and errors to - * @return the generated annotations - */ - public static Annotations checkProgram(ParseTree ast, Logger logger) { - BoppiCoreChecker checker = new BoppiCoreChecker(logger, new Annotations()); - ParseTreeWalker walker = new ParseTreeWalker(); - walker.walk(checker, ast); - return checker.an; - } - - protected BoppiCoreChecker(Logger logger, Annotations annotations) { - an = annotations; - log = logger; - } - - /** - * Checks whether two types are compatible and log an error if they do not. - * - * @param type1 - * the left hand or actual type - * @param type2 - * the right hand or desired type - * @param node - * the context used for logging - */ - private void checkConstraint(Type type1, Type type2, ParserRuleContext node) { - if (!type2.equals(type1)) - log.severe(getError(node, Messages.getString("BoppiChecker.0"), type1.toString(), type2.toString())); //$NON-NLS-1$ - } - - /** - * Returns an error message for a given parse tree node. - * - * @param ctx - * the parse tree node at which the error occurred - * @param message - * the error message - * @param args - * arguments for the message, see {@link String#format} - */ - private String getError(ParserRuleContext node, String message, Object... args) { - int line = node.getStart().getLine(); - int column = node.getStart().getCharPositionInLine(); - return String.format(Messages.getString("BoppiChecker.1"), line, column, String.format(message, args)); //$NON-NLS-1$ - } - - /** - * Returns whether the current context resides within a given rule context - * within a set root (may be {@code null}). Effectively traverses between - * {@code current} and {@code root} in the parent hierarchy looking for a - * {@code rule} class. - * - * @param - * the rule class - * @param ctx - * the node to start traversing - * @param root - * the node to stop traversing - * @param rule - * the ParserRuleContext class to look for - * @return whether a matching rule is found between the current and root - * node - */ - private boolean isWithinRule(ParserRuleContext ctx, ParserRuleContext root, - Class rule) { - for (ParserRuleContext node = ctx; node != root && node != null; node = node.getParent()) - if (node.getClass().isAssignableFrom(rule)) - return true; - - return false; - } -} diff --git a/src/pp/s1184725/boppi/antlr/BoppiCore.g4 b/src/pp/s1184725/boppi/antlr/BoppiCore.g4 deleted file mode 100644 index b0063dd..0000000 --- a/src/pp/s1184725/boppi/antlr/BoppiCore.g4 +++ /dev/null @@ -1,34 +0,0 @@ -grammar BoppiCore; -import BoppiCoreTokens; - -program: expr EOF; - -block: BLOCKOPEN ((data|let) DELIM)+ BLOCKCLOSE; - -data: DATA id EQUALS BLOCKOPEN (id DELIM)+ BLOCKCLOSE; - -let: LET id EQUALS expr; - -id: IDENTIFIER (HASTYPE aexpr)?; - -expr - : expr expr #eApp - | LAMBDA id expr #eAbs - | PI id expr #eQuant - | block expr #eDecl - | CASE aexpr BLOCKOPEN (alt DELIM)+ BLOCKCLOSE #eCase - | aexpr #eSimple - ; - -alt: id TO expr; - -aexpr - : id - | literal - | PAROPEN expr PARCLOSE - ; - -literal - : LITERALINT - | LITERALCHAR - ; diff --git a/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4 b/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4 deleted file mode 100644 index cbb5aac..0000000 --- a/src/pp/s1184725/boppi/antlr/BoppiCoreTokens.g4 +++ /dev/null @@ -1,23 +0,0 @@ -lexer grammar BoppiCoreTokens; - -DELIM: ';'; -HASTYPE: ':'; -LAMBDA: '\u03BB'; -PI: '\u03A0'; -PAROPEN: '('; -PARCLOSE: ')'; -DATA: 'data'; -LET: 'let'; -IN: 'in'; -CASE: 'case'; -TO: '\u2192'; -EQUALS: '='; -BLOCKOPEN: '{'; -BLOCKCLOSE: '}'; -LITERALINT: '0' | [1-9][0-9]*; -LITERALCHAR: '\'' . '\''; - -IDENTIFIER: [\p{Alphabetic}]+ | '_' | '\u2605'; - -WHITESPACE: [\p{White_Space}] -> skip; -BLOCKCOMMENT: '/*' .*? '*/' -> skip; diff --git a/src/pp/s1184725/boppi/test/test1.core b/src/pp/s1184725/boppi/test/test1.core deleted file mode 100644 index 7813681..0000000 --- a/src/pp/s1184725/boppi/test/test1.core +++ /dev/null @@ -1 +0,0 @@ -5 \ No newline at end of file diff --git a/src/pp/s1184725/boppi/test/test2.core b/src/pp/s1184725/boppi/test/test2.core deleted file mode 100644 index af5b3b0..0000000 --- a/src/pp/s1184725/boppi/test/test2.core +++ /dev/null @@ -1,12 +0,0 @@ -{ - data Boolean:★ = { - True; - False; - }; - data List:(Π _:★ ★) = { - Cons : (Π a:★ Π _:a Π _:(List a) List a); - Nil : (Π a:★ List a); - }; - let main = True; -} -main \ No newline at end of file diff --git a/src/pp/s1184725/boppi/type/TypeVar.java b/src/pp/s1184725/boppi/type/TypeVar.java deleted file mode 100644 index 66439ef..0000000 --- a/src/pp/s1184725/boppi/type/TypeVar.java +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index c779ef9..0000000 --- a/test.boppi.iloc +++ /dev/null @@ -1,532 +0,0 @@ -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 deleted file mode 100644 index 53bff68..0000000 --- a/test.boppi.txt +++ /dev/null @@ -1,5 +0,0 @@ -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]);