From 2b84ae0d15f5e88ece18866bed9d76f347c87acc Mon Sep 17 00:00:00 2001 From: Paul Hilfinger <Hilfinger@cs.berkeley.edu> Date: Thu, 11 Apr 2019 18:15:37 -0700 Subject: [PATCH] First version of PA3 skeleton. --- .gitignore | 149 + README.md | 85 + chocopy-ref.jar | Bin 0 -> 183396 bytes pom.xml | 325 ++ src/main/java/chocopy/common/Utils.java | 56 + .../common/analysis/AbstractNodeAnalyzer.java | 176 ++ .../chocopy/common/analysis/NodeAnalyzer.java | 67 + .../chocopy/common/analysis/SymbolTable.java | 63 + .../common/analysis/types/ClassValueType.java | 53 + .../common/analysis/types/FuncType.java | 46 + .../common/analysis/types/ListValueType.java | 58 + .../common/analysis/types/SymbolType.java | 78 + .../common/analysis/types/ValueType.java | 32 + .../chocopy/common/astnodes/AssignStmt.java | 28 + .../chocopy/common/astnodes/BinaryExpr.java | 30 + .../common/astnodes/BooleanLiteral.java | 23 + .../chocopy/common/astnodes/CallExpr.java | 28 + .../chocopy/common/astnodes/ClassDef.java | 41 + .../chocopy/common/astnodes/ClassType.java | 22 + .../common/astnodes/CompilerError.java | 57 + .../chocopy/common/astnodes/Declaration.java | 19 + .../java/chocopy/common/astnodes/Errors.java | 72 + .../java/chocopy/common/astnodes/Expr.java | 48 + .../chocopy/common/astnodes/ExprStmt.java | 23 + .../java/chocopy/common/astnodes/ForStmt.java | 34 + .../java/chocopy/common/astnodes/FuncDef.java | 48 + .../chocopy/common/astnodes/GlobalDecl.java | 29 + .../chocopy/common/astnodes/Identifier.java | 23 + .../java/chocopy/common/astnodes/IfExpr.java | 31 + .../java/chocopy/common/astnodes/IfStmt.java | 36 + .../chocopy/common/astnodes/IndexExpr.java | 28 + .../common/astnodes/IntegerLiteral.java | 23 + .../chocopy/common/astnodes/ListExpr.java | 27 + .../chocopy/common/astnodes/ListType.java | 25 + .../java/chocopy/common/astnodes/Literal.java | 16 + .../chocopy/common/astnodes/MemberExpr.java | 29 + .../common/astnodes/MethodCallExpr.java | 31 + .../java/chocopy/common/astnodes/Node.java | 174 + .../chocopy/common/astnodes/NonLocalDecl.java | 29 + .../chocopy/common/astnodes/NoneLiteral.java | 17 + .../java/chocopy/common/astnodes/Program.java | 56 + .../chocopy/common/astnodes/ReturnStmt.java | 25 + .../java/chocopy/common/astnodes/Stmt.java | 20 + .../common/astnodes/StringLiteral.java | 23 + .../common/astnodes/TypeAnnotation.java | 14 + .../chocopy/common/astnodes/TypedVar.java | 29 + .../chocopy/common/astnodes/UnaryExpr.java | 29 + .../java/chocopy/common/astnodes/VarDef.java | 32 + .../chocopy/common/astnodes/WhileStmt.java | 32 + .../java/chocopy/common/codegen/AttrInfo.java | 16 + .../chocopy/common/codegen/ClassInfo.java | 137 + .../chocopy/common/codegen/CodeGenBase.java | 940 ++++++ .../chocopy/common/codegen/Constants.java | 121 + .../java/chocopy/common/codegen/FuncInfo.java | 217 ++ .../chocopy/common/codegen/GlobalVarInfo.java | 27 + .../java/chocopy/common/codegen/Label.java | 48 + .../chocopy/common/codegen/RiscVBackend.java | 719 +++++ .../chocopy/common/codegen/StackVarInfo.java | 30 + .../chocopy/common/codegen/SymbolInfo.java | 9 + .../java/chocopy/common/codegen/VarInfo.java | 41 + .../java/chocopy/common/codegen/asm/abort.s | 12 + .../java/chocopy/common/codegen/asm/alloc.s | 4 + .../java/chocopy/common/codegen/asm/alloc2.s | 27 + .../chocopy/common/codegen/asm/heap.init.s | 5 + .../java/chocopy/common/codegen/asm/input.s | 5 + .../java/chocopy/common/codegen/asm/len.s | 20 + .../common/codegen/asm/object.__init__.s | 3 + .../java/chocopy/common/codegen/asm/print.s | 52 + src/main/java/chocopy/pa3/CodeGenImpl.java | 204 ++ src/main/java/chocopy/pa3/StudentCodeGen.java | 34 + src/test/data/pa3/benchmarks/exp.py | 25 + src/test/data/pa3/benchmarks/exp.py.ast.typed | 562 ++++ .../pa3/benchmarks/exp.py.ast.typed.s.result | 43 + src/test/data/pa3/benchmarks/prime.py | 30 + .../data/pa3/benchmarks/prime.py.ast.typed | 658 ++++ .../benchmarks/prime.py.ast.typed.s.result | 15 + src/test/data/pa3/benchmarks/sieve.py | 107 + .../data/pa3/benchmarks/sieve.py.ast.typed | 2816 +++++++++++++++++ .../benchmarks/sieve.py.ast.typed.s.result | 15 + src/test/data/pa3/benchmarks/stdlib.py | 77 + .../data/pa3/benchmarks/stdlib.py.ast.typed | 1813 +++++++++++ .../benchmarks/stdlib.py.ast.typed.s.result | 21 + src/test/data/pa3/benchmarks/tree.py | 83 + .../data/pa3/benchmarks/tree.py.ast.typed | 2301 ++++++++++++++ .../pa3/benchmarks/tree.py.ast.typed.s.result | 4 + src/test/data/pa3/sample/call.py | 17 + src/test/data/pa3/sample/call.py.ast.typed | 386 +++ .../pa3/sample/call.py.ast.typed.s.result | 7 + src/test/data/pa3/sample/call_with_args.py | 19 + .../pa3/sample/call_with_args.py.ast.typed | 554 ++++ .../call_with_args.py.ast.typed.s.result | 9 + src/test/data/pa3/sample/error_div_zero.py | 1 + .../pa3/sample/error_div_zero.py.ast.typed | 65 + .../error_div_zero.py.ast.typed.s.result | 2 + .../data/pa3/sample/error_invalid_print.py | 1 + .../sample/error_invalid_print.py.ast.typed | 46 + .../error_invalid_print.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/error_mod_zero.py | 1 + .../pa3/sample/error_mod_zero.py.ast.typed | 65 + .../error_mod_zero.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/expr_if.py | 2 + src/test/data/pa3/sample/expr_if.py.ast.typed | 135 + .../pa3/sample/expr_if.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/id_global.py | 2 + .../data/pa3/sample/id_global.py.ast.typed | 73 + .../sample/id_global.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/id_local.py | 5 + .../data/pa3/sample/id_local.py.ast.typed | 114 + .../pa3/sample/id_local.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/len_invalid_1.py | 3 + .../pa3/sample/len_invalid_1.py.ast.typed | 103 + .../len_invalid_1.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/len_invalid_2.py | 3 + .../pa3/sample/len_invalid_2.py.ast.typed | 97 + .../len_invalid_2.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/list_concat.py | 12 + .../data/pa3/sample/list_concat.py.ast.typed | 437 +++ .../sample/list_concat.py.ast.typed.s.result | 6 + src/test/data/pa3/sample/list_concat_2.py | 8 + .../pa3/sample/list_concat_2.py.ast.typed | 366 +++ .../list_concat_2.py.ast.typed.s.result | 9 + src/test/data/pa3/sample/list_concat_none.py | 4 + .../pa3/sample/list_concat_none.py.ast.typed | 156 + .../list_concat_none.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/list_get_element.py | 6 + .../pa3/sample/list_get_element.py.ast.typed | 259 ++ .../list_get_element.py.ast.typed.s.result | 3 + .../pa3/sample/list_get_element_complex.py | 11 + .../list_get_element_complex.py.ast.typed | 313 ++ ..._get_element_complex.py.ast.typed.s.result | 1 + .../data/pa3/sample/list_get_element_none.py | 3 + .../sample/list_get_element_none.py.ast.typed | 96 + ...ist_get_element_none.py.ast.typed.s.result | 2 + .../data/pa3/sample/list_get_element_oob_1.py | 4 + .../list_get_element_oob_1.py.ast.typed | 156 + ...st_get_element_oob_1.py.ast.typed.s.result | 2 + .../data/pa3/sample/list_get_element_oob_2.py | 4 + .../list_get_element_oob_2.py.ast.typed | 147 + ...st_get_element_oob_2.py.ast.typed.s.result | 2 + .../data/pa3/sample/list_get_element_oob_3.py | 4 + .../list_get_element_oob_3.py.ast.typed | 120 + ...st_get_element_oob_3.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/list_len.py | 4 + .../data/pa3/sample/list_len.py.ast.typed | 154 + .../pa3/sample/list_len.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/list_len_empty.py | 4 + .../pa3/sample/list_len_empty.py.ast.typed | 127 + .../list_len_empty.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/list_set_element.py | 9 + .../pa3/sample/list_set_element.py.ast.typed | 382 +++ .../list_set_element.py.ast.typed.s.result | 3 + .../data/pa3/sample/list_set_element_none.py | 4 + .../sample/list_set_element_none.py.ast.typed | 81 + ...ist_set_element_none.py.ast.typed.s.result | 2 + .../data/pa3/sample/list_set_element_oob_1.py | 7 + .../list_set_element_oob_1.py.ast.typed | 309 ++ ...st_set_element_oob_1.py.ast.typed.s.result | 2 + .../data/pa3/sample/list_set_element_oob_2.py | 7 + .../list_set_element_oob_2.py.ast.typed | 300 ++ ...st_set_element_oob_2.py.ast.typed.s.result | 2 + .../data/pa3/sample/list_set_element_oob_3.py | 4 + .../list_set_element_oob_3.py.ast.typed | 105 + ...st_set_element_oob_3.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/literal_bool.py | 2 + .../data/pa3/sample/literal_bool.py.ast.typed | 83 + .../sample/literal_bool.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/literal_int.py | 2 + .../data/pa3/sample/literal_int.py.ast.typed | 83 + .../sample/literal_int.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/literal_str.py | 1 + .../data/pa3/sample/literal_str.py.ast.typed | 47 + .../sample/literal_str.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/nested.py | 11 + src/test/data/pa3/sample/nested.py.ast.typed | 272 ++ .../pa3/sample/nested.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/nested2.py | 14 + src/test/data/pa3/sample/nested2.py.ast.typed | 337 ++ .../pa3/sample/nested2.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/object_attr_get.py | 16 + .../pa3/sample/object_attr_get.py.ast.typed | 387 +++ .../object_attr_get.py.ast.typed.s.result | 4 + .../data/pa3/sample/object_attr_get_none.py | 16 + .../sample/object_attr_get_none.py.ast.typed | 379 +++ ...object_attr_get_none.py.ast.typed.s.result | 4 + src/test/data/pa3/sample/object_attr_set.py | 18 + .../pa3/sample/object_attr_set.py.ast.typed | 455 +++ .../object_attr_set.py.ast.typed.s.result | 4 + .../pa3/sample/object_attr_set_eval_order.py | 33 + .../object_attr_set_eval_order.py.ast.typed | 771 +++++ ..._attr_set_eval_order.py.ast.typed.s.result | 10 + .../data/pa3/sample/object_attr_set_none.py | 19 + .../sample/object_attr_set_none.py.ast.typed | 447 +++ ...object_attr_set_none.py.ast.typed.s.result | 4 + src/test/data/pa3/sample/object_init.py | 11 + .../data/pa3/sample/object_init.py.ast.typed | 173 + .../sample/object_init.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/object_method.py | 16 + .../pa3/sample/object_method.py.ast.typed | 387 +++ .../object_method.py.ast.typed.s.result | 2 + .../pa3/sample/object_method_complex_call.py | 19 + .../object_method_complex_call.py.ast.typed | 492 +++ ..._method_complex_call.py.ast.typed.s.result | 3 + .../data/pa3/sample/object_method_nested.py | 18 + .../sample/object_method_nested.py.ast.typed | 439 +++ ...object_method_nested.py.ast.typed.s.result | 2 + .../data/pa3/sample/object_method_none.py | 17 + .../sample/object_method_none.py.ast.typed | 412 +++ .../object_method_none.py.ast.typed.s.result | 3 + .../data/pa3/sample/object_method_override.py | 19 + .../object_method_override.py.ast.typed | 441 +++ ...ject_method_override.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/op_add.py | 1 + src/test/data/pa3/sample/op_add.py.ast.typed | 65 + .../pa3/sample/op_add.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/op_cmp_bool.py | 8 + .../data/pa3/sample/op_cmp_bool.py.ast.typed | 443 +++ .../sample/op_cmp_bool.py.ast.typed.s.result | 8 + src/test/data/pa3/sample/op_cmp_int.py | 16 + .../data/pa3/sample/op_cmp_int.py.ast.typed | 711 +++++ .../sample/op_cmp_int.py.ast.typed.s.result | 12 + src/test/data/pa3/sample/op_div_mod.py | 5 + .../data/pa3/sample/op_div_mod.py.ast.typed | 171 + .../sample/op_div_mod.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/op_is.py | 19 + src/test/data/pa3/sample/op_is.py.ast.typed | 598 ++++ .../pa3/sample/op_is.py.ast.typed.s.result | 7 + src/test/data/pa3/sample/op_logical.py | 13 + .../data/pa3/sample/op_logical.py.ast.typed | 411 +++ .../sample/op_logical.py.ast.typed.s.result | 6 + src/test/data/pa3/sample/op_mul.py | 1 + src/test/data/pa3/sample/op_mul.py.ast.typed | 83 + .../pa3/sample/op_mul.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/op_negate.py | 2 + .../data/pa3/sample/op_negate.py.ast.typed | 82 + .../sample/op_negate.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/op_sub.py | 1 + src/test/data/pa3/sample/op_sub.py.ast.typed | 65 + .../pa3/sample/op_sub.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/pass.py | 1 + src/test/data/pa3/sample/pass.py.ast.typed | 11 + .../pa3/sample/pass.py.ast.typed.s.result | 0 .../data/pa3/sample/predef_constructors.py | 4 + .../sample/predef_constructors.py.ast.typed | 192 ++ .../predef_constructors.py.ast.typed.s.result | 4 + src/test/data/pa3/sample/stmt_for_list.py | 7 + .../pa3/sample/stmt_for_list.py.ast.typed | 178 ++ .../stmt_for_list.py.ast.typed.s.result | 3 + .../data/pa3/sample/stmt_for_list_empty.py | 12 + .../sample/stmt_for_list_empty.py.ast.typed | 318 ++ .../stmt_for_list_empty.py.ast.typed.s.result | 3 + .../data/pa3/sample/stmt_for_list_eval.py | 8 + .../sample/stmt_for_list_eval.py.ast.typed | 202 ++ .../stmt_for_list_eval.py.ast.typed.s.result | 3 + .../data/pa3/sample/stmt_for_list_modify.py | 8 + .../sample/stmt_for_list_modify.py.ast.typed | 219 ++ ...stmt_for_list_modify.py.ast.typed.s.result | 3 + .../data/pa3/sample/stmt_for_list_nested.py | 9 + .../sample/stmt_for_list_nested.py.ast.typed | 247 ++ ...stmt_for_list_nested.py.ast.typed.s.result | 9 + .../sample/stmt_for_list_nested_same_var.py | 9 + ...stmt_for_list_nested_same_var.py.ast.typed | 229 ++ ...list_nested_same_var.py.ast.typed.s.result | 9 + .../data/pa3/sample/stmt_for_list_none.py | 5 + .../sample/stmt_for_list_none.py.ast.typed | 127 + .../stmt_for_list_none.py.ast.typed.s.result | 2 + .../data/pa3/sample/stmt_for_list_nonlocal.py | 15 + .../stmt_for_list_nonlocal.py.ast.typed | 408 +++ ...mt_for_list_nonlocal.py.ast.typed.s.result | 1 + .../data/pa3/sample/stmt_for_list_return.py | 8 + .../sample/stmt_for_list_return.py.ast.typed | 241 ++ ...stmt_for_list_return.py.ast.typed.s.result | 3 + src/test/data/pa3/sample/stmt_for_str.py | 5 + .../data/pa3/sample/stmt_for_str.py.ast.typed | 121 + .../sample/stmt_for_str.py.ast.typed.s.result | 3 + .../data/pa3/sample/stmt_for_str_empty.py | 8 + .../sample/stmt_for_str_empty.py.ast.typed | 205 ++ .../stmt_for_str_empty.py.ast.typed.s.result | 3 + src/test/data/pa3/sample/stmt_for_str_eval.py | 6 + .../pa3/sample/stmt_for_str_eval.py.ast.typed | 142 + .../stmt_for_str_eval.py.ast.typed.s.result | 3 + .../data/pa3/sample/stmt_for_str_nested.py | 8 + .../sample/stmt_for_str_nested.py.ast.typed | 205 ++ .../stmt_for_str_nested.py.ast.typed.s.result | 12 + .../data/pa3/sample/stmt_for_str_same_var.py | 4 + .../sample/stmt_for_str_same_var.py.ast.typed | 95 + ...tmt_for_str_same_var.py.ast.typed.s.result | 3 + src/test/data/pa3/sample/stmt_if.py | 7 + src/test/data/pa3/sample/stmt_if.py.ast.typed | 125 + .../pa3/sample/stmt_if.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/stmt_return_early.py | 6 + .../pa3/sample/stmt_return_early.py.ast.typed | 113 + .../stmt_return_early.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/stmt_while.py | 4 + .../data/pa3/sample/stmt_while.py.ast.typed | 143 + .../sample/stmt_while.py.ast.typed.s.result | 9 + src/test/data/pa3/sample/str_cat.py | 17 + src/test/data/pa3/sample/str_cat.py.ast.typed | 738 +++++ .../pa3/sample/str_cat.py.ast.typed.s.result | 6 + src/test/data/pa3/sample/str_cat_2.py | 19 + .../data/pa3/sample/str_cat_2.py.ast.typed | 638 ++++ .../sample/str_cat_2.py.ast.typed.s.result | 3 + src/test/data/pa3/sample/str_cmp.py | 17 + src/test/data/pa3/sample/str_cmp.py.ast.typed | 659 ++++ .../pa3/sample/str_cmp.py.ast.typed.s.result | 6 + src/test/data/pa3/sample/str_get_element.py | 14 + .../pa3/sample/str_get_element.py.ast.typed | 462 +++ .../str_get_element.py.ast.typed.s.result | 3 + .../data/pa3/sample/str_get_element_oob_1.py | 8 + .../sample/str_get_element_oob_1.py.ast.typed | 235 ++ ...tr_get_element_oob_1.py.ast.typed.s.result | 2 + .../data/pa3/sample/str_get_element_oob_2.py | 8 + .../sample/str_get_element_oob_2.py.ast.typed | 226 ++ ...tr_get_element_oob_2.py.ast.typed.s.result | 2 + .../data/pa3/sample/str_get_element_oob_3.py | 8 + .../sample/str_get_element_oob_3.py.ast.typed | 226 ++ ...tr_get_element_oob_3.py.ast.typed.s.result | 2 + src/test/data/pa3/sample/str_len.py | 1 + src/test/data/pa3/sample/str_len.py.ast.typed | 71 + .../pa3/sample/str_len.py.ast.typed.s.result | 1 + src/test/data/pa3/sample/var_assign.py | 4 + .../data/pa3/sample/var_assign.py.ast.typed | 128 + .../sample/var_assign.py.ast.typed.s.result | 1 + 322 files changed, 34899 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 chocopy-ref.jar create mode 100644 pom.xml create mode 100644 src/main/java/chocopy/common/Utils.java create mode 100644 src/main/java/chocopy/common/analysis/AbstractNodeAnalyzer.java create mode 100644 src/main/java/chocopy/common/analysis/NodeAnalyzer.java create mode 100644 src/main/java/chocopy/common/analysis/SymbolTable.java create mode 100644 src/main/java/chocopy/common/analysis/types/ClassValueType.java create mode 100644 src/main/java/chocopy/common/analysis/types/FuncType.java create mode 100644 src/main/java/chocopy/common/analysis/types/ListValueType.java create mode 100644 src/main/java/chocopy/common/analysis/types/SymbolType.java create mode 100644 src/main/java/chocopy/common/analysis/types/ValueType.java create mode 100644 src/main/java/chocopy/common/astnodes/AssignStmt.java create mode 100644 src/main/java/chocopy/common/astnodes/BinaryExpr.java create mode 100644 src/main/java/chocopy/common/astnodes/BooleanLiteral.java create mode 100644 src/main/java/chocopy/common/astnodes/CallExpr.java create mode 100644 src/main/java/chocopy/common/astnodes/ClassDef.java create mode 100644 src/main/java/chocopy/common/astnodes/ClassType.java create mode 100644 src/main/java/chocopy/common/astnodes/CompilerError.java create mode 100644 src/main/java/chocopy/common/astnodes/Declaration.java create mode 100644 src/main/java/chocopy/common/astnodes/Errors.java create mode 100644 src/main/java/chocopy/common/astnodes/Expr.java create mode 100644 src/main/java/chocopy/common/astnodes/ExprStmt.java create mode 100644 src/main/java/chocopy/common/astnodes/ForStmt.java create mode 100644 src/main/java/chocopy/common/astnodes/FuncDef.java create mode 100644 src/main/java/chocopy/common/astnodes/GlobalDecl.java create mode 100644 src/main/java/chocopy/common/astnodes/Identifier.java create mode 100644 src/main/java/chocopy/common/astnodes/IfExpr.java create mode 100644 src/main/java/chocopy/common/astnodes/IfStmt.java create mode 100644 src/main/java/chocopy/common/astnodes/IndexExpr.java create mode 100644 src/main/java/chocopy/common/astnodes/IntegerLiteral.java create mode 100644 src/main/java/chocopy/common/astnodes/ListExpr.java create mode 100644 src/main/java/chocopy/common/astnodes/ListType.java create mode 100644 src/main/java/chocopy/common/astnodes/Literal.java create mode 100644 src/main/java/chocopy/common/astnodes/MemberExpr.java create mode 100644 src/main/java/chocopy/common/astnodes/MethodCallExpr.java create mode 100644 src/main/java/chocopy/common/astnodes/Node.java create mode 100644 src/main/java/chocopy/common/astnodes/NonLocalDecl.java create mode 100644 src/main/java/chocopy/common/astnodes/NoneLiteral.java create mode 100644 src/main/java/chocopy/common/astnodes/Program.java create mode 100644 src/main/java/chocopy/common/astnodes/ReturnStmt.java create mode 100644 src/main/java/chocopy/common/astnodes/Stmt.java create mode 100644 src/main/java/chocopy/common/astnodes/StringLiteral.java create mode 100644 src/main/java/chocopy/common/astnodes/TypeAnnotation.java create mode 100644 src/main/java/chocopy/common/astnodes/TypedVar.java create mode 100644 src/main/java/chocopy/common/astnodes/UnaryExpr.java create mode 100644 src/main/java/chocopy/common/astnodes/VarDef.java create mode 100644 src/main/java/chocopy/common/astnodes/WhileStmt.java create mode 100644 src/main/java/chocopy/common/codegen/AttrInfo.java create mode 100644 src/main/java/chocopy/common/codegen/ClassInfo.java create mode 100644 src/main/java/chocopy/common/codegen/CodeGenBase.java create mode 100644 src/main/java/chocopy/common/codegen/Constants.java create mode 100644 src/main/java/chocopy/common/codegen/FuncInfo.java create mode 100644 src/main/java/chocopy/common/codegen/GlobalVarInfo.java create mode 100644 src/main/java/chocopy/common/codegen/Label.java create mode 100644 src/main/java/chocopy/common/codegen/RiscVBackend.java create mode 100644 src/main/java/chocopy/common/codegen/StackVarInfo.java create mode 100644 src/main/java/chocopy/common/codegen/SymbolInfo.java create mode 100644 src/main/java/chocopy/common/codegen/VarInfo.java create mode 100644 src/main/java/chocopy/common/codegen/asm/abort.s create mode 100644 src/main/java/chocopy/common/codegen/asm/alloc.s create mode 100644 src/main/java/chocopy/common/codegen/asm/alloc2.s create mode 100644 src/main/java/chocopy/common/codegen/asm/heap.init.s create mode 100644 src/main/java/chocopy/common/codegen/asm/input.s create mode 100644 src/main/java/chocopy/common/codegen/asm/len.s create mode 100644 src/main/java/chocopy/common/codegen/asm/object.__init__.s create mode 100644 src/main/java/chocopy/common/codegen/asm/print.s create mode 100644 src/main/java/chocopy/pa3/CodeGenImpl.java create mode 100644 src/main/java/chocopy/pa3/StudentCodeGen.java create mode 100644 src/test/data/pa3/benchmarks/exp.py create mode 100644 src/test/data/pa3/benchmarks/exp.py.ast.typed create mode 100644 src/test/data/pa3/benchmarks/exp.py.ast.typed.s.result create mode 100644 src/test/data/pa3/benchmarks/prime.py create mode 100644 src/test/data/pa3/benchmarks/prime.py.ast.typed create mode 100644 src/test/data/pa3/benchmarks/prime.py.ast.typed.s.result create mode 100644 src/test/data/pa3/benchmarks/sieve.py create mode 100644 src/test/data/pa3/benchmarks/sieve.py.ast.typed create mode 100644 src/test/data/pa3/benchmarks/sieve.py.ast.typed.s.result create mode 100644 src/test/data/pa3/benchmarks/stdlib.py create mode 100644 src/test/data/pa3/benchmarks/stdlib.py.ast.typed create mode 100644 src/test/data/pa3/benchmarks/stdlib.py.ast.typed.s.result create mode 100644 src/test/data/pa3/benchmarks/tree.py create mode 100644 src/test/data/pa3/benchmarks/tree.py.ast.typed create mode 100644 src/test/data/pa3/benchmarks/tree.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/call.py create mode 100644 src/test/data/pa3/sample/call.py.ast.typed create mode 100644 src/test/data/pa3/sample/call.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/call_with_args.py create mode 100644 src/test/data/pa3/sample/call_with_args.py.ast.typed create mode 100644 src/test/data/pa3/sample/call_with_args.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/error_div_zero.py create mode 100644 src/test/data/pa3/sample/error_div_zero.py.ast.typed create mode 100644 src/test/data/pa3/sample/error_div_zero.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/error_invalid_print.py create mode 100644 src/test/data/pa3/sample/error_invalid_print.py.ast.typed create mode 100644 src/test/data/pa3/sample/error_invalid_print.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/error_mod_zero.py create mode 100644 src/test/data/pa3/sample/error_mod_zero.py.ast.typed create mode 100644 src/test/data/pa3/sample/error_mod_zero.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/expr_if.py create mode 100644 src/test/data/pa3/sample/expr_if.py.ast.typed create mode 100644 src/test/data/pa3/sample/expr_if.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/id_global.py create mode 100644 src/test/data/pa3/sample/id_global.py.ast.typed create mode 100644 src/test/data/pa3/sample/id_global.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/id_local.py create mode 100644 src/test/data/pa3/sample/id_local.py.ast.typed create mode 100644 src/test/data/pa3/sample/id_local.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/len_invalid_1.py create mode 100644 src/test/data/pa3/sample/len_invalid_1.py.ast.typed create mode 100644 src/test/data/pa3/sample/len_invalid_1.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/len_invalid_2.py create mode 100644 src/test/data/pa3/sample/len_invalid_2.py.ast.typed create mode 100644 src/test/data/pa3/sample/len_invalid_2.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_concat.py create mode 100644 src/test/data/pa3/sample/list_concat.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_concat.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_concat_2.py create mode 100644 src/test/data/pa3/sample/list_concat_2.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_concat_2.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_concat_none.py create mode 100644 src/test/data/pa3/sample/list_concat_none.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_concat_none.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_get_element.py create mode 100644 src/test/data/pa3/sample/list_get_element.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_get_element.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_get_element_complex.py create mode 100644 src/test/data/pa3/sample/list_get_element_complex.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_get_element_complex.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_get_element_none.py create mode 100644 src/test/data/pa3/sample/list_get_element_none.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_get_element_none.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_get_element_oob_1.py create mode 100644 src/test/data/pa3/sample/list_get_element_oob_1.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_get_element_oob_1.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_get_element_oob_2.py create mode 100644 src/test/data/pa3/sample/list_get_element_oob_2.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_get_element_oob_2.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_get_element_oob_3.py create mode 100644 src/test/data/pa3/sample/list_get_element_oob_3.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_get_element_oob_3.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_len.py create mode 100644 src/test/data/pa3/sample/list_len.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_len.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_len_empty.py create mode 100644 src/test/data/pa3/sample/list_len_empty.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_len_empty.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_set_element.py create mode 100644 src/test/data/pa3/sample/list_set_element.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_set_element.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_set_element_none.py create mode 100644 src/test/data/pa3/sample/list_set_element_none.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_set_element_none.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_set_element_oob_1.py create mode 100644 src/test/data/pa3/sample/list_set_element_oob_1.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_set_element_oob_1.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_set_element_oob_2.py create mode 100644 src/test/data/pa3/sample/list_set_element_oob_2.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_set_element_oob_2.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/list_set_element_oob_3.py create mode 100644 src/test/data/pa3/sample/list_set_element_oob_3.py.ast.typed create mode 100644 src/test/data/pa3/sample/list_set_element_oob_3.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/literal_bool.py create mode 100644 src/test/data/pa3/sample/literal_bool.py.ast.typed create mode 100644 src/test/data/pa3/sample/literal_bool.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/literal_int.py create mode 100644 src/test/data/pa3/sample/literal_int.py.ast.typed create mode 100644 src/test/data/pa3/sample/literal_int.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/literal_str.py create mode 100644 src/test/data/pa3/sample/literal_str.py.ast.typed create mode 100644 src/test/data/pa3/sample/literal_str.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/nested.py create mode 100644 src/test/data/pa3/sample/nested.py.ast.typed create mode 100644 src/test/data/pa3/sample/nested.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/nested2.py create mode 100644 src/test/data/pa3/sample/nested2.py.ast.typed create mode 100644 src/test/data/pa3/sample/nested2.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_attr_get.py create mode 100644 src/test/data/pa3/sample/object_attr_get.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_attr_get.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_attr_get_none.py create mode 100644 src/test/data/pa3/sample/object_attr_get_none.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_attr_get_none.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_attr_set.py create mode 100644 src/test/data/pa3/sample/object_attr_set.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_attr_set.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_attr_set_eval_order.py create mode 100644 src/test/data/pa3/sample/object_attr_set_eval_order.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_attr_set_eval_order.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_attr_set_none.py create mode 100644 src/test/data/pa3/sample/object_attr_set_none.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_attr_set_none.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_init.py create mode 100644 src/test/data/pa3/sample/object_init.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_init.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_method.py create mode 100644 src/test/data/pa3/sample/object_method.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_method.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_method_complex_call.py create mode 100644 src/test/data/pa3/sample/object_method_complex_call.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_method_complex_call.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_method_nested.py create mode 100644 src/test/data/pa3/sample/object_method_nested.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_method_nested.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_method_none.py create mode 100644 src/test/data/pa3/sample/object_method_none.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_method_none.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/object_method_override.py create mode 100644 src/test/data/pa3/sample/object_method_override.py.ast.typed create mode 100644 src/test/data/pa3/sample/object_method_override.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_add.py create mode 100644 src/test/data/pa3/sample/op_add.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_add.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_cmp_bool.py create mode 100644 src/test/data/pa3/sample/op_cmp_bool.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_cmp_bool.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_cmp_int.py create mode 100644 src/test/data/pa3/sample/op_cmp_int.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_cmp_int.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_div_mod.py create mode 100644 src/test/data/pa3/sample/op_div_mod.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_div_mod.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_is.py create mode 100644 src/test/data/pa3/sample/op_is.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_is.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_logical.py create mode 100644 src/test/data/pa3/sample/op_logical.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_logical.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_mul.py create mode 100644 src/test/data/pa3/sample/op_mul.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_mul.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_negate.py create mode 100644 src/test/data/pa3/sample/op_negate.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_negate.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/op_sub.py create mode 100644 src/test/data/pa3/sample/op_sub.py.ast.typed create mode 100644 src/test/data/pa3/sample/op_sub.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/pass.py create mode 100644 src/test/data/pa3/sample/pass.py.ast.typed create mode 100644 src/test/data/pa3/sample/pass.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/predef_constructors.py create mode 100644 src/test/data/pa3/sample/predef_constructors.py.ast.typed create mode 100644 src/test/data/pa3/sample/predef_constructors.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list.py create mode 100644 src/test/data/pa3/sample/stmt_for_list.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list_empty.py create mode 100644 src/test/data/pa3/sample/stmt_for_list_empty.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list_empty.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list_eval.py create mode 100644 src/test/data/pa3/sample/stmt_for_list_eval.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list_eval.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list_modify.py create mode 100644 src/test/data/pa3/sample/stmt_for_list_modify.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list_modify.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list_nested.py create mode 100644 src/test/data/pa3/sample/stmt_for_list_nested.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list_nested.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list_nested_same_var.py create mode 100644 src/test/data/pa3/sample/stmt_for_list_nested_same_var.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list_nested_same_var.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list_none.py create mode 100644 src/test/data/pa3/sample/stmt_for_list_none.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list_none.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list_nonlocal.py create mode 100644 src/test/data/pa3/sample/stmt_for_list_nonlocal.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list_nonlocal.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_list_return.py create mode 100644 src/test/data/pa3/sample/stmt_for_list_return.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_list_return.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_str.py create mode 100644 src/test/data/pa3/sample/stmt_for_str.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_str.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_str_empty.py create mode 100644 src/test/data/pa3/sample/stmt_for_str_empty.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_str_empty.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_str_eval.py create mode 100644 src/test/data/pa3/sample/stmt_for_str_eval.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_str_eval.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_str_nested.py create mode 100644 src/test/data/pa3/sample/stmt_for_str_nested.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_str_nested.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_for_str_same_var.py create mode 100644 src/test/data/pa3/sample/stmt_for_str_same_var.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_for_str_same_var.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_if.py create mode 100644 src/test/data/pa3/sample/stmt_if.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_if.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_return_early.py create mode 100644 src/test/data/pa3/sample/stmt_return_early.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_return_early.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/stmt_while.py create mode 100644 src/test/data/pa3/sample/stmt_while.py.ast.typed create mode 100644 src/test/data/pa3/sample/stmt_while.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/str_cat.py create mode 100644 src/test/data/pa3/sample/str_cat.py.ast.typed create mode 100644 src/test/data/pa3/sample/str_cat.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/str_cat_2.py create mode 100644 src/test/data/pa3/sample/str_cat_2.py.ast.typed create mode 100644 src/test/data/pa3/sample/str_cat_2.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/str_cmp.py create mode 100644 src/test/data/pa3/sample/str_cmp.py.ast.typed create mode 100644 src/test/data/pa3/sample/str_cmp.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/str_get_element.py create mode 100644 src/test/data/pa3/sample/str_get_element.py.ast.typed create mode 100644 src/test/data/pa3/sample/str_get_element.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/str_get_element_oob_1.py create mode 100644 src/test/data/pa3/sample/str_get_element_oob_1.py.ast.typed create mode 100644 src/test/data/pa3/sample/str_get_element_oob_1.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/str_get_element_oob_2.py create mode 100644 src/test/data/pa3/sample/str_get_element_oob_2.py.ast.typed create mode 100644 src/test/data/pa3/sample/str_get_element_oob_2.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/str_get_element_oob_3.py create mode 100644 src/test/data/pa3/sample/str_get_element_oob_3.py.ast.typed create mode 100644 src/test/data/pa3/sample/str_get_element_oob_3.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/str_len.py create mode 100644 src/test/data/pa3/sample/str_len.py.ast.typed create mode 100644 src/test/data/pa3/sample/str_len.py.ast.typed.s.result create mode 100644 src/test/data/pa3/sample/var_assign.py create mode 100644 src/test/data/pa3/sample/var_assign.py.ast.typed create mode 100644 src/test/data/pa3/sample/var_assign.py.ast.typed.s.result diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..21cc758 --- /dev/null +++ b/.gitignore @@ -0,0 +1,149 @@ +.DS_Store +__pycache__ +target + +# Created by https://www.gitignore.io/api/java,eclipse,intellij,emacs,vim + +### Java ### +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + + +### Eclipse ### +*.pydevproject +.metadata +.gradle +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath + +# Eclipse Core +.project + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific +.buildpath + +# sbteclipse plugin +.target + +# TeXlipse plugin +.texlipse + + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio + +*.iml + +## Directory-based project format: +.idea/ +# if you remove the above rule, at least ignore the following: + +# User-specific stuff: +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/dictionaries + +# Sensitive or high-churn files: +# .idea/dataSources.ids +# .idea/dataSources.xml +# .idea/sqlDataSources.xml +# .idea/dynamic.xml +# .idea/uiDesigner.xml + +# Gradle: +# .idea/gradle.xml +# .idea/libraries + +# Mongo Explorer plugin: +# .idea/mongoSettings.xml + +## File-based project format: +*.ipr +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties + + +### Emacs ### +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ + + +### Vim ### +[._]*.s[a-w][a-z] +[._]s[a-w][a-z] +*.un~ +Session.vim +.netrwhist +*~ diff --git a/README.md b/README.md new file mode 100644 index 0000000..1535d9f --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +# CS 164: Programming Assignment 3 + +## Getting started + +Run the following command to build your compiler, and then run all the provided tests: + +``` +mvn clean package + +java -cp "chocopy-ref.jar:lib/venus164.jar:target/assignment.jar" chocopy.ChocoPy --pa3 chocopy.pa3.StudentCodeGen --run --dir src/test/data/pa3/sample/ --test +``` + +In the starter code, only one test should pass. Your objective is to implement a code generator that passes all the provided tests and meets the assignment specifications. + +### Generating assembly files + +You can also run the code generator on one input file at at time. In general, running the code generator on a ChocoPy program is a three-step process. + +1. First, run the reference parser to get an AST JSON: +``` +java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pa1 chocopy.reference.RefParser --in <chocopy_input_file> --out <ast_json_file> +``` + +2. Second, run the reference analysis on the AST JSON to get a typed AST JSON: +``` +java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pa2 chocopy.reference.RefAnalysis --in <ast_json_file> --out <typed_ast_json_file> +``` + +3. Third, run your code generator on the typed AST JSON to get a RISC-V assembly file: +``` +java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pa3 chocopy.pa3.StudentCodeGen --in <typed_ast_json_file> --out <assembly_file> +``` + +The `src/tests/data/pa3/sample` directory already contains the typed AST JSONs for the test programs (with extension `.out.typed`); therefore, you can skip the first two steps for the sample test programs. + +### Executing an assembly program using the Venus simulator + +To run a generated RISC-V program in the Venus-164 execution environment, run: + +``` +java -cp "chocopy-ref.jar:lib/venus164.jar:target/assignment.jar" chocopy.ChocoPy --run --in <assembly_file> +``` + +### Chained commands + +For quick development, you can chain all the stages `--pa1`, `--pa2`, `--pa3`, and `--run` to directly execute a ChocoPy program: + +``` +java -cp "chocopy-ref.jar:lib/venus164.jar:target/assignment.jar" chocopy.ChocoPy --pa1 chocopy.reference.RefParser --pa2 chocopy.reference.RefAnalysis --pa3 chocopy.pa3.StudentCodeGen --run --in <chocopy_input_file> +``` + +You can omit the `--run` in the above chain to print the generated assembly program instead of executing it. + +### Running the reference implementation + +To observe the output of the reference implementation of the code generator, replace the class `chocopy.pa3.StudentCodeGen` with `chocopy.reference.RefCodeGen` in any command where applicable. + +## Assignment specifications + +See `PA3.pdf` for a detailed specification of the assignment. + +Refer to `chocopy_language_reference.pdf` for specifications on the ChocoPy language. + +Refer to `chocopy_implementation_guide.pdf` for information on the design of the reference implementation / starter code. + +## Receiving updates to this repository + +Add the `upstream` repository remotes (you only need to do this once in your local clone): + +``` +git remote add upstream https://github.com/cs164fall2018/pa3-chocopy-code-generation.git +``` + +To sync with updates upstream: +``` +git pull upstream master +``` + +## Submission writeup + +Team member 1: + +Team member 2: + +(Students should edit this section with their write-up) diff --git a/chocopy-ref.jar b/chocopy-ref.jar new file mode 100644 index 0000000000000000000000000000000000000000..bbcd47c90ad93cdd4e4537a6b131d6c766a05d44 GIT binary patch literal 183396 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8059b1a --- /dev/null +++ b/pom.xml @@ -0,0 +1,325 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>chocopy</groupId> + <artifactId>chocopy</artifactId> + <packaging>jar</packaging> + <version>2.0-SNAPSHOT</version> + <name>chocopy</name> + <url>http://maven.apache.org</url> + + <!-- Set this property to true on the command-line for very verbose output --> + <properties> + <chocopy.debug>false</chocopy.debug> + </properties> + + <build> + <!-- Specify JFlex and CUP plugins here; execute in profiles --> + <pluginManagement> + <plugins> + <plugin> + <groupId>de.jflex</groupId> + <artifactId>jflex-maven-plugin</artifactId> + <version>1.6.1</version> + </plugin> + <plugin> + <groupId>com.github.vbmacher</groupId> + <artifactId>cup-maven-plugin</artifactId> + <version>11b-20160615</version> + </plugin> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <version>3.1.0</version> + </plugin> + <plugin> + <artifactId>maven-jar-plugin</artifactId> + <version>3.1.0</version> + </plugin> + </plugins> + </pluginManagement> + + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <descriptorRefs> + <descriptorRef>jar-with-dependencies</descriptorRef> + </descriptorRefs> + <finalName>assignment</finalName> + <appendAssemblyId>false</appendAssemblyId> + </configuration> + <executions> + <execution> + <id>make-assembly</id> + <phase>package</phase> <!-- bind to the packaging phase --> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.8.0</version> + <configuration> + <encoding>UTF-8</encoding> + <source>1.8</source> + <target>1.8</target> + <parameters>true</parameters> + <debug>true</debug> + </configuration> + </plugin> + </plugins> + + <resources> + <resource> + <directory>src/main/java</directory> + <includes> + <include>**/asm/*.s</include> + <include>**/asm/*.os</include> + </includes> + <excludes> + <exclude>**/reference/codegen/asm/*.s</exclude> + </excludes> + </resource> + </resources> + </build> + + <profiles> + <profile> + <id>reference</id> + <activation> + <!-- This profile is activated whenever we have the reference sources available --> + <file> + <exists>src/main/java/chocopy/reference/</exists> + </file> + </activation> + <build> + <plugins> + <!-- Do not include student skeletons in the reference JAR --> + <plugin> + <artifactId>maven-jar-plugin</artifactId> + <configuration> + <excludes> + <exclude>**/pa1/*</exclude> + <exclude>**/pa2/*</exclude> + <exclude>**/pa3/*</exclude> + </excludes> + </configuration> + </plugin> + <!-- Name the generated JAR differently so that it is different from the student version --> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <descriptorRefs> + <descriptorRef>jar-with-dependencies</descriptorRef> + </descriptorRefs> + <finalName>chocopy-ref</finalName> + <appendAssemblyId>false</appendAssemblyId> + </configuration> + </plugin> + <!-- Run JFlex to generate reference lexer --> + <plugin> + <groupId>de.jflex</groupId> + <artifactId>jflex-maven-plugin</artifactId> + <executions> + <execution> + <id>jflex-reference</id> + <goals> + <goal>generate</goal> + </goals> + <configuration> + <lexDefinitions> + <lexDefinition>src/main/jflex/chocopy/reference/ChocoPy.jflex</lexDefinition> + </lexDefinitions> + <dump>${chocopy.debug}</dump> + <verbose>true</verbose> + </configuration> + </execution> + </executions> + </plugin> + <!-- Run CUP to generate reference parser --> + <plugin> + <groupId>com.github.vbmacher</groupId> + <artifactId>cup-maven-plugin</artifactId> + <executions> + <execution> + <id>cup-reference</id> + <goals> + <goal>generate</goal> + </goals> + <configuration> + <cupDefinition>src/main/cup/chocopy/reference/ChocoPy.cup</cupDefinition> + <packageName>chocopy.reference</packageName> + <className>ChocoPyParser</className> + <symbolsName>ChocoPyTokens</symbolsName> + <dumpTables>${chocopy.debug}</dumpTables> + <dumpStates>${chocopy.debug}</dumpStates> + <dumpGrammar>${chocopy.debug}</dumpGrammar> + <locations>true</locations> + </configuration> + </execution> + </executions> + </plugin> + <!-- No debug --> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <debug>true</debug> + </configuration> + </plugin> + <!-- Copy dependencies to target/ --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>3.1.1</version> + <executions> + <execution> + <id>copy-dependencies</id> + <phase>package</phase> + <goals> + <goal>copy-dependencies</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + + <profile> + <id>pa1</id> + <activation> + <!-- This profile is activated whenever we are in a PA1 distribution --> + <file> + <exists>src/main/java/chocopy/pa1</exists> + </file> + </activation> + <build> + <plugins> + <!-- Run JFlex on the student version --> + <plugin> + <groupId>de.jflex</groupId> + <artifactId>jflex-maven-plugin</artifactId> + <executions> + <execution> + <id>jflex-pa1</id> + <goals> + <goal>generate</goal> + </goals> + <configuration> + <lexDefinitions> + <lexDefinition>src/main/jflex/chocopy/pa1/ChocoPy.jflex</lexDefinition> + </lexDefinitions> + <dump>${chocopy.debug}</dump> + <verbose>true</verbose> + </configuration> + </execution> + </executions> + </plugin> + <!-- Run CUP on the student version --> + <plugin> + <groupId>com.github.vbmacher</groupId> + <artifactId>cup-maven-plugin</artifactId> + <executions> + <execution> + <id>cup-pa1</id> + <goals> + <goal>generate</goal> + </goals> + <configuration> + <cupDefinition>src/main/cup/chocopy/pa1/ChocoPy.cup</cupDefinition> + <packageName>chocopy.pa1</packageName> + <className>ChocoPyParser</className> + <symbolsName>ChocoPyTokens</symbolsName> + <dumpTables>${chocopy.debug}</dumpTables> + <dumpStates>${chocopy.debug}</dumpStates> + <dumpGrammar>${chocopy.debug}</dumpGrammar> + <locations>true</locations> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>pa2</id> + <activation> + <!-- This profile is activated whenever we are in a PA2 distribution --> + <file> + <exists>src/main/java/chocopy/pa2</exists> + </file> + </activation> + </profile> + <profile> + <id>pa3</id> + <activation> + <!-- This profile is activated whenever we are in a PA3 distribution --> + <file> + <exists>src/main/java/chocopy/pa3</exists> + </file> + </activation> + </profile> + </profiles> + + + <repositories> + <repository> + <id>cs164-repo</id> + <name>Repository for CS164 artifacts</name> + <url>http://inst.eecs.berkeley.edu/~cs164/maven</url> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>net.sourceforge.argparse4j</groupId> + <artifactId>argparse4j</artifactId> + <version>0.8.1</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>2.9.8</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.module</groupId> + <artifactId>jackson-module-parameter-names</artifactId> + <version>2.9.8</version> + </dependency> + <dependency> + <groupId>com.github.vbmacher</groupId> + <artifactId>java-cup-runtime</artifactId> + <version>11b-20160615</version> + </dependency> + <!-- https://mvnrepository.com/artifact/de.jflex/jflex --> + <dependency> + <groupId>de.jflex</groupId> + <artifactId>jflex</artifactId> + <version>1.6.1</version> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-stdlib</artifactId> + <version>1.2.71</version> + </dependency> + <dependency> + <groupId>edu.berkeley.eecs.venus164</groupId> + <artifactId>venus164</artifactId> + <version>0.2.3</version> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>net.sf.proguard</groupId> + <artifactId>proguard-base</artifactId> + <version>6.0.3</version> + </dependency> + </dependencies> +</project> diff --git a/src/main/java/chocopy/common/Utils.java b/src/main/java/chocopy/common/Utils.java new file mode 100644 index 0000000..4b292bd --- /dev/null +++ b/src/main/java/chocopy/common/Utils.java @@ -0,0 +1,56 @@ +package chocopy.common; + +import java.io.BufferedReader; +import java.util.stream.Collectors; +import java.io.InputStream; +import java.io.InputStreamReader; + + +/** Utility functions for general use. */ +public class Utils { + + /** + * Return resource file FILENAME's contents as a string. FILENAME + * can refer to a file within the class hierarchy, so that a text + * resource in file resource.txt in the chocopy.common.codegen + * package, for example, could be referred to with FILENAME + * chocopy/common/codegen/resource.txt. + * + * Credit: Lucio Paiva. + */ + public static String getResourceFileAsString(String fileName) { + InputStream is = + Utils.class.getClassLoader().getResourceAsStream(fileName); + if (is != null) { + BufferedReader reader = + new BufferedReader(new InputStreamReader(is)); + return reader.lines().collect + (Collectors.joining(System.lineSeparator())); + } + return null; + } + + /** Return an exception signalling a fatal error having a message + * formed from MSGFORMAT and ARGS, as for String.format. */ + public static Error fatal(String msgFormat, Object... args) { + return new Error(String.format(msgFormat, args)); + } + + /** Return the string S padded with FILL to TOLEN characters. Padding + * is on the left if PADONLEFT, and otherwise on the right. If S is + * already at least TOLEN characters, returns S. */ + public static String pad(String s, Character fill, int toLen, + boolean padOnLeft) { + StringBuilder result = new StringBuilder(toLen); + if (!padOnLeft) { + result.append(s); + } + for (int n = s.length(); n < toLen; n += 1) { + result.append(fill); + } + if (padOnLeft) { + result.append(s); + } + return result.toString(); + } +} diff --git a/src/main/java/chocopy/common/analysis/AbstractNodeAnalyzer.java b/src/main/java/chocopy/common/analysis/AbstractNodeAnalyzer.java new file mode 100644 index 0000000..18615e2 --- /dev/null +++ b/src/main/java/chocopy/common/analysis/AbstractNodeAnalyzer.java @@ -0,0 +1,176 @@ +package chocopy.common.analysis; + +import chocopy.common.astnodes.*; + +/** + * An empty implementation of the {@link NodeAnalyzer} that + * simply returns does nothing and returns null for every + * AST node type. + * + * T is the type of analysis result. + */ +public class AbstractNodeAnalyzer<T> implements NodeAnalyzer<T> { + @Override + public T analyze(AssignStmt node) { + return defaultAction(node); + } + + @Override + public T analyze(BinaryExpr node) { + return defaultAction(node); + } + + @Override + public T analyze(BooleanLiteral node) { + return defaultAction(node); + } + + @Override + public T analyze(CallExpr node) { + return defaultAction(node); + } + + @Override + public T analyze(ClassDef node) { + return defaultAction(node); + } + + @Override + public T analyze(ClassType node) { + return defaultAction(node); + } + + @Override + public T analyze(CompilerError node) { + return defaultAction(node); + } + + @Override + public T analyze(Errors node) { + return defaultAction(node); + } + + @Override + public T analyze(ExprStmt node) { + return defaultAction(node); + } + + @Override + public T analyze(ForStmt node) { + return defaultAction(node); + } + + @Override + public T analyze(FuncDef node) { + return defaultAction(node); + } + + @Override + public T analyze(GlobalDecl node) { + return defaultAction(node); + } + + @Override + public T analyze(Identifier node) { + return defaultAction(node); + } + + @Override + public T analyze(IfExpr node) { + return defaultAction(node); + } + + @Override + public T analyze(IfStmt node) { + return defaultAction(node); + } + + @Override + public T analyze(IndexExpr node) { + return defaultAction(node); + } + + @Override + public T analyze(IntegerLiteral node) { + return defaultAction(node); + } + + @Override + public T analyze(ListExpr node) { + return defaultAction(node); + } + + @Override + public T analyze(ListType node) { + return defaultAction(node); + } + + @Override + public T analyze(MemberExpr node) { + return defaultAction(node); + } + + @Override + public T analyze(MethodCallExpr node) { + return defaultAction(node); + } + + @Override + public T analyze(NoneLiteral node) { + return defaultAction(node); + } + + @Override + public T analyze(NonLocalDecl node) { + return defaultAction(node); + } + + @Override + public T analyze(Program node) { + return defaultAction(node); + } + + @Override + public T analyze(ReturnStmt node) { + return defaultAction(node); + } + + @Override + public T analyze(StringLiteral node) { + return defaultAction(node); + } + + @Override + public T analyze(TypedVar node) { + return defaultAction(node); + } + + @Override + public T analyze(UnaryExpr node) { + return defaultAction(node); + } + + @Override + public T analyze(VarDef node) { + return defaultAction(node); + } + + @Override + public T analyze(WhileStmt node) { + return defaultAction(node); + } + + @Override + public void setDefault(T value) { + defaultValue = value; + } + + @Override + public T defaultAction(Node node) { + return defaultValue; + } + + /** Default value for non-overridden methods. */ + private T defaultValue = null; + +} diff --git a/src/main/java/chocopy/common/analysis/NodeAnalyzer.java b/src/main/java/chocopy/common/analysis/NodeAnalyzer.java new file mode 100644 index 0000000..c65e79b --- /dev/null +++ b/src/main/java/chocopy/common/analysis/NodeAnalyzer.java @@ -0,0 +1,67 @@ +package chocopy.common.analysis; + +import chocopy.common.astnodes.*; + +/** + * This interface can be used to separate logic for various concrete + * classes in the AST class hierarchy. + * + * The idea is that a phase of the analysis is encapsulated in a class + * that implements this interface, and contains an overriding of the + * analyze method for each concrete Node class that needs something + * other than default processing. Each concrete node class, C, implements + * a generic dispatch method that takes a NodeAnalyzer<T> argument and + * calls the overloading of analyze that takes an argument of type C. + * The effect is that anode.dispatch(anAnalyzer) executes the method + * anAnalyzer.analyze that is appropriate to aNode's dynamic type. + * As a result each NodeAnalyzer subtype encapsulates all + * implementations of a particular action on Nodes. Thus, it inverts + * the usual OO pattern in which the implmentations of analyzsis A for + * each different class are scattered among the class bodies + * themselves as overridings of a method A on the Node class. + * + * The class AbstractNodeAnalyzer provides empty default + * implementations for these methods. + * + * The type T is the type of result returned by the encapsulated analysis. + */ +public interface NodeAnalyzer<T> { + + T analyze(AssignStmt node); + T analyze(BinaryExpr node); + T analyze(BooleanLiteral node); + T analyze(CallExpr node); + T analyze(ClassDef node); + T analyze(ClassType node); + T analyze(CompilerError node); + T analyze(Errors node); + T analyze(ExprStmt node); + T analyze(ForStmt node); + T analyze(FuncDef node); + T analyze(GlobalDecl node); + T analyze(Identifier node); + T analyze(IfExpr node); + T analyze(IfStmt node); + T analyze(IndexExpr node); + T analyze(IntegerLiteral node); + T analyze(ListExpr node); + T analyze(ListType node); + T analyze(MemberExpr node); + T analyze(MethodCallExpr node); + T analyze(NoneLiteral node); + T analyze(NonLocalDecl node); + T analyze(Program node); + T analyze(ReturnStmt node); + T analyze(StringLiteral node); + T analyze(TypedVar node); + T analyze(UnaryExpr node); + T analyze(VarDef node); + T analyze(WhileStmt node); + + /** Set the default value returned by calls to analyze that are not + * overridden to VALUE. By default, this is null. */ + void setDefault(T value); + + /** Default value for non-overridden methods. */ + T defaultAction(Node node); +} diff --git a/src/main/java/chocopy/common/analysis/SymbolTable.java b/src/main/java/chocopy/common/analysis/SymbolTable.java new file mode 100644 index 0000000..8e95e5a --- /dev/null +++ b/src/main/java/chocopy/common/analysis/SymbolTable.java @@ -0,0 +1,63 @@ +package chocopy.common.analysis; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** A block-structured symbol table a mapping identifiers to information + * about them of type T in a given declarative region. */ +public class SymbolTable<T> { + + /** Contents of the current (innermost) region. */ + private final Map<String, T> tab = new HashMap<>(); + /** Enclosing block. */ + private final SymbolTable<T> parent; + + /** A table representing a region nested in that represented by + * PARENT0. */ + public SymbolTable(SymbolTable<T> parent0) { + parent = parent0; + } + + /** A top-level symbol table. */ + public SymbolTable() { + this.parent = null; + } + + /** Returns the mapping of NAME in the innermost nested region + * containing this one. */ + public T get(String name) { + if (tab.containsKey(name)) { + return tab.get(name); + } else if (parent != null) { + return parent.get(name); + } else { + return null; + } + } + + /** Adds a new mapping of NAME -> VALUE to the current region, possibly + * shadowing mappings in the enclosing parent. Returns modified table. */ + public SymbolTable<T> put(String name, T value) { + tab.put(name, value); + return this; + } + + /** Returns whether NAME has a mapping in this region (ignoring + * enclosing regions. */ + public boolean declares(String name) { + return tab.containsKey(name); + } + + /** Returns all the names declared this region (ignoring enclosing + * regions). */ + public Set<String> getDeclaredSymbols() { + return tab.keySet(); + } + + /** Returns the parent, or null if this is the top level. */ + public SymbolTable<T> getParent() { + return this.parent; + } + +} diff --git a/src/main/java/chocopy/common/analysis/types/ClassValueType.java b/src/main/java/chocopy/common/analysis/types/ClassValueType.java new file mode 100644 index 0000000..6e91683 --- /dev/null +++ b/src/main/java/chocopy/common/analysis/types/ClassValueType.java @@ -0,0 +1,53 @@ +package chocopy.common.analysis.types; + +import java.util.Objects; + +import chocopy.common.astnodes.ClassType; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** Represents the semantic value of a simple class reference. */ +public class ClassValueType extends ValueType { + + /** The name of the class. */ + private final String className; + + /** A class type for the class named CLASSNAME. */ + @JsonCreator + public ClassValueType(@JsonProperty String className) { + this.className = className; + } + + /** A class type for the class referenced by CLASSTYPEANNOTATION. */ + public ClassValueType(ClassType classTypeAnnotation) { + this.className = classTypeAnnotation.className; + } + + @Override + @JsonProperty + public String className() { + return className; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ClassValueType classType = (ClassValueType) o; + return Objects.equals(className, classType.className); + } + + @Override + public int hashCode() { + return Objects.hash(className); + } + + @Override + public String toString() { + return className; + } +} diff --git a/src/main/java/chocopy/common/analysis/types/FuncType.java b/src/main/java/chocopy/common/analysis/types/FuncType.java new file mode 100644 index 0000000..2dd0072 --- /dev/null +++ b/src/main/java/chocopy/common/analysis/types/FuncType.java @@ -0,0 +1,46 @@ +package chocopy.common.analysis.types; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonCreator; + +/** Semantic information for a function or method. */ +public class FuncType extends SymbolType { + + /** Types of parameters. */ + public final List<ValueType> parameters; + /** Function's return type. */ + public final ValueType returnType; + + /** Create a FuncType returning RETURNTYPE0, intiallly parapeterless. */ + public FuncType(ValueType returnType0) { + this(new ArrayList<>(), returnType0); + } + + + /** Create a FuncType for NAME0 with formal parameter types + * PARAMETERS0, returning type RETURNTYPE0. */ + @JsonCreator + public FuncType(List<ValueType> parameters0, + ValueType returnType0) { + this.parameters = parameters0; + this.returnType = returnType0; + } + + @Override + public boolean isFuncType() { + return true; + } + + /** Return the type of the K-th parameter. */ + public ValueType getParamType(int k) { + return parameters.get(k); + } + + @Override + public String toString() { + return "<function>"; + } + +} diff --git a/src/main/java/chocopy/common/analysis/types/ListValueType.java b/src/main/java/chocopy/common/analysis/types/ListValueType.java new file mode 100644 index 0000000..f189399 --- /dev/null +++ b/src/main/java/chocopy/common/analysis/types/ListValueType.java @@ -0,0 +1,58 @@ +package chocopy.common.analysis.types; + +import java.util.Objects; + +import chocopy.common.astnodes.ListType; +import com.fasterxml.jackson.annotation.JsonCreator; + +/** Represents a semantic value of a list type denotation. */ +public class ListValueType extends ValueType { + + /** This ListValueType represents [ELEMENTTYPE]. */ + public final ValueType elementType; + + /** Represents [ELEMENTTYPE]. */ + @JsonCreator + public ListValueType(SymbolType elementType) { + this.elementType = (ValueType) elementType; + } + + /** Represents [<type>], where <type> is that denoted in TYPEANNOTATION. */ + public ListValueType(ListType typeAnnotation) { + elementType + = ValueType.annotationToValueType(typeAnnotation.elementType); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ListValueType listType = (ListValueType) o; + return Objects.equals(elementType, listType.elementType); + } + + @Override + public int hashCode() { + return Objects.hash(elementType); + } + + @Override + public String toString() { + return "[" + elementType.toString() + "]"; + } + + /** Returns true iff I represent [T]. */ + @Override + public boolean isListType() { + return true; + } + + @Override + public ValueType elementType() { + return elementType; + } +} diff --git a/src/main/java/chocopy/common/analysis/types/SymbolType.java b/src/main/java/chocopy/common/analysis/types/SymbolType.java new file mode 100644 index 0000000..8b5b0e1 --- /dev/null +++ b/src/main/java/chocopy/common/analysis/types/SymbolType.java @@ -0,0 +1,78 @@ +package chocopy.common.analysis.types; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * A symbol type represents the static types of symbols and expressions + * during type-checking. + * + * Symbols such as variables and attributes will typically + * map to a {@link ValueType}. + * + * Symbols such as classes will typically map to a more complex SymbolType. + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "kind") +@JsonSubTypes({ + @JsonSubTypes.Type(FuncType.class), + @JsonSubTypes.Type(ClassValueType.class), + @JsonSubTypes.Type(ListValueType.class)}) +public abstract class SymbolType { + + /** The type object. */ + public static final ClassValueType OBJECT_TYPE = + new ClassValueType("object"); + /** The type int. */ + public static final ClassValueType INT_TYPE = new ClassValueType("int"); + /** The type str. */ + public static final ClassValueType STR_TYPE = new ClassValueType("str"); + /** The type bool. */ + public static final ClassValueType BOOL_TYPE = new ClassValueType("bool"); + + /** The type of None. */ + public static final ClassValueType NONE_TYPE = + new ClassValueType("<None>"); + /** The type of []. */ + public static final ClassValueType EMPTY_TYPE = + new ClassValueType("<Empty>"); + + + /** Returns the name of the class, if this is a class type, + * Otherwise null. */ + public String className() { + return null; + } + + /** Return true iff this is a type that does not include the value None. + */ + @JsonIgnore + public boolean isSpecialType() { + return equals(INT_TYPE) || equals(BOOL_TYPE) || equals(STR_TYPE); + } + + @JsonIgnore + public boolean isListType() { + return false; + } + + @JsonIgnore + public boolean isFuncType() { + return false; + } + + /** Return true iff this type represents a kind of assignable value. */ + @JsonIgnore + public boolean isValueType() { + return false; + } + + /** For list types, return the type of the elements; otherwise null. */ + @JsonIgnore + public ValueType elementType() { + return null; + } + +} diff --git a/src/main/java/chocopy/common/analysis/types/ValueType.java b/src/main/java/chocopy/common/analysis/types/ValueType.java new file mode 100644 index 0000000..f4975cc --- /dev/null +++ b/src/main/java/chocopy/common/analysis/types/ValueType.java @@ -0,0 +1,32 @@ +package chocopy.common.analysis.types; + +import chocopy.common.astnodes.ClassType; +import chocopy.common.astnodes.ListType; +import chocopy.common.astnodes.TypeAnnotation; + +/** + * A ValueType references types that are assigned to variables and + * expressions. + * + * In particular, ValueType can be a {@link ClassValueType} (e.g. "int") or + * a {@link ListValueType} (e.g. "[int]"). + */ + +public abstract class ValueType extends SymbolType { + + /** Returns the type corresponding to ANNOTATION. */ + public static ValueType annotationToValueType(TypeAnnotation annotation) { + if (annotation instanceof ClassType) { + return new ClassValueType((ClassType) annotation); + } else { + assert annotation instanceof ListType; + return new ListValueType((ListType) annotation); + } + } + + @Override + public boolean isValueType() { + return true; + } + +} diff --git a/src/main/java/chocopy/common/astnodes/AssignStmt.java b/src/main/java/chocopy/common/astnodes/AssignStmt.java new file mode 100644 index 0000000..02c2cfc --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/AssignStmt.java @@ -0,0 +1,28 @@ +package chocopy.common.astnodes; + +import java.util.List; +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Single and multiple assignments. */ +public class AssignStmt extends Stmt { + /** List of left-hand sides. */ + public final List<Expr> targets; + /** Right-hand-side value to be assigned. */ + public final Expr value; + + /** AST for TARGETS[0] = TARGETS[1] = ... = VALUE spanning source locations + * [LEFT..RIGHT]. + */ + public AssignStmt(Location left, Location right, + List<Expr> targets, Expr value) { + super(left, right); + this.targets = targets; + this.value = value; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/BinaryExpr.java b/src/main/java/chocopy/common/astnodes/BinaryExpr.java new file mode 100644 index 0000000..f919652 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/BinaryExpr.java @@ -0,0 +1,30 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** <operand> <operator> <operand>. */ +public class BinaryExpr extends Expr { + + /** Left operand. */ + public final Expr left; + /** Operator name. */ + public final String operator; + /** Right operand. */ + public final Expr right; + + /** An AST for expressions of the form LEFTEXPR OP RIGHTEXPR + * from text in range [LEFTLOC..RIGHTLOC]. */ + public BinaryExpr(Location leftLoc, Location rightLoc, Expr leftExpr, + String op, Expr rightExpr) { + super(leftLoc, rightLoc); + left = leftExpr; + operator = op; + right = rightExpr; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/BooleanLiteral.java b/src/main/java/chocopy/common/astnodes/BooleanLiteral.java new file mode 100644 index 0000000..e087eb0 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/BooleanLiteral.java @@ -0,0 +1,23 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Literals True or False. */ +public final class BooleanLiteral extends Literal { + + /** True iff I represent True. */ + public final boolean value; + + /** An AST for the token True or False at [LEFT..RIGHT], depending on + * VALUE. */ + public BooleanLiteral(Location left, Location right, boolean value) { + super(left, right); + this.value = value; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/CallExpr.java b/src/main/java/chocopy/common/astnodes/CallExpr.java new file mode 100644 index 0000000..1d523de --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/CallExpr.java @@ -0,0 +1,28 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** A function call. */ +public class CallExpr extends Expr { + + /** The called function. */ + public final Identifier function; + /** The actual parameter expressions. */ + public final List<Expr> args; + + /** AST for FUNCTION(ARGS) at [LEFT..RIGHT]. */ + public CallExpr(Location left, Location right, Identifier function, + List<Expr> args) { + super(left, right); + this.function = function; + this.args = args; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/ClassDef.java b/src/main/java/chocopy/common/astnodes/ClassDef.java new file mode 100644 index 0000000..dad7e2a --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/ClassDef.java @@ -0,0 +1,41 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** A class definition. */ +public class ClassDef extends Declaration { + + /** Name of the declared class. */ + public final Identifier name; + /** Name of the parent class. */ + public final Identifier superClass; + /** Body of the class. */ + public final List<Declaration> declarations; + + /** An AST for class + * NAME(SUPERCLASS): + * DECLARATIONS. + * spanning source locations [LEFT..RIGHT]. + */ + public ClassDef(Location left, Location right, + Identifier name, Identifier superClass, + List<Declaration> declarations) { + super(left, right); + this.name = name; + this.superClass = superClass; + this.declarations = declarations; + } + + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + + @Override + public Identifier getIdentifier() { + return this.name; + } +} diff --git a/src/main/java/chocopy/common/astnodes/ClassType.java b/src/main/java/chocopy/common/astnodes/ClassType.java new file mode 100644 index 0000000..1c1886d --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/ClassType.java @@ -0,0 +1,22 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** A simple class type name. */ +public final class ClassType extends TypeAnnotation { + + /** The denotation of the class in source. */ + public final String className; + + /** An AST denoting a type named CLASSNAME0 at [LEFT..RIGHT]. */ + public ClassType(Location left, Location right, String className0) { + super(left, right); + className = className0; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/CompilerError.java b/src/main/java/chocopy/common/astnodes/CompilerError.java new file mode 100644 index 0000000..092a1de --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/CompilerError.java @@ -0,0 +1,57 @@ +package chocopy.common.astnodes; + +import java.util.Arrays; +import java.util.Objects; + +import java_cup.runtime.ComplexSymbolFactory.Location; +import com.fasterxml.jackson.annotation.JsonInclude; + +import chocopy.common.analysis.NodeAnalyzer; + +/** Represents a single error. Does not correspond to any Python source + * construct. */ +public class CompilerError extends Node { + + /** Represents an error with message MESSAGE. Iff SYNTAX, it is a + * syntactic error. The error applies to source text at [LEFT..RIGHT]. */ + public CompilerError(Location left, Location right, String message, + boolean syntax) { + super(left, right); + this.message = message; + this.syntax = syntax; + } + + @JsonInclude(JsonInclude.Include.NON_DEFAULT) + public boolean isSyntax() { + return syntax; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + CompilerError that = (CompilerError) o; + return Objects.equals(message, that.message) + && Arrays.equals(getLocation(), that.getLocation()); + } + + @Override + public int hashCode() { + int result = Objects.hash(message); + result = 31 * result + Arrays.hashCode(getLocation()); + return result; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + + /** The error message. */ + public final String message; + /** True if this is a syntax error. */ + private final boolean syntax; +} diff --git a/src/main/java/chocopy/common/astnodes/Declaration.java b/src/main/java/chocopy/common/astnodes/Declaration.java new file mode 100644 index 0000000..ca079d7 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/Declaration.java @@ -0,0 +1,19 @@ +package chocopy.common.astnodes; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** + * Base of all AST nodes representing definitions or declarations. + */ +public abstract class Declaration extends Node { + + /** A definition or declaration spanning source locations [LEFT..RIGHT]. */ + public Declaration(Location left, Location right) { + super(left, right); + } + + /** Return the identifier defined by this Declaration. */ + @JsonIgnore + public abstract Identifier getIdentifier(); +} diff --git a/src/main/java/chocopy/common/astnodes/Errors.java b/src/main/java/chocopy/common/astnodes/Errors.java new file mode 100644 index 0000000..644cfe3 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/Errors.java @@ -0,0 +1,72 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Collects the error messages in a Program. There is exactly one per + * Program node. */ +public class Errors extends Node { + + /** The accumulated error messages in the order added. */ + public final List<CompilerError> errors; + + /** True iff multiple semantic errors allowed on a node. */ + @JsonIgnore + private boolean allowMultipleErrors; + + /** An Errors whose list of CompilerErrors is ERRORS. The list should be + * modified using this.add. */ + @JsonCreator + public Errors(List<CompilerError> errors) { + super(null, null); + this.errors = errors; + allowMultipleErrors = true; + } + + /** Return true iff there are any errors. */ + public boolean hasErrors() { + return !this.errors.isEmpty(); + } + + /** Prevent multiple semantic errors on the same node. */ + public void suppressMultipleErrors() { + allowMultipleErrors = false; + } + + /** Add a new semantic error message attributed to NODE, with message + * String.format(MESSAGEFORM, ARGS). */ + public void semError(Node node, String messageForm, Object... args) { + if (allowMultipleErrors || !node.hasError()) { + String msg = String.format(messageForm, args); + CompilerError err = new CompilerError(null, null, msg, false); + err.setLocation(node.getLocation()); + add(err); + if (!node.hasError()) { + node.setErrorMsg(msg); + } + } + } + + /** Add a new syntax error message attributed to the source text + * between LEFT and RIGHT, and with message + * String.format(MESSAGEFORM, ARGS). */ + public void syntaxError(Location left, Location right, + String messageForm, Object... args) { + add(new CompilerError(left, right, String.format(messageForm, args), + true)); + } + + /** Add ERR to the list of errors. */ + public void add(CompilerError err) { + errors.add(err); + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/Expr.java b/src/main/java/chocopy/common/astnodes/Expr.java new file mode 100644 index 0000000..6311bd6 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/Expr.java @@ -0,0 +1,48 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.types.SymbolType; +import com.fasterxml.jackson.annotation.JsonInclude; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** + * Base of all AST nodes representing expressions. + * + * There is nothing in this class, but there will be many AST + * node types that have fields that are *any expression*. For those + * cases, having a field of this type will encompass all types of + * expressions such as binary expressions and literals that subclass + * this class. + */ +public abstract class Expr extends Node { + + /** A Python expression spanning source locations [LEFT..RIGHT]. */ + public Expr(Location left, Location right) { + super(left, right); + } + + /** + * The type of the value that this expression evaluates to. + * + * This field is always <tt>null</tt> after the parsing stage, + * but is populated by the typechecker in the semantic analysis + * stage. + * + * After typechecking this field may be <tt>null</tt> only for + * expressions that cannot be assigned a type. In particular, + * {@link NoneLiteral} expressions will not have a typed assigned + * to them. + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + private SymbolType inferredType; + + /** Set getInferredType() to TYPE, returning TYPE. */ + public SymbolType setInferredType(SymbolType type) { + inferredType = type; + return type; + } + + public SymbolType getInferredType() { + return inferredType; + } + +} diff --git a/src/main/java/chocopy/common/astnodes/ExprStmt.java b/src/main/java/chocopy/common/astnodes/ExprStmt.java new file mode 100644 index 0000000..bb0ca3e --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/ExprStmt.java @@ -0,0 +1,23 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Statements consisting of expressions. */ +public final class ExprStmt extends Stmt { + + /** The expression I evaluate. */ + public final Expr expr; + + /** The AST for EXPR spanning source locations [LEFT..RIGHT] + * in a statement context. */ + public ExprStmt(Location left, Location right, Expr expr) { + super(left, right); + this.expr = expr; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/ForStmt.java b/src/main/java/chocopy/common/astnodes/ForStmt.java new file mode 100644 index 0000000..67d6556 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/ForStmt.java @@ -0,0 +1,34 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** For statements. */ +public class ForStmt extends Stmt { + /** Control variable. */ + public final Identifier identifier; + /** Source of values of control statement. */ + public final Expr iterable; + /** Repeated statements. */ + public final List<Stmt> body; + + /** The AST for + * for IDENTIFIER in ITERABLE: + * BODY + * spanning source locations [LEFT..RIGHT]. + */ + public ForStmt(Location left, Location right, + Identifier identifier, Expr iterable, List<Stmt> body) { + super(left, right); + this.identifier = identifier; + this.iterable = iterable; + this.body = body; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/FuncDef.java b/src/main/java/chocopy/common/astnodes/FuncDef.java new file mode 100644 index 0000000..6c1c203 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/FuncDef.java @@ -0,0 +1,48 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Def statements. */ +public class FuncDef extends Declaration { + + /** Defined name. */ + public final Identifier name; + /** Formal parameters. */ + public final List<TypedVar> params; + /** Return type annotation. */ + public final TypeAnnotation returnType; + /** Local-variable,inner-function, global, and nonlocal declarations. */ + public final List<Declaration> declarations; + /** Other statements. */ + public final List<Stmt> statements; + + /** The AST for + * def NAME(PARAMS) -> RETURNTYPE: + * DECLARATIONS + * STATEMENTS + * spanning source locations [LEFT..RIGHT]. + */ + public FuncDef(Location left, Location right, + Identifier name, List<TypedVar> params, + TypeAnnotation returnType, + List<Declaration> declarations, List<Stmt> statements) { + super(left, right); + this.name = name; + this.params = params; + this.returnType = returnType; + this.declarations = declarations; + this.statements = statements; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + + @Override + public Identifier getIdentifier() { + return this.name; + } +} diff --git a/src/main/java/chocopy/common/astnodes/GlobalDecl.java b/src/main/java/chocopy/common/astnodes/GlobalDecl.java new file mode 100644 index 0000000..71622e1 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/GlobalDecl.java @@ -0,0 +1,29 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Declaration of global variable. */ +public class GlobalDecl extends Declaration { + + /** The declared variable. */ + public final Identifier variable; + + /** The AST for the declaration + * global VARIABLE + * spanning source locations [LEFT..RIGHT]. + */ + public GlobalDecl(Location left, Location right, Identifier variable) { + super(left, right); + this.variable = variable; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + + @Override + public Identifier getIdentifier() { + return this.variable; + } +} diff --git a/src/main/java/chocopy/common/astnodes/Identifier.java b/src/main/java/chocopy/common/astnodes/Identifier.java new file mode 100644 index 0000000..b7e43b4 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/Identifier.java @@ -0,0 +1,23 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** A simple identifier. */ +public class Identifier extends Expr { + + /** Text of the identifier. */ + public final String name; + + /** An AST for the variable, method, or parameter named NAME, spanning + * source locations [LEFT..RIGHT]. */ + public Identifier(Location left, Location right, String name) { + super(left, right); + this.name = name; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/IfExpr.java b/src/main/java/chocopy/common/astnodes/IfExpr.java new file mode 100644 index 0000000..5fb2e0d --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/IfExpr.java @@ -0,0 +1,31 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Conditional expressions. */ +public class IfExpr extends Expr { + /** Boolean condition. */ + public final Expr condition; + /** True branch. */ + public final Expr thenExpr; + /** False branch. */ + public final Expr elseExpr; + + /** The AST for + * THENEXPR if CONDITION else ELSEEXPR + * spanning source locations [LEFT..RIGHT]. + */ + public IfExpr(Location left, Location right, + Expr condition, Expr thenExpr, Expr elseExpr) { + super(left, right); + this.condition = condition; + this.thenExpr = thenExpr; + this.elseExpr = elseExpr; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/IfStmt.java b/src/main/java/chocopy/common/astnodes/IfStmt.java new file mode 100644 index 0000000..2566ccf --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/IfStmt.java @@ -0,0 +1,36 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Conditional statement. */ +public class IfStmt extends Stmt { + /** Test condition. */ + public final Expr condition; + /** "True" branch. */ + public final List<Stmt> thenBody; + /** "False" branch. */ + public final List<Stmt> elseBody; + + /** The AST for + * if CONDITION: + * THENBODY + * else: + * ELSEBODY + * spanning source locations [LEFT..RIGHT]. + */ + public IfStmt(Location left, Location right, + Expr condition, List<Stmt> thenBody, List<Stmt> elseBody) { + super(left, right); + this.condition = condition; + this.thenBody = thenBody; + this.elseBody = elseBody; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/IndexExpr.java b/src/main/java/chocopy/common/astnodes/IndexExpr.java new file mode 100644 index 0000000..22cb64c --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/IndexExpr.java @@ -0,0 +1,28 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** List-indexing expression. */ +public class IndexExpr extends Expr { + + /** Indexed list. */ + public final Expr list; + /** Expression for index value. */ + public final Expr index; + + /** The AST for + * LIST[INDEX]. + * spanning source locations [LEFT..RIGHT]. + */ + public IndexExpr(Location left, Location right, Expr list, Expr index) { + super(left, right); + this.list = list; + this.index = index; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/IntegerLiteral.java b/src/main/java/chocopy/common/astnodes/IntegerLiteral.java new file mode 100644 index 0000000..734c959 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/IntegerLiteral.java @@ -0,0 +1,23 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Integer numerals. */ +public final class IntegerLiteral extends Literal { + + /** Value denoted. */ + public final int value; + + /** The AST for the literal VALUE, spanning source + * locations [LEFT..RIGHT]. */ + public IntegerLiteral(Location left, Location right, int value) { + super(left, right); + this.value = value; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/ListExpr.java b/src/main/java/chocopy/common/astnodes/ListExpr.java new file mode 100644 index 0000000..3427d0c --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/ListExpr.java @@ -0,0 +1,27 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** List displays. */ +public final class ListExpr extends Expr { + + /** List of element expressions. */ + public final List<Expr> elements; + + /** The AST for + * [ ELEMENTS ]. + * spanning source locations [LEFT..RIGHT]. + */ + public ListExpr(Location left, Location right, List<Expr> elements) { + super(left, right); + this.elements = elements; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/ListType.java b/src/main/java/chocopy/common/astnodes/ListType.java new file mode 100644 index 0000000..551f1f8 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/ListType.java @@ -0,0 +1,25 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Type denotation for a list type. */ +public final class ListType extends TypeAnnotation { + + /** The element of list element. */ + public final TypeAnnotation elementType; + + /** The AST for the type annotation + * [ ELEMENTTYPE ]. + * spanning source locations [LEFT..RIGHT]. + */ + public ListType(Location left, Location right, TypeAnnotation elementType) { + super(left, right); + this.elementType = elementType; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/Literal.java b/src/main/java/chocopy/common/astnodes/Literal.java new file mode 100644 index 0000000..f5881e6 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/Literal.java @@ -0,0 +1,16 @@ +package chocopy.common.astnodes; + +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** + * Base of all the literal nodes. + * + * There is nothing in this class, but it is useful to isolate + * expressions that are constant literals. + */ +public abstract class Literal extends Expr { + /** A literal spanning source locations [LEFT..RIGHT]. */ + public Literal(Location left, Location right) { + super(left, right); + } +} diff --git a/src/main/java/chocopy/common/astnodes/MemberExpr.java b/src/main/java/chocopy/common/astnodes/MemberExpr.java new file mode 100644 index 0000000..395fc3e --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/MemberExpr.java @@ -0,0 +1,29 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Attribute accessor. */ +public class MemberExpr extends Expr { + + /** Object selected from. */ + public final Expr object; + /** Name of attribute (instance variable or method). */ + public final Identifier member; + + /** The AST for + * OBJECT.MEMBER. + * spanning source locations [LEFT..RIGHT]. + */ + public MemberExpr(Location left, Location right, + Expr object, Identifier member) { + super(left, right); + this.object = object; + this.member = member; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/MethodCallExpr.java b/src/main/java/chocopy/common/astnodes/MethodCallExpr.java new file mode 100644 index 0000000..b6d005c --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/MethodCallExpr.java @@ -0,0 +1,31 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Method calls. */ +public class MethodCallExpr extends Expr { + + /** Expression for the bound method to be called. */ + public final MemberExpr method; + /** Actual parameters. */ + public final List<Expr> args; + + /** The AST for + * METHOD(ARGS). + * spanning source locations [LEFT..RIGHT]. + */ + public MethodCallExpr(Location left, Location right, + MemberExpr method, List<Expr> args) { + super(left, right); + this.method = method; + this.args = args; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/Node.java b/src/main/java/chocopy/common/astnodes/Node.java new file mode 100644 index 0000000..48a5be7 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/Node.java @@ -0,0 +1,174 @@ +package chocopy.common.astnodes; + +import java.io.IOException; + +import chocopy.common.analysis.NodeAnalyzer; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** + * Root of the AST class hierarchy. Every node has a left and right + * location, indicating the start and end of the represented construct + * in the source text. + * + * Every node can be marked with an error message, which serves two purposes: + * 1. It indicates that an error message has been issued for this + * Node, allowing tne program to reduce cascades of error + * messages. + * 2. It aids in debugging by making it convenient to see which + * Nodes have caused an error. + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.EXISTING_PROPERTY, + property = "kind") +/* List of all concrete subclasses of Node. */ +@JsonSubTypes({ + @JsonSubTypes.Type(AssignStmt.class), + @JsonSubTypes.Type(BinaryExpr.class), + @JsonSubTypes.Type(BooleanLiteral.class), + @JsonSubTypes.Type(CallExpr.class), + @JsonSubTypes.Type(ClassDef.class), + @JsonSubTypes.Type(ClassType.class), + @JsonSubTypes.Type(CompilerError.class), + @JsonSubTypes.Type(Errors.class), + @JsonSubTypes.Type(ExprStmt.class), + @JsonSubTypes.Type(ForStmt.class), + @JsonSubTypes.Type(FuncDef.class), + @JsonSubTypes.Type(GlobalDecl.class), + @JsonSubTypes.Type(Identifier.class), + @JsonSubTypes.Type(IfExpr.class), + @JsonSubTypes.Type(IfStmt.class), + @JsonSubTypes.Type(IndexExpr.class), + @JsonSubTypes.Type(IntegerLiteral.class), + @JsonSubTypes.Type(ListExpr.class), + @JsonSubTypes.Type(ListType.class), + @JsonSubTypes.Type(MemberExpr.class), + @JsonSubTypes.Type(MethodCallExpr.class), + @JsonSubTypes.Type(NoneLiteral.class), + @JsonSubTypes.Type(NonLocalDecl.class), + @JsonSubTypes.Type(Program.class), + @JsonSubTypes.Type(ReturnStmt.class), + @JsonSubTypes.Type(StringLiteral.class), + @JsonSubTypes.Type(TypedVar.class), + @JsonSubTypes.Type(UnaryExpr.class), + @JsonSubTypes.Type(VarDef.class), + @JsonSubTypes.Type(WhileStmt.class), +}) +public abstract class Node { + + /** Node-type indicator for JSON form. */ + public final String kind; + + /** Source position information: 0: line number of start, 1: column number + * of start, 2: line number of end, 3: column number of end. */ + private final int[] location = new int[4]; + + /** First error message "blamed" on this Node. When non-null, indicates + * that an error has been found in this Node. */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private String errorMsg; + + /** A Node corresponding to source text between LEFT and RIGHT. */ + public Node(Location left, Location right) { + if (left != null) { + location[0] = left.getLine(); + location[1] = left.getColumn(); + } + if (right != null) { + location[2] = right.getLine(); + location[3] = right.getColumn(); + } + this.kind = getClass().getSimpleName(); + this.errorMsg = null; + } + + /** Return my source location as + * { <first line>, <first column>, <last line>, <last column> }. + * Result should not be modified, and contents will change after + * setLocation(). */ + public int[] getLocation() { + return location; + } + + /** Copy LOCATION as getLocation(). */ + public void setLocation(final int[] location) { + System.arraycopy(location, 0, this.location, 0, 4); + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String msg) { + this.errorMsg = msg; + } + + /** Return true iff I have been marked with an error message. */ + @JsonIgnore + public boolean hasError() { + return this.errorMsg != null; + } + + /** Invoke ANALYZER on me as a node of static type T. See the comment + * on NodeAnalyzer. Returns modified Node. */ + public abstract <T> T dispatch(NodeAnalyzer<T> analyzer); + + /** Print out the AST in JSON format. */ + @Override + public String toString() { + try { + return toJSON(); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + /** Return a serialization of this node in JSON fprmat. */ + public String toJSON() throws JsonProcessingException { + return mapper.writeValueAsString(this); + } + + /** Mapper to-and-from serialized JSON. */ + private static ObjectMapper mapper = new ObjectMapper(); + + static { + mapper.enable(SerializationFeature.INDENT_OUTPUT); + mapper.registerModule(new ParameterNamesModule()); + } + + /** Returns a T from JSON, a JSON-eerialized T value with class + * CLAS. */ + public static <T> T fromJSON(String json, Class<T> clas) + throws IOException { + return mapper.readValue(json, clas); + } + + /** Returns the result of converting JSON, a JSon-serialization of + * a Node value, into the value it serializes. */ + public static Node fromJSON(String json) + throws IOException { + return fromJSON(json, Node.class); + } + + /** Returns the result of converting TREE to the value of type T + * that it represents, where CLAS reflects T. */ + public static <T> T fromJSON(JsonNode tree, Class<T> clas) + throws IOException { + return mapper.treeToValue(tree, clas); + } + + /** Returns the translation of serialized value SRC into the + * corresponding JSON tree. */ + public static JsonNode readTree(String src) throws IOException { + return mapper.readTree(src); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/NonLocalDecl.java b/src/main/java/chocopy/common/astnodes/NonLocalDecl.java new file mode 100644 index 0000000..63202ee --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/NonLocalDecl.java @@ -0,0 +1,29 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Nonlocal declaration. */ +public class NonLocalDecl extends Declaration { + + /** Name of identifier being declared. */ + public final Identifier variable; + + /** The AST for + * nonlocal VARIABLE + * spanning source locations [LEFT..RIGHT]. + */ + public NonLocalDecl(Location left, Location right, Identifier variable) { + super(left, right); + this.variable = variable; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + + @Override + public Identifier getIdentifier() { + return this.variable; + } +} diff --git a/src/main/java/chocopy/common/astnodes/NoneLiteral.java b/src/main/java/chocopy/common/astnodes/NoneLiteral.java new file mode 100644 index 0000000..b51a581 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/NoneLiteral.java @@ -0,0 +1,17 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** The expression 'None'. */ +public final class NoneLiteral extends Literal { + + /** The AST for None, spanning source locations [LEFT..RIGHT]. */ + public NoneLiteral(Location left, Location right) { + super(left, right); + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } +} diff --git a/src/main/java/chocopy/common/astnodes/Program.java b/src/main/java/chocopy/common/astnodes/Program.java new file mode 100644 index 0000000..a77f356 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/Program.java @@ -0,0 +1,56 @@ +package chocopy.common.astnodes; + +import java.util.List; +import java.util.ArrayList; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** An entire Chocopy program. */ +public class Program extends Node { + + /** Initial variable, class, and function declarations. */ + public final List<Declaration> declarations; + /** Trailing statements. */ + public final List<Stmt> statements; + /** Accumulated errors. */ + public final Errors errors; + + /** The AST for the program + * DECLARATIONS + * STATEMENTS + * spanning source locations [LEFT..RIGHT]. + * + * ERRORS is the container for all error messages applying to the + * program. */ + public Program(Location left, Location right, + List<Declaration> declarations, List<Stmt> statements, + Errors errors) { + super(left, right); + this.declarations = declarations; + this.statements = statements; + if (errors == null) { + this.errors = new Errors(new ArrayList<CompilerError>()); + } else { + this.errors = errors; + } + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + + /** Returns true iff there is at least one error in the program. */ + @JsonIgnore + public boolean hasErrors() { + return errors.hasErrors(); + } + + /** A convenience method returning the list of all CompilerErrors for + * this program. */ + @JsonIgnore + public List<CompilerError> getErrorList() { + return errors.errors; + } +} diff --git a/src/main/java/chocopy/common/astnodes/ReturnStmt.java b/src/main/java/chocopy/common/astnodes/ReturnStmt.java new file mode 100644 index 0000000..214d17a --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/ReturnStmt.java @@ -0,0 +1,25 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Return from function. */ +public class ReturnStmt extends Stmt { + + /** Returned value. */ + public final Expr value; + + /** The AST for + * return VALUE + * spanning source locations [LEFT..RIGHT]. + */ + public ReturnStmt(Location left, Location right, Expr value) { + super(left, right); + this.value = value; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/Stmt.java b/src/main/java/chocopy/common/astnodes/Stmt.java new file mode 100644 index 0000000..dc63f63 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/Stmt.java @@ -0,0 +1,20 @@ +package chocopy.common.astnodes; + +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** + * Base of all AST nodes representing statements. + * + * There is nothing in this class, but there will be some AST + * node types that have fields that are *any statement* or a + * list of statements. For those cases, having a field of this type will + * encompass all types of statements such as expression statements, + * if statements, while statements, etc. + * + */ +public abstract class Stmt extends Node { + /** A statement spanning source locations [LEFT..RIGHT]. */ + public Stmt(Location left, Location right) { + super(left, right); + } +} diff --git a/src/main/java/chocopy/common/astnodes/StringLiteral.java b/src/main/java/chocopy/common/astnodes/StringLiteral.java new file mode 100644 index 0000000..de17dd1 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/StringLiteral.java @@ -0,0 +1,23 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** String constants. */ +public final class StringLiteral extends Literal { + + /** Contents of the literal, not including quotation marks. */ + public final String value; + + /** The AST for a string literal containing VALUE, spanning source + * locations [LEFT..RIGHT]. */ + public StringLiteral(Location left, Location right, String value) { + super(left, right); + this.value = value; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/TypeAnnotation.java b/src/main/java/chocopy/common/astnodes/TypeAnnotation.java new file mode 100644 index 0000000..4ef66ad --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/TypeAnnotation.java @@ -0,0 +1,14 @@ +package chocopy.common.astnodes; + +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** + * Base of all AST nodes representing type annotations (list or class + * types. + */ +public abstract class TypeAnnotation extends Node { + /** An annotation spanning source locations [LEFT..RIGHT]. */ + public TypeAnnotation(Location left, Location right) { + super(left, right); + } +} diff --git a/src/main/java/chocopy/common/astnodes/TypedVar.java b/src/main/java/chocopy/common/astnodes/TypedVar.java new file mode 100644 index 0000000..279890d --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/TypedVar.java @@ -0,0 +1,29 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** An identifier with attached type annotation. */ +public class TypedVar extends Node { + + /** The typed identifier. */ + public final Identifier identifier; + /** The declared type. */ + public final TypeAnnotation type; + + /** The AST for + * IDENTIFIER : TYPE. + * spanning source locations [LEFT..RIGHT]. + */ + public TypedVar(Location left, Location right, + Identifier identifier, TypeAnnotation type) { + super(left, right); + this.identifier = identifier; + this.type = type; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/UnaryExpr.java b/src/main/java/chocopy/common/astnodes/UnaryExpr.java new file mode 100644 index 0000000..4216380 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/UnaryExpr.java @@ -0,0 +1,29 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** An expression applying a unary operator. */ +public class UnaryExpr extends Expr { + + /** The text representation of the operator. */ + public final String operator; + /** The operand to which it is applied. */ + public final Expr operand; + + /** The AST for + * OPERATOR OPERAND + * spanning source locations [LEFT..RIGHT]. + */ + public UnaryExpr(Location left, Location right, + String operator, Expr operand) { + super(left, right); + this.operator = operator; + this.operand = operand; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/astnodes/VarDef.java b/src/main/java/chocopy/common/astnodes/VarDef.java new file mode 100644 index 0000000..27c093b --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/VarDef.java @@ -0,0 +1,32 @@ +package chocopy.common.astnodes; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** A declaration of a variable (i.e., with type annotation). */ +public class VarDef extends Declaration { + /** The variable and its assigned type. */ + public final TypedVar var; + /** The initial value assigned. */ + public final Literal value; + + /** The AST for + * VAR = VALUE + * where VAR has a type annotation, and spanning source + * locations [LEFT..RIGHT]. */ + public VarDef(Location left, Location right, TypedVar var, Literal value) { + super(left, right); + this.var = var; + this.value = value; + } + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + + /** The identifier defined by this declaration. */ + @Override + public Identifier getIdentifier() { + return this.var.identifier; + } +} diff --git a/src/main/java/chocopy/common/astnodes/WhileStmt.java b/src/main/java/chocopy/common/astnodes/WhileStmt.java new file mode 100644 index 0000000..122b6d5 --- /dev/null +++ b/src/main/java/chocopy/common/astnodes/WhileStmt.java @@ -0,0 +1,32 @@ +package chocopy.common.astnodes; + +import java.util.List; + +import chocopy.common.analysis.NodeAnalyzer; +import java_cup.runtime.ComplexSymbolFactory.Location; + +/** Indefinite repetition construct. */ +public class WhileStmt extends Stmt { + /** Test for whether to continue. */ + public final Expr condition; + /** Loop body. */ + public final List<Stmt> body; + + /** The AST for + * while CONDITION: + * BODY + * spanning source locations [LEFT..RIGHT]. + */ + public WhileStmt(Location left, Location right, + Expr condition, List<Stmt> body) { + super(left, right); + this.condition = condition; + this.body = body; + } + + + public <T> T dispatch(NodeAnalyzer<T> analyzer) { + return analyzer.analyze(this); + } + +} diff --git a/src/main/java/chocopy/common/codegen/AttrInfo.java b/src/main/java/chocopy/common/codegen/AttrInfo.java new file mode 100644 index 0000000..ec00568 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/AttrInfo.java @@ -0,0 +1,16 @@ +package chocopy.common.codegen; + +import chocopy.common.analysis.types.ValueType; +import chocopy.common.astnodes.Literal; + +/** Information concerning an instance variable. */ +public class AttrInfo extends VarInfo { + + /** + * A descriptor for an attribute named ATTRNAME of type VARTYPE whose + * initial value, if any, is a constant specified by INITIALVALUE + * (it is otherwise null). */ + public AttrInfo(String attrName, ValueType varType, Literal initialValue) { + super(attrName, varType, initialValue); + } +} diff --git a/src/main/java/chocopy/common/codegen/ClassInfo.java b/src/main/java/chocopy/common/codegen/ClassInfo.java new file mode 100644 index 0000000..0f362de --- /dev/null +++ b/src/main/java/chocopy/common/codegen/ClassInfo.java @@ -0,0 +1,137 @@ +package chocopy.common.codegen; + +import java.util.ArrayList; +import java.util.List; + +/** Information for code generation a class. */ +public class ClassInfo extends SymbolInfo { + + /** Name of class. */ + protected final String className; + + /** Information about instance variables of the class. */ + public final List<AttrInfo> attributes; + /** Information about methods of the class. */ + public final List<FuncInfo> methods; + + /** Tag indicating type of value: + * 0: (reserved) + * 1: int + * 2: bool + * 3: str + * -1: [T] for any T + * >3: User-defined types. + */ + protected final int typeTag; + /** Label of area containing initial instance values. */ + protected Label prototypeLabel; + /** Label of area containing method-dispatching table. */ + protected Label dispatchTableLabel; + + /** + * A descriptor for a class named CLASSNAME identified by runtime tag + * TYPETAG, and having the class denoted by SUPERCLASSINFO as its + * superclass. The latter is null iff the class is object. + */ + public ClassInfo(String className, int typeTag, ClassInfo superClassInfo) { + this.className = className; + this.typeTag = typeTag; + prototypeLabel = + new Label(String.format("$%s$%s", className, "prototype")); + dispatchTableLabel = + new Label(String.format("$%s$%s", className, "dispatchTable")); + attributes = new ArrayList<>(); + methods = new ArrayList<>(); + if (superClassInfo != null) { + attributes.addAll(superClassInfo.attributes); + methods.addAll(superClassInfo.methods); + } + } + + /** Add an attribute described by ATTRINFO. */ + public void addAttribute(AttrInfo attrInfo) { + this.attributes.add(attrInfo); + } + + /** Add a method described by FUNCINFO, overriding any inherited method of + * that name if necessary. */ + public void addMethod(FuncInfo funcInfo) { + String methodName = funcInfo.getBaseName(); + int idx = this.getMethodIndex(methodName); + if (idx >= 0) { + this.methods.set(idx, funcInfo); + } else { + this.methods.add(funcInfo); + } + } + + /** Return my type tag. */ + public int getTypeTag() { + return typeTag; + } + + /** Returns the address of this class's prototype object (a label). */ + public Label getPrototypeLabel() { + return prototypeLabel; + } + + /** Returns the address of this class's dispatch table (a label). */ + public Label getDispatchTableLabel() { + return dispatchTableLabel; + } + + /** + * Returns the index of the attribute named ATTRNAME in order of + * definition. + * + * This index takes into account inherited attribute and returns + * the index of an attribute as a slot index in its object + * layout (exlcuding the object header). Attributes are numbered + * from 0; the result is an index, and not a byte offset. + */ + public int getAttributeIndex(String attrName) { + for (int i = 0; i < attributes.size(); i++) { + if (attributes.get(i).getVarName().equals(attrName)) { + return i; + } + } + return -1; + } + + /** + * Returns the index of the method named METHODNAME in order of + * definition. + * + * This index takes into account inherited and overridden methods + * and returns the index of the method as a slot number (not a byte + * offset) in the dispatch table. + */ + public int getMethodIndex(String methodName) { + for (int i = 0; i < methods.size(); i++) { + if (methods.get(i).getBaseName().equals(methodName)) { + return i; + } + } + return -1; + } + + public String getClassName() { + return className; + } + + /** + * Returns the list of attributes of this class, + * in order of the object's layout. + */ + public List<AttrInfo> getAttributes() { + return attributes; + } + + /** + * Returns the list of methods of this class, + * in order of the object's dispatch table. + */ + public List<FuncInfo> getMethods() { + return methods; + } +} diff --git a/src/main/java/chocopy/common/codegen/CodeGenBase.java b/src/main/java/chocopy/common/codegen/CodeGenBase.java new file mode 100644 index 0000000..3e3e8f6 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/CodeGenBase.java @@ -0,0 +1,940 @@ +package chocopy.common.codegen; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import chocopy.common.analysis.SymbolTable; +import chocopy.common.analysis.types.SymbolType; +import chocopy.common.analysis.types.ValueType; +import chocopy.common.astnodes.BooleanLiteral; +import chocopy.common.astnodes.ClassDef; +import chocopy.common.astnodes.Declaration; +import chocopy.common.astnodes.FuncDef; +import chocopy.common.astnodes.GlobalDecl; +import chocopy.common.astnodes.IntegerLiteral; +import chocopy.common.astnodes.Literal; +import chocopy.common.astnodes.NonLocalDecl; +import chocopy.common.astnodes.Program; +import chocopy.common.astnodes.Stmt; +import chocopy.common.astnodes.TypedVar; +import chocopy.common.astnodes.VarDef; +import chocopy.common.analysis.AbstractNodeAnalyzer; + +import static chocopy.common.Utils.*; +import static chocopy.common.codegen.RiscVBackend.Register.*; + +/** + * The code generator for a ChocoPy program. + * + * This class implements logic to analyze all declarations + * in a program and create descriptors for classes, functions, + * methods, variables (global and local), and attributes. This + * logic also builds symbol tables for globals and individual functions. + * + * This class also implements logic to emit global variables, object + * prototypes and dispatch tables, as well as int/str/bool constants. + * + * However, this class is abstract because it does not implement logic + * for emitting executable code in bodies of user-defined functions + * as well as in top-level statements. This class should be extended with + * implementations for such logic. + * + * All non-public members of this class are `protected`, and can be + * overridden by sub-classes to extend change functionality. + * + * The SymbolInfo classes can also be overridden. If say you want to use + * your own extended FuncInfo called MyFuncInfo (that extends FuncInfo), + * then override the makeFuncInfo() method of this class to + * `return new MyFuncInfo(...)` instead. This is probably not needed, though. + */ +public abstract class CodeGenBase { + + /** The location of the text resources containing common library code. */ + protected static final String LIBRARY_CODE_DIR + = "chocopy/common/codegen/asm/"; + + /** The backend that emits assembly. */ + protected final RiscVBackend backend; + + /** Convenience variable: the word size for the current back end. */ + protected final int wordSize; + + /** A counter for generating unique class type tags. */ + protected int nextTypeTag = 0; + + /** A counter used to generate unique local label names. */ + protected int nextLabelSuffix = 0; + + /** Predefined classes. The list "class" is a fake class; we use it only + * to emit a prototype object for empty lists. */ + protected ClassInfo + objectClass, intClass, boolClass, strClass, listClass; + + /** Predefined functions. */ + protected FuncInfo printFunc, lenFunc, inputFunc; + + /** + * A list of global variables, whose initial values are + * emitted in the backend. + */ + protected final List<GlobalVarInfo> globalVars = new ArrayList<>(); + + /** + * A list of program classes, whose prototype objects and dispatch + * tables are emitted in the backend. + */ + protected final List<ClassInfo> classes = new ArrayList<>(); + + /** + * A list of functions (including methods and nested functions) whose + * bodies are emitted in the backend. + */ + protected final List<FuncInfo> functions = new ArrayList<>(); + + /** Label for built-in routine: alloc. */ + protected final Label objectAllocLabel = new Label("alloc"); + + /** Label for built-in routine: alloc2. */ + protected final Label objectAllocResizeLabel = new Label("alloc2"); + + /** Label for built-in routine: abort. */ + protected final Label abortLabel = new Label("abort"); + + /** Label for built-in routine: heap.init. */ + protected final Label heapInitLabel = new Label("heap.init"); + + /** Error codes. */ + protected final int ERROR_ARG = 1, ERROR_DIV_ZERO = 2, ERROR_OOB = 3, + ERROR_NONE = 4, ERROR_OOM = 5, ERROR_NYI = 6; + + /** Size of heap memory. */ + protected final int HEAP_SIZE_BYTES = 1024 * 1024 * 32; + + /** Ecall numbers for intrinsic routines. */ + protected final int + EXIT_ECALL = 10, + EXIT2_ECALL = 17, + PRINT_STRING_ECALL = 4, + PRINT_CHAR_ECALL = 11, + PRINT_INT_ECALL = 1, + SBRK_ECALL = 9; + + /** + * The symbol table that maps global names to information about + * the bound global variables, global functions, or classes. + */ + protected final SymbolTable<SymbolInfo> globalSymbols = new SymbolTable<>(); + + /** + * A utility for caching constants and generating labels for constants. + */ + protected final Constants constants = new Constants(); + + /** The object header size, in words (includes type tag, size, + * and dispatch table pointer). */ + public static final int HEADER_SIZE = 3; + + /** + * Initializes a code generator for ChocoPy that uses BACKEND to emit + * assembly code. + * + * The constructor creates Info objects for predefined functions, + * classes, methods, and built-in routines. + */ + public CodeGenBase(RiscVBackend backend) { + this.backend = backend; + wordSize = backend.getWordSize(); + + initClasses(); + initFunctions(); + initAsmConstants(); + } + + /** Return a fresh type tag. */ + protected int getNextTypeTag() { + return nextTypeTag++; + } + + /** Returns the next unique label suffix. */ + protected int getNextLabelSuffix() { + return nextLabelSuffix++; + } + + /** + * Return a fresh label. + * + * This label is guaranteed to be unique amongst labels + * generated by invoking this method. All such labels + * have a prefix of `label_`. + * + * This is useful to generate local labels in + * function bodies (e.g. for targets of jumps), + * where the name does not matter in general. + */ + protected Label generateLocalLabel() { + return new Label(String.format("label_%d", getNextLabelSuffix())); + } + + /** + * Generates assembly code for PROGRAM. + * + * This is the main driver that calls internal methods for + * emitting DATA section (globals, constants, prototypes, etc) + * as well as the the CODE section (predefined functions, built-in + * routines, and user-defined functions). + */ + public void generate(Program program) { + analyzeProgram(program); + + backend.startData(); + + for (ClassInfo classInfo : this.classes) { + emitPrototype(classInfo); + } + + for (ClassInfo classInfo : this.classes) { + emitDispatchTable(classInfo); + } + + for (GlobalVarInfo global : this.globalVars) { + backend.emitGlobalLabel(global.getLabel()); + emitConstant(global.getInitialValue(), global.getVarType(), + String.format("Initial value of global var: %s", + global.getVarName())); + } + + backend.startCode(); + + Label mainLabel = new Label("main"); + backend.emitGlobalLabel(mainLabel); + backend.emitLUI(A0, HEAP_SIZE_BYTES >> 12, + "Initialize heap size (in multiples of 4KB)"); + backend.emitADD(S11, S11, A0, "Save heap size"); + backend.emitJAL(heapInitLabel, "Call heap.init routine"); + backend.emitMV(GP, A0, "Initialize heap pointer"); + backend.emitMV(S10, GP, "Set beginning of heap"); + backend.emitADD(S11, S10, S11, + "Set end of heap (= start of heap + heap size)"); + backend.emitMV(RA, ZERO, "No normal return from main program."); + backend.emitMV(FP, ZERO, "No preceding frame."); + + emitTopLevel(program.statements); + + for (FuncInfo funcInfo : this.functions) { + funcInfo.emitBody(); + } + + emitStdFunc("alloc"); + emitStdFunc("alloc2"); + emitStdFunc("abort"); + emitStdFunc("heap.init"); + + emitCustomCode(); + + backend.startData(); + emitConstants(); + } + + /** Create descriptors and symbols for builtin classes and methods. */ + protected void initClasses() { + FuncInfo objectInit = + makeFuncInfo("object.__init__", 0, SymbolType.NONE_TYPE, + globalSymbols, null, this::emitStdFunc); + objectInit.addParam(makeStackVarInfo("self", null, null, objectInit)); + functions.add(objectInit); + + objectClass = makeClassInfo("object", getNextTypeTag(), null); + objectClass.addMethod(objectInit); + classes.add(objectClass); + globalSymbols.put(objectClass.getClassName(), objectClass); + + intClass = makeClassInfo("int", getNextTypeTag(), objectClass); + intClass.addAttribute(makeAttrInfo("__int__", null, null)); + classes.add(intClass); + globalSymbols.put(intClass.getClassName(), intClass); + + boolClass = makeClassInfo("bool", getNextTypeTag(), objectClass); + boolClass.addAttribute(makeAttrInfo("__bool__", null, null)); + classes.add(boolClass); + globalSymbols.put(boolClass.getClassName(), boolClass); + + strClass = makeClassInfo("str", getNextTypeTag(), objectClass); + strClass.addAttribute(makeAttrInfo("__len__", SymbolType.INT_TYPE, + new IntegerLiteral(null, null, 0))); + strClass.addAttribute(makeAttrInfo("__str__", null, null)); + classes.add(strClass); + globalSymbols.put(strClass.getClassName(), strClass); + + listClass = makeClassInfo(".list", -1, objectClass); + listClass.addAttribute(makeAttrInfo("__len__", SymbolType.INT_TYPE, + new IntegerLiteral(null, null, 0))); + classes.add(listClass); + listClass.dispatchTableLabel = null; + } + + /** Create descriptors and symbols for builtin functions. */ + protected void initFunctions() { + printFunc = makeFuncInfo("print", 0, SymbolType.NONE_TYPE, + globalSymbols, null, this::emitStdFunc); + printFunc.addParam(makeStackVarInfo("arg", null, null, printFunc)); + functions.add(printFunc); + globalSymbols.put(printFunc.getBaseName(), printFunc); + + lenFunc = makeFuncInfo("len", 0, SymbolType.INT_TYPE, + globalSymbols, null, this::emitStdFunc); + lenFunc.addParam(makeStackVarInfo("arg", null, null, lenFunc)); + functions.add(lenFunc); + globalSymbols.put(lenFunc.getBaseName(), lenFunc); + + inputFunc = makeFuncInfo("input", 0, SymbolType.STR_TYPE, + globalSymbols, null, this::emitStdFunc); + functions.add(inputFunc); + globalSymbols.put(inputFunc.getBaseName(), inputFunc); + } + + /* Symbolic assembler constants defined here (to add others, override + * initAsmConstants in an extension of CodeGenBase): + * ecalls: + * @print_string + * @print_char + * @print_int + * @exit2 + * Exit codes: + * @error_div_zero: Division by 0. + * @error_arg: Bad argument. + * @error_oob: Out of bounds. + * @error_none: Attempt to access attribute of None. + * @error_oom: Out of memory. + * @error_nyi: Unimplemented operation. + * Data-structure byte offsets: + * @.__obj_size__: Offset of size of object. + * @.__len__: Offset of length in chars or words. + * @.__str__: Offset of string data. + * @.__elts__: Offset of first list item. + * @.__int__: Offset of integer value. + * @.__bool__: Offset of boolean (1/0) value. + */ + + /** Define @-constants to be used in assembly code. */ + protected void initAsmConstants() { + backend.defineSym("sbrk", SBRK_ECALL); + backend.defineSym("print_string", PRINT_STRING_ECALL); + backend.defineSym("print_char", PRINT_CHAR_ECALL); + backend.defineSym("print_int", PRINT_INT_ECALL); + backend.defineSym("exit2", EXIT2_ECALL); + + backend.defineSym(".__obj_size__", 4); + backend.defineSym(".__len__", 12); + backend.defineSym(".__int__", 12); + backend.defineSym(".__bool__", 12); + backend.defineSym(".__str__", 16); + backend.defineSym(".__elts__", 16); + + backend.defineSym("error_div_zero", ERROR_DIV_ZERO); + backend.defineSym("error_arg", ERROR_ARG); + backend.defineSym("error_oob", ERROR_OOB); + backend.defineSym("error_none", ERROR_NONE); + backend.defineSym("error_oom", ERROR_OOM); + backend.defineSym("error_nyi", ERROR_NYI); + } + + /*-----------------------------------------------------------*/ + /* */ + /* FACTORY METHODS TO CREATE INFO OBJECTS */ + /* */ + /*-----------------------------------------------------------*/ + + /** + * A factory method that returns a descriptor for function or method + * FUNCNAME returning type RETURNTYPE at nesting level DEPTH in the + * region corresponding to PARENTSYMBOLTABLE. + + * PARENTFUNCINFO is a descriptor of the enclosing function and is null + * for global functions and methods. + + * EMITTER is a method that emits the function's body (usually a + * generic emitter for user-defined functions/methods, and a + * special emitter for pre-defined functions/methods). + * + * Sub-classes of CodeGenBase can override this method + * if they wish to use a sub-class of FuncInfo with more + * functionality. + */ + protected FuncInfo makeFuncInfo(String funcName, int depth, + SymbolType returnType, + SymbolTable<SymbolInfo> parentSymbolTable, + FuncInfo parentFuncInfo, + Consumer<FuncInfo> emitter) { + return new FuncInfo(funcName, depth, returnType, parentSymbolTable, + parentFuncInfo, emitter); + } + + /** + * Return a descriptor for a class named CLASSNAME having type tag + * TYPETAG and superclass SUPERCLASSINFO (null for `object' only). + * + * Sub-classes of CodeGenBase can override this method + * if they wish to use a sub-class of ClassInfo with more + * functionality. + */ + public ClassInfo makeClassInfo(String className, int typeTag, + ClassInfo superClassInfo) { + return new ClassInfo(className, typeTag, superClassInfo); + } + + /** + * A factory method that returns a descriptor for an attribute named + * ATTRNAME of type ATTRTYPE and with an initial value specified + * by INITIALVALUE, which may be null to indicate a default initialization. + * + * Sub-classes of CodeGenBase can override this method + * if they wish to use a sub-class of AttrInfo with more + * functionality. + */ + public AttrInfo makeAttrInfo(String attrName, ValueType attrType, + Literal initialValue) { + return new AttrInfo(attrName, attrType, initialValue); + } + + /** + * A factory method that returns a descriptor for a local variable or + * parameter named VARNAME of type VARTYPE, whose initial value is + * specified by INITIALVALUE (if non-null) and which is defined + * immediately within the function given by FUNCINFO. + * + * These variables are allocated on the stack in activation + * frames. + * + * Sub-classes of CodeGenBase can override this method + * if they wish to use a sub-class of StackVarInfo with more + * functionality. + * + */ + public StackVarInfo makeStackVarInfo(String varName, ValueType varType, + Literal initialValue, + FuncInfo funcInfo) { + return new StackVarInfo(varName, varType, initialValue, funcInfo); + } + + /** + * A factory method that returns a descriptor for a global variable with + * name VARNAME and type VARTYPE, whose initial value is specified by + * INITIALVALUE (if non-null). + * + * Sub-classes of CodeGenBase can override this method + * if they wish to use a sub-class of GlobalVarInfo with more + * functionality. + */ + public GlobalVarInfo makeGlobalVarInfo(String varName, ValueType varType, + Literal initialValue) { + return new GlobalVarInfo(varName, varType, initialValue); + } + + /*-----------------------------------------------------------* + * * + * ANALYSIS OF AST INTO INFO OBJECTS * + * (Students can ignore these methods as all the work has * + * been done and does not need to be modified/extended) * + * * + *-----------------------------------------------------------*/ + + + /** + * Analyze PROGRAM, creating Info objects for all symbols. + * Populate the global symbol table. + */ + protected void analyzeProgram(Program program) { + /* Proceed in phases: + * 1. Analyze all global variable declarations. + * Do this first so that global variables are in the symbol + * table before we encounter `global x` declarations. + * 2. Analyze classes and global functions now that global variables + * are in the symbol table. + */ + for (Declaration decl : program.declarations) { + if (decl instanceof VarDef) { + VarDef varDef = (VarDef) decl; + ValueType varType + = ValueType.annotationToValueType(varDef.var.type); + GlobalVarInfo globalVar = + makeGlobalVarInfo(varDef.var.identifier.name, varType, + varDef.value); + + this.globalVars.add(globalVar); + + this.globalSymbols.put(globalVar.getVarName(), globalVar); + } + } + + for (Declaration decl : program.declarations) { + if (decl instanceof ClassDef) { + ClassDef classDef = (ClassDef) decl; + ClassInfo classInfo = analyzeClass(classDef); + + this.classes.add(classInfo); + + this.globalSymbols.put(classInfo.getClassName(), classInfo); + } else if (decl instanceof FuncDef) { + FuncDef funcDef = (FuncDef) decl; + FuncInfo funcInfo = analyzeFunction(null, funcDef, 0, + globalSymbols, null); + + this.functions.add(funcInfo); + + this.globalSymbols.put(funcInfo.getBaseName(), funcInfo); + } + } + } + + /** + * Analyze a class definition CLASSDEF and return the resulting + * Info object. Also creates Info objects for attributes/methods + * and stores them in the ClassInfo. Methods are recursively + * analyzed using analyzeFunction(). + */ + protected ClassInfo analyzeClass(ClassDef classDef) { + String className = classDef.name.name; + String superClassName = classDef.superClass.name; + SymbolInfo superSymbolInfo = globalSymbols.get(superClassName); + assert superSymbolInfo instanceof ClassInfo + : "Semantic analysis should ensure that super-class is defined"; + ClassInfo superClassInfo = (ClassInfo) superSymbolInfo; + ClassInfo classInfo = makeClassInfo(className, getNextTypeTag(), + superClassInfo); + + for (Declaration decl : classDef.declarations) { + if (decl instanceof VarDef) { + VarDef attrDef = (VarDef) decl; + ValueType attrType + = ValueType.annotationToValueType(attrDef.var.type); + AttrInfo attrInfo = + makeAttrInfo(attrDef.var.identifier.name, attrType, + attrDef.value); + + classInfo.addAttribute(attrInfo); + } else if (decl instanceof FuncDef) { + FuncDef funcDef = (FuncDef) decl; + FuncInfo methodInfo = analyzeFunction(className, funcDef, 0, + globalSymbols, null); + + this.functions.add(methodInfo); + + classInfo.addMethod(methodInfo); + } + } + + return classInfo; + } + + + /** + * Analyze a function or method definition FUNCDEF at nesting depth DEPTH + * and return the resulting Info object. Analyze any nested functions + * recursively. The FuncInfo's symbol table is completely populated + * by analyzing all the params, local vars, global and nonlocal var + * declarations. + * + * CONTAINER is the fully qualified name of the containing function/class, + * or null for global functions. PARENTSYMBOLTABLE symbol table contains + * symbols inherited from outer regions (that of the containing + * function/method for nested function definitions, and the + * global symbol table for global function / method definitions). + * PARENTFUNCINFO is the Info object for the parent function/method + * if this definition is nested, and otherwise null. + */ + protected FuncInfo + analyzeFunction(String container, FuncDef funcDef, + int depth, + SymbolTable<SymbolInfo> parentSymbolTable, + FuncInfo parentFuncInfo) { + /* We proceed in three steps. + * 1. Create the FuncInfo object to be returned. + * 2. Populate it by analyzing all the parameters and local var + * definitions. + * 3. Now that the function's symbol table is built up, analyze + * nested function definitions. + * 4. Add the body to the function descriptor for code gen. + */ + + String funcBaseName = funcDef.name.name; + String funcQualifiedName = + container != null + ? String.format("%s.%s", container, funcBaseName) + : funcBaseName; + + FuncInfo funcInfo = + makeFuncInfo(funcQualifiedName, depth, + ValueType.annotationToValueType(funcDef.returnType), + parentSymbolTable, parentFuncInfo, + this::emitUserDefinedFunction); + + for (TypedVar param : funcDef.params) { + ValueType paramType + = ValueType.annotationToValueType(param.type); + + StackVarInfo paramInfo = + makeStackVarInfo(param.identifier.name, paramType, null, + funcInfo); + + funcInfo.addParam(paramInfo); + } + + LocalDeclAnalyzer localDefs = new LocalDeclAnalyzer(funcInfo); + + for (Declaration decl : funcDef.declarations) { + decl.dispatch(localDefs); + } + + NestedFuncAnalyzer nestedFuncs = new NestedFuncAnalyzer(funcInfo); + + for (Declaration decl : funcDef.declarations) { + decl.dispatch(nestedFuncs); + } + + funcInfo.addBody(funcDef.statements); + return funcInfo; + } + + /** Analyzer for local variable declarations in a function. */ + protected class LocalDeclAnalyzer extends AbstractNodeAnalyzer<Void> { + /** The descriptor for the function being analyzed. */ + private FuncInfo funcInfo; + + /** A new analyzer for a function with descriptor FUNCINFO0. */ + protected LocalDeclAnalyzer(FuncInfo funcInfo0) { + funcInfo = funcInfo0; + } + + @Override + public Void analyze(VarDef localVarDef) { + ValueType localVarType + = ValueType.annotationToValueType(localVarDef.var.type); + StackVarInfo localVar = + makeStackVarInfo(localVarDef.var.identifier.name, + localVarType, localVarDef.value, + funcInfo); + funcInfo.addLocal(localVar); + return null; + } + + @Override + public Void analyze(GlobalDecl decl) { + SymbolInfo symInfo = + globalSymbols.get(decl.getIdentifier().name); + assert symInfo instanceof GlobalVarInfo + : "Semantic analysis should ensure that global var exists"; + GlobalVarInfo globalVar = (GlobalVarInfo) symInfo; + funcInfo.getSymbolTable().put(globalVar.getVarName(), + globalVar); + return null; + } + + @Override + public Void analyze(NonLocalDecl decl) { + assert funcInfo.getSymbolTable().get(decl.getIdentifier().name) + instanceof StackVarInfo + : "Semantic analysis should ensure nonlocal var exists"; + return null; + } + } + + /** Analyzer for nested function declarations in a function. */ + protected class NestedFuncAnalyzer extends AbstractNodeAnalyzer<Void> { + /** Descriptor for the function being analyzed. */ + private FuncInfo funcInfo; + + /** A new analyzer for a function with descriptor FUNCINFO0. */ + protected NestedFuncAnalyzer(FuncInfo funcInfo0) { + funcInfo = funcInfo0; + } + + @Override + public Void analyze(FuncDef nestedFuncDef) { + FuncInfo nestedFuncInfo = + analyzeFunction(funcInfo.getFuncName(), nestedFuncDef, + funcInfo.getDepth() + 1, + funcInfo.getSymbolTable(), + funcInfo); + + functions.add(nestedFuncInfo); + + funcInfo.getSymbolTable().put(nestedFuncInfo.getBaseName(), + nestedFuncInfo); + return null; + } + } + + + /*------------------------------------------------------------* + * * + * EMITING DATA SECTION FOR GLOBALS+PROTOTYPES+CONSTANTS * + * (Students can ignore these methods as all the work has * + * been done and does not need to be modified/extended) * + * * + *------------------------------------------------------------*/ + + + /** Emit code to align next data item to word boundary. */ + protected void alignObject() { + int wordSizeLog2 = + 31 - Integer.numberOfLeadingZeros(wordSize); + backend.alignNext(wordSizeLog2); + } + + /** Emit the constant section containing the prototype FOR the class + * defined by CLASSINFO. */ + protected void emitPrototype(ClassInfo classInfo) { + backend.emitGlobalLabel(classInfo.getPrototypeLabel()); + backend.emitWordLiteral(classInfo.getTypeTag(), + String.format("Type tag for class: %s", + classInfo.getClassName())); + backend.emitWordLiteral(classInfo.attributes.size() + HEADER_SIZE, + "Object size"); + backend.emitWordAddress(classInfo.getDispatchTableLabel(), + "Pointer to dispatch table"); + for (VarInfo attr : classInfo.attributes) { + String cmnt = String.format("Initial value of attribute: %s", + attr.getVarName()); + emitConstant(attr.getInitialValue(), attr.getVarType(), cmnt); + } + alignObject(); + } + + /** Emit a word containing a constant representing VALUE, assuming that + * it will be interpreted as a value of static type TYPE. VALUE may be + * null, indicating None. TYPE may be null, indicating object. + * COMMENT is an optional comment. */ + protected void emitConstant(Literal value, ValueType type, String comment) { + if (type != null && type.equals(SymbolType.INT_TYPE)) { + backend.emitWordLiteral(((IntegerLiteral) value).value, comment); + } else if (type != null && type.equals(SymbolType.BOOL_TYPE)) { + backend.emitWordLiteral(((BooleanLiteral) value).value ? 1 : 0, + comment); + } else { + backend.emitWordAddress(constants.fromLiteral(value), comment); + } + } + + /** Emit code for all constants. */ + protected void emitConstants() { + backend.emitGlobalLabel(constants.falseConstant); + backend.emitWordLiteral(boolClass.getTypeTag(), + "Type tag for class: bool"); + backend.emitWordLiteral(boolClass.attributes.size() + HEADER_SIZE, + "Object size"); + backend.emitWordAddress(boolClass.getDispatchTableLabel(), + "Pointer to dispatch table"); + backend.emitWordLiteral(0, "Constant value of attribute: __bool__"); + alignObject(); + + backend.emitGlobalLabel(constants.trueConstant); + backend.emitWordLiteral(boolClass.getTypeTag(), + "Type tag for class: bool"); + backend.emitWordLiteral(boolClass.attributes.size() + HEADER_SIZE, + "Object size"); + backend.emitWordAddress(boolClass.getDispatchTableLabel(), + "Pointer to dispatch table"); + backend.emitWordLiteral(1, "Constant value of attribute: __bool__"); + alignObject(); + + for (Map.Entry<String, Label> e : constants.strConstants.entrySet()) { + String value = e.getKey(); + Label label = e.getValue(); + int numWordsForCharacters = + value.length() / wordSize + 1; + backend.emitGlobalLabel(label); + backend.emitWordLiteral(strClass.getTypeTag(), + "Type tag for class: str"); + backend.emitWordLiteral(3 + 1 + numWordsForCharacters, + "Object size"); + backend.emitWordAddress(strClass.getDispatchTableLabel(), + "Pointer to dispatch table"); + backend.emitWordLiteral(value.length(), + "Constant value of attribute: __len__"); + backend.emitString(value, "Constant value of attribute: __str__"); + alignObject(); + } + + for (Map.Entry<Integer, Label> e : constants.intConstants.entrySet()) { + Integer value = e.getKey(); + Label label = e.getValue(); + backend.emitGlobalLabel(label); + backend.emitWordLiteral(intClass.getTypeTag(), + "Type tag for class: int"); + backend.emitWordLiteral(intClass.attributes.size() + HEADER_SIZE, + "Object size"); + backend.emitWordAddress(intClass.getDispatchTableLabel(), + "Pointer to dispatch table"); + backend.emitWordLiteral(value, + "Constant value of attribute: __int__"); + alignObject(); + } + } + + + /** Emit the method dispatching table for CLASSINFO. */ + protected void emitDispatchTable(ClassInfo classInfo) { + Label dispatchTableLabel = classInfo.getDispatchTableLabel(); + if (dispatchTableLabel == null) { + return; + } + backend.emitGlobalLabel(dispatchTableLabel); + for (FuncInfo method : classInfo.methods) { + String cmnt = String.format("Implementation for method: %s.%s", + classInfo.getClassName(), + method.getBaseName()); + backend.emitWordAddress(method.getCodeLabel(), cmnt); + } + } + + /*------------------------------------------------------------* + * * + * UTILITY METHODS TO GET BYTE OFFSETS IN OBJECT LAYOUT * + * (Students will find these methods helpful to use in * + * their sub-class when generating code for expressions) * + * * + *------------------------------------------------------------*/ + + + /** Return offset of the type-tag field in an object. */ + protected int getTypeTagOffset() { + return 0 * wordSize; + } + + /** Return offset of the size field in an object. */ + protected int getObjectSizeOffset() { + return 1 * wordSize; + } + + /** Return offset of the start of the pointer to the method-dispatching + * table in an object. */ + protected int getDispatchTableOffset() { + return 2 * wordSize; + } + + /** Return the offset of the ATTRNAME attribute of an object of type + * described by CLASSINFO. */ + protected int getAttrOffset(ClassInfo classInfo, String attrName) { + int attrIndex = classInfo.getAttributeIndex(attrName); + assert attrIndex >= 0 + : "Type checker ensures that attributes are valid"; + return wordSize * (HEADER_SIZE + attrIndex); + } + + /** Return the offset of the method named METHODNAME in the + * method-dispatching table for the class described by CLASSINFO. */ + protected int getMethodOffset(ClassInfo classInfo, String methodName) { + int methodIndex = classInfo.getMethodIndex(methodName); + assert methodIndex >= 0 + : "Type checker ensures that attributes are valid"; + return wordSize * methodIndex; + } + + /*------------------------------------------------------------* + * * + * UNIMPLEMENTED METHODS (should be extended) * + * * + *------------------------------------------------------------*/ + + + /** Emits code for STATEMENTS, assumed to be at the top level. */ + protected abstract void emitTopLevel(List<Stmt> statements); + + /** Emits code for the body of user-defined function FUNCINFO. */ + protected abstract void emitUserDefinedFunction(FuncInfo funcInfo); + + /** + * Emits code outside the ChocoPy program. + * + * Custom assembly routines (that may be jumpable from + * program statements) can be emitted here. + */ + protected abstract void emitCustomCode(); + + /*------------------------------------------------------------* + * * + * PREDEFINED FUNCTIONS AND ROUTINES * + * (Students may find a cursory read of these methods to * + * be useful to get an idea for how code can be emitted) * + * * + *------------------------------------------------------------*/ + + /** Return Risc V assembler code for function NAME from + * directory LIB, or null if it does not exist. LIB must end in + * '/'. */ + protected String getStandardLibraryCode(String name, String lib) { + String simpleName = name.replace("$", "") + ".s"; + return getResourceFileAsString(lib + simpleName); + } + + /** Emit label and body for the function LABEL, taking the + * source from directory LIB (must end in '/'). */ + protected void emitStdFunc(Label label, String lib) { + emitStdFunc(label, label.toString(), lib); + } + + /** Emit label and body for the function LABEL, taking the + * source from SOURCEFILE.s in directory LIB (must end in '/'). */ + protected void emitStdFunc(Label label, String sourceFile, String lib) { + String source = getStandardLibraryCode(sourceFile, lib); + if (source == null) { + throw fatal("Code for %s is missing.", sourceFile); + } + backend.emitGlobalLabel(label); + backend.emit(convertLiterals(source)); + } + + /** Emit label and body for the function LABEL, taking the + * source from from the default library directory. */ + protected void emitStdFunc(Label label) { + emitStdFunc(label, LIBRARY_CODE_DIR); + } + + /** Emit label and body for the function named NAME, taking the + * source from from directory LIB (must end in '/'). */ + protected void emitStdFunc(String name, String lib) { + emitStdFunc(new Label(name), lib); + } + + /** Emit label and body for the function NAME, taking the + * source from from the default library directory. */ + protected void emitStdFunc(String name) { + emitStdFunc(name, LIBRARY_CODE_DIR); + } + + /** Emit label and body for the function described by FUNCINFO, taking the + * source from from directory LIB (must end in '/'). */ + protected void emitStdFunc(FuncInfo funcInfo, String lib) { + emitStdFunc(funcInfo.getCodeLabel(), lib); + } + + /** Emit label and body for the function described by FUNCINFO, taking the + * source from from the default library directory. */ + protected void emitStdFunc(FuncInfo funcInfo) { + emitStdFunc(funcInfo, LIBRARY_CODE_DIR); + } + + /** Pattern matching STRING["..."]. */ + private static final Pattern STRING_LITERAL_PATN = + Pattern.compile("STRING\\[\"(.*?)\"\\]"); + + /** Return result of converting STRING["..."] notations in SOURCE to + * labels of string constants, adding those constants to the pool. */ + private String convertLiterals(String source) { + Matcher matcher = STRING_LITERAL_PATN.matcher(source); + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + String r = constants.getStrConstant(matcher.group(1)).toString(); + matcher.appendReplacement(result, + pad(r, ' ', + matcher.end(0) - matcher.start(0), + false)); + } + return matcher.appendTail(result).toString(); + } + +} diff --git a/src/main/java/chocopy/common/codegen/Constants.java b/src/main/java/chocopy/common/codegen/Constants.java new file mode 100644 index 0000000..01019a3 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/Constants.java @@ -0,0 +1,121 @@ +package chocopy.common.codegen; + +import java.util.HashMap; +import java.util.Map; + +import chocopy.common.astnodes.BooleanLiteral; +import chocopy.common.astnodes.IntegerLiteral; +import chocopy.common.astnodes.Literal; +import chocopy.common.astnodes.NoneLiteral; +import chocopy.common.astnodes.StringLiteral; + +/** + * A store for caching and re-using program constants that are represented + * as immutable objects. + * + * Constants are emitted in assembly in the DATA section, + * and therefore are represented by their labels. + */ +public class Constants { + + /** A counter used to generate unique label names for constants. */ + protected int nextLabelSuffix = 0; + + /** The constant representing the boolean `False`. */ + final Label falseConstant = generateConstantLabel(); + + /** The constant representing the boolean `True`. This immediately + * follows falseConstant in static memory. */ + final Label trueConstant = generateConstantLabel(); + + /** A cache for integer-valued constants. */ + final Map<Integer, Label> intConstants = new HashMap<>(); + + /** A cache for string-valued constants. */ + final Map<String, Label> strConstants = new HashMap<>(); + + /** + * Returns the next unique label suffix for constants. + * + * @return the next unique label suffix for constants + */ + protected int getNextLabelSuffix() { + return nextLabelSuffix++; + } + + /** + * Generates a fresh label for constants. + * + * This label is guaranteed to be unique amongst labels + * generated by invoking this method. All such labels + * have a prefix of `const_`. + * + * @return a fresh label + */ + public Label generateConstantLabel() { + return new Label(String.format("const_%d", getNextLabelSuffix())); + } + + /** + * Returns the label for a `bool` constant. + * + * @param value the boolean value + * @return the label for the boolean value + */ + public Label getBoolConstant(boolean value) { + return value ? trueConstant : falseConstant; + } + + /** + * Returns the label for am `int` constant. + * + * @param value the integer value + * @return the label for the integer value + */ + public Label getIntConstant(int value) { + if (intConstants.containsKey(value)) { + return intConstants.get(value); + } else { + Label newLabel = generateConstantLabel(); + intConstants.put(value, newLabel); + return newLabel; + } + } + + /** + * Returns the label for a `str` constant. + * + * @param value the string value + * @return the label for the string value + */ + public Label getStrConstant(String value) { + if (strConstants.containsKey(value)) { + return strConstants.get(value); + } else { + Label newLabel = generateConstantLabel(); + strConstants.put(value, newLabel); + return newLabel; + } + } + + /** + * Converts a constant literal in the AST to a constant + * for code generation. + * + * @param literal the literal expression in the AST + * @return a {@link Label} representing a constant int/str/bool, + * or `null` representing the None literal + */ + public Label fromLiteral(Literal literal) { + if (literal instanceof IntegerLiteral) { + return getIntConstant(((IntegerLiteral) literal).value); + } else if (literal instanceof StringLiteral) { + return getStrConstant(((StringLiteral) literal).value); + } else if (literal instanceof BooleanLiteral) { + return getBoolConstant(((BooleanLiteral) literal).value); + } else { + assert literal == null || literal instanceof NoneLiteral; + return null; + } + } +} diff --git a/src/main/java/chocopy/common/codegen/FuncInfo.java b/src/main/java/chocopy/common/codegen/FuncInfo.java new file mode 100644 index 0000000..b6bf02e --- /dev/null +++ b/src/main/java/chocopy/common/codegen/FuncInfo.java @@ -0,0 +1,217 @@ +package chocopy.common.codegen; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import chocopy.common.analysis.SymbolTable; +import chocopy.common.analysis.types.SymbolType; +import chocopy.common.astnodes.Stmt; + +/** + * A descriptor for function and method definitions. + * + * This class stores information required for code generation + * such as the information about a function's parameters, local variables, + * the local symbol table, the function body, and the label where the code + * for the body is generated. + */ +public class FuncInfo extends SymbolInfo { + + /** + * The fully-qualified name of the function. + * + * All functions in a ChocoPy program have a unique fully-qualified name. + * Global functions defined with name `f` have fully-qualified name `f`. + * Methods `m` in a class `C` have fully-qualified name `C.m`. + * Functions `f` nested inside another function + * with fully-qualified name `F` have a fully-qualified name of `F.f`. + */ + protected final String funcName; + + /** + * The static depth of a function. + * + * Global functions and class methods have a static depth of 0. + * Nested functions that are defined in the body of a function + * with static depth `D` have a static depth of `D+1`. + */ + protected final int depth; + + /** + * This function's return type. + */ + protected final SymbolType returnType; + + /** A list of parameter names. */ + protected final List<String> params = new ArrayList<>(); + + /** A list of local variable descriptors. */ + protected final List<StackVarInfo> locals = new ArrayList<>(); + + /** The function body. */ + protected final List<Stmt> statements = new ArrayList<>(); + + /** The local symbol table that binds identifiers seen in the + * function's body. */ + protected final SymbolTable<SymbolInfo> symbolTable; + + /** The label of the generated code for the function's body. */ + protected final Label codeLabel; + + /** The descriptor of the enclosing function (this is only non-null + * for nested functions). */ + protected final FuncInfo parentFuncInfo; + + /** + * A method that is invoked to emit the function's body. + * + * The method should accept one parameter of type `FuncInfo`. + */ + protected Consumer<FuncInfo> emitter; + + /** + * Creates a descriptor for a function or method with fully qualified name + * FUNCNAME returning type RETURNTYPE that is at nesting depth DEPTH. + * The code label is formed from FUNCNAME by prepending a $ sign to + * prevent collisions. + * PARENTSYMBOLTABLE is the symbol table of the containing region. + * PARENTFUNCINFO is the descriptor of the enclosing function + * (null for global functions and methods). + * EMITTER encapsulates a method that emits the function's body (this is + * usually a generic emitter for user-defined functions/methods, + * and a special emitter for pre-defined functions/methods). */ + public FuncInfo(String funcName, int depth, SymbolType returnType, + SymbolTable<SymbolInfo> parentSymbolTable, + FuncInfo parentFuncInfo, Consumer<FuncInfo> emitter) { + this.funcName = funcName; + this.codeLabel = new Label(String.format("$%s", funcName)); + this.depth = depth; + this.returnType = returnType; + this.symbolTable = new SymbolTable<>(parentSymbolTable); + this.parentFuncInfo = parentFuncInfo; + this.emitter = emitter; + } + + /** Adds parameter with descriptor PARAMINFO to this function. */ + public void addParam(StackVarInfo paramInfo) { + this.params.add(paramInfo.getVarName()); + this.symbolTable.put(paramInfo.getVarName(), paramInfo); + } + + /** Adds a local variable with descriptor STACKVARINFO to this function. */ + public void addLocal(StackVarInfo stackVarInfo) { + this.locals.add(stackVarInfo); + this.symbolTable.put(stackVarInfo.getVarName(), stackVarInfo); + } + + /** Adds STMTS to the function's body. */ + public void addBody(List<Stmt> stmts) { + statements.addAll(stmts); + } + + /** + * Returns the index of parameter or local variable NAME in the function's + * activation record. + * + * The convention is that for a function with N params + * and K local vars, the i`th param is at index `i` + * and the j`th local var is at index `N+j+2`. In all, + * a function stores N+K+2 variables contiguously in + * its activation record, where the N+1st is the frame pointer + * and the N+2nd is the return address. + * + * Caution: this is an index (starting at 0), and not an offset in + * number of bytes. + */ + public int getVarIndex(String name) { + int idx = params.indexOf(name); + if (idx >= 0) { + return idx; + } + for (int i = 0; i < locals.size(); i++) { + if (locals.get(i).getVarName().equals(name)) { + return i + params.size() + 2; + } + } + String msg = + String.format("%s is not a var defined in function %s", + name, funcName); + throw new IllegalArgumentException(msg); + } + + /** Returns the label corresponding to the function's body in assembly. */ + public Label getCodeLabel() { + return codeLabel; + } + + /** + * Returns the function's defined name in the program. + * This is the last component of the dot-separated + * fully-qualified name. + */ + public String getBaseName() { + int rightmostDotIndex = funcName.lastIndexOf('.'); + if (rightmostDotIndex == -1) { + return funcName; + } else { + return funcName.substring(rightmostDotIndex + 1); + } + } + + /** Returns the function's fully-qualified name. */ + public String getFuncName() { + return funcName; + } + + /** Returns the function's static nesting depth. */ + public int getDepth() { + return depth; + } + + /** Returns the function's parameters in order of definition. */ + public List<String> getParams() { + return params; + } + + /** Returns the return type of this function. */ + public SymbolType getReturnType() { + return returnType; + } + + /** + * Returns the function's explicitly defined local variables, excluding + * parameters. + * + * This list is mainly used in generating code for + * initializing local variables that are not parameters. + */ + public List<StackVarInfo> getLocals() { + return locals; + } + + /** Returns the list of statements in the function's body. */ + public List<Stmt> getStatements() { + return statements; + } + + /** + * Returns the function's local symbol table. + * + * @return the function's local symbol table + */ + public SymbolTable<SymbolInfo> getSymbolTable() { + return symbolTable; + } + + /** Returns the parent function's descriptor for nested functions, + * and null if this function is not nested. */ + public FuncInfo getParentFuncInfo() { + return parentFuncInfo; + } + + /** Emits the function's body. */ + public void emitBody() { + emitter.accept(this); + } +} diff --git a/src/main/java/chocopy/common/codegen/GlobalVarInfo.java b/src/main/java/chocopy/common/codegen/GlobalVarInfo.java new file mode 100644 index 0000000..bf0abcd --- /dev/null +++ b/src/main/java/chocopy/common/codegen/GlobalVarInfo.java @@ -0,0 +1,27 @@ +package chocopy.common.codegen; + +import chocopy.common.analysis.types.ValueType; +import chocopy.common.astnodes.Literal; + +/** Code-generation related information about a global variable. */ +public class GlobalVarInfo extends VarInfo { + + /** This variable resides in static storage tagged with LABEL. The + * label is prepended with "$" to prevent name clashes. */ + protected final Label label; + + /** + * A descriptor for a global variable named VARNAME of type VARTYPE + * whose initial value is labeled with INITIALVALUE (null if + * no initializtion value). */ + public GlobalVarInfo(String varName, ValueType varType, + Literal initialValue) { + super(varName, varType, initialValue); + this.label = new Label(String.format("$%s", varName)); + } + + /** Return the code location of this variable. */ + public Label getLabel() { + return label; + } +} diff --git a/src/main/java/chocopy/common/codegen/Label.java b/src/main/java/chocopy/common/codegen/Label.java new file mode 100644 index 0000000..cb678e2 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/Label.java @@ -0,0 +1,48 @@ +package chocopy.common.codegen; + +import java.util.Objects; + +/** + * A label in assembly. + */ +public class Label { + + /** The name of the label. */ + public final String labelName; + + /** A new label with name LABELNAME. */ + public Label(String labelName) { + this.labelName = labelName; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Label label = (Label) o; + return Objects.equals(labelName, label.labelName); + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hash(labelName); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return labelName; + } +} diff --git a/src/main/java/chocopy/common/codegen/RiscVBackend.java b/src/main/java/chocopy/common/codegen/RiscVBackend.java new file mode 100644 index 0000000..669075a --- /dev/null +++ b/src/main/java/chocopy/common/codegen/RiscVBackend.java @@ -0,0 +1,719 @@ +package chocopy.common.codegen; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** RISC V assembly-language generation utilities. */ +public class RiscVBackend { + + /** Accumulator for assembly code output. */ + protected final StringWriter asmText = new StringWriter(); + + /** Allows print, println, and printf of assmebly code. */ + private final PrintWriter out = new PrintWriter(asmText); + + /** The word size in bytes for RISC-V 32-bit. */ + protected static final int WORD_SIZE = 4; + + /** Mappung from @-symbols to values. */ + private HashMap<String, String> defns = new HashMap<>(); + + /** The RISC-V registers. */ + public enum Register { + + A0("a0"), A1("a1"), A2("a2"), A3("a3"), A4("a4"), A5("a5"), A6("a6"), + A7("a7"), + T0("t0"), T1("t1"), T2("t2"), T3("t3"), T4("t4"), T5("t5"), T6("t6"), + S1("s1"), S2("s2"), S3("s3"), S4("s4"), S5("s5"), + S6("s6"), S7("s7"), S8("s8"), S9("s9"), S10("s10"), S11("s11"), + FP("fp"), SP("sp"), GP("gp"), RA("ra"), ZERO("zero"); + + /** The name of the register used in assembly. */ + protected final String name; + + /** This register's code representation is NAME. */ + Register(String name) { + this.name = name; + } + + @Override + public String toString() { + return this.name; + } + + } + + /** Matches a reference to an assembler symbol, and possibly a trailing + * +CONST or -CONST. */ + static final Pattern ASM_SYM_REF_PATN = + Pattern.compile("@(.[a-zA-Z_0-9.$]*)(?:\\s*([-+]\\d+))?|(#.*)|(\r?\n)"); + /** Matches a decimal numeral with optional sign. */ + static final Pattern SIGNED_INT_PATN = Pattern.compile("[-+]?\\d+"); + + @Override + public String toString() { + return asmText.toString(); + } + + /** Return the accumulated assembly code. It is an error if the + * accumulated code contains any '@' references to undefined symbols. */ + protected String oldToString() { + int deltaSpace; + StringBuffer result = new StringBuffer(); + deltaSpace = 0; + Matcher refs = ASM_SYM_REF_PATN.matcher(asmText.toString()); + while (refs.find()) { + if (refs.group(3) != null) { + String repl = refs.group(3); + refs.appendReplacement(result, ""); + while (deltaSpace < 0) { + result.append(" "); + deltaSpace += 1; + } + result.append(repl); + } else if (refs.group(4) != null) { + deltaSpace = 0; + refs.appendReplacement(result, refs.group(4)); + } else { + String repl; + repl = defns.get(refs.group(1)); + if (repl == null) { + throw new IllegalStateException("undefined symbol: @" + + refs.group(1)); + } + if (refs.group(2) != null) { + if (SIGNED_INT_PATN.matcher(repl).matches()) { + int val = Integer.parseInt(repl) + + Integer.parseInt(refs.group(2)); + repl = Integer.toString(val); + } else { + repl += refs.group(2); + } + } + refs.appendReplacement(result, repl); + deltaSpace += repl.length() - refs.end(0) + refs.start(0); + } + } + refs.appendTail(result); + + return result.toString(); + } + + /** Define @NAME to have the value VALUE. Here, NAME is assumed to be + * an identifier consisting of letters, digits, underscores, and any of + * the charcters '$' or '.', and that does not start with a digit. Value + * may be a numeral or another symbol. + */ + public void defineSym(String name, String value) { + if (name.startsWith("@")) { + emitInsn(String.format(".equiv %s, %s", name, value), null); + } else { + emitInsn(String.format(".equiv @%s, %s", name, value), null); + } + } + + /** Define @NAME to have the value VALUE, where value is converted to + * a string. See {@link #defineSym(java.lang.String, java.lang.String)}. + */ + public void defineSym(String name, int value) { + defineSym(name, Integer.toString(value)); + } + + /** + * Returns the word size in bytes. + * + * This method is used instead of directly accessing the + * static field {@link #WORD_SIZE}, so that this class + * may be extended with alternate word sizes. + */ + public int getWordSize() { + return WORD_SIZE; + } + + /** + * Emit the text STR to the output stream verbatim. STR should have no + * trailing newline. + */ + protected void emit(String str) { + out.println(str); + } + + /** + * Emit instruction or directive INSN along with COMMENT as a one-line + * comment, if non-null. + */ + public void emitInsn(String insn, String comment) { + if (comment != null) { + emit(String.format(" %-40s # %s", insn, comment)); + } else { + emitInsn(insn); + } + } + + /** + * Emit instruction or directive INSN without a comment. + */ + protected void emitInsn(String insn) { + emit(String.format(" %s", insn)); + } + + /** + * Emit a local label marker for LABEL with one-line comment COMMENT (null + * if missing). Invoke only once per unique label. + */ + public void emitLocalLabel(Label label, String comment) { + if (comment != null) { + emit(String.format("%-42s # %s", label + ":", comment)); + } else { + emit(String.format("%s:", label + ":")); + } + } + + /** + * Emit a global label marker for LABEL. Invoke only once per + * unique label. + */ + public void emitGlobalLabel(Label label) { + emit(String.format("\n.globl %s", label)); + emit(String.format("%s:", label)); + } + + /** + * Emit a data word containing VALUE as an integer value. COMMENT is + * a emitted as a one-line comment, if non-null. + */ + public void emitWordLiteral(Integer value, String comment) { + emitInsn(String.format(".word %s", value), comment); + } + + /** + * Emit a data word containing the address ADDR, or 0 if LABEL is null. + * COMMENT is a emitted as a one-line comment, if non-null. + */ + public void emitWordAddress(Label addr, String comment) { + if (addr == null) { + emitWordLiteral(0, comment); + } else { + emitInsn(String.format(".word %s", addr), comment); + } + } + + + /** + * Emit VALUE as an ASCII null-terminated string constant, with + * COMMENT as its one-line comment, if non-null. + */ + public void emitString(String value, String comment) { + String quoted = value + .replace("\\", "\\\\") + .replace("\n", "\\n") + .replace("\t", "\\t") + .replace("\"", "\\\""); + emitInsn(String.format(".string \"%s\"", quoted), comment); + } + + /** + * Mark the start of a data section. + */ + public void startData() { + emit("\n.data"); + } + + /** + * Mark the start of a code/text section. + */ + public void startCode() { + emit("\n.text"); + } + + /** + * Align the next instruction/word in memory to + * a multiple of 2**POW bytes. + */ + public void alignNext(int pow) { + emitInsn(String.format(".align %d", pow)); + } + + /** + * Emit an ecall instruction, with one-line comment COMMENT, + * if non-null. + */ + public void emitEcall(String comment) { + emitInsn("ecall", comment); + } + + /** + * Emit a load-address instruction with destination RD and source + * LABEL. COMMENT is an optional one-line comment (null if missing). + */ + public void emitLA(Register rd, Label label, String comment) { + emitInsn(String.format("la %s, %s", rd, label), comment); + } + + /** + * Emit a load-immediate pseudo-op to set RD to IMM. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitLI(Register rd, Integer imm, String comment) { + emitInsn(String.format("li %s, %d", rd, imm), comment); + } + + /** + * Emit a load-upper-immediate instruction to set the upper 20 bits + * of RD to IMM, where 0 <= IMM < 2**20. COMMENT is an optional + * one-line comment (null if missing). + */ + public void emitLUI(Register rd, Integer imm, String comment) { + emitInsn(String.format("lui %s, %d", rd, imm), comment); + } + + /** + * Emit a move instruction to set RD to the contents of RS. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitMV(Register rd, Register rs, String comment) { + emitInsn(String.format("mv %s, %s", rd, rs), comment); + } + + /** + * Emit a jump-register (computed jump) instruction to the address in + * RS. COMMENT is an optional one-line comment (null if missing). + */ + public void emitJR(Register rs, String comment) { + emitInsn(String.format("jr %s", rs), comment); + } + + /** + * Emit a jump (unconditional jump) instruction to LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitJ(Label label, String comment) { + emitInsn(String.format("j %s", label), comment); + } + + + /** + * Emit a jump-and-link instruction to LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitJAL(Label label, String comment) { + emitInsn(String.format("jal %s", label), comment); + } + + /** + * Emit a computed-jump-and-link instruction to the address in RS. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitJALR(Register rs, String comment) { + emitInsn(String.format("jalr %s", rs), comment); + } + + /** + * Emit an add-immediate instruction performing RD = RS + IMM. + * Requires -2048 <= IMM < 2048. COMMENT is an optional one-line + * comment (null if missing). + */ + public void emitADDI(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("addi %s, %s, %d", rd, rs, imm), comment); + } + + /** + * Emit an add-immediate instruction performing RD = RS + IMM. + * Here, IMM is a string generally containing a symbolic assembler + * constant (see defineSym) representing an integer value, or an + * expression of the form @NAME+NUM or @NAME-NUM. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitADDI(Register rd, Register rs, String imm, + String comment) { + emitInsn(String.format("addi %s, %s, %s", rd, rs, imm), comment); + } + + /** + * Emit an add instruction performing RD = RS1 + RS2 mod 2**32. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitADD(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("add %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit a subtract instruction performing RD = RS1 - RS2 mod 2**32. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSUB(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("sub %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit a multiply instruction performing RD = RS1 * RS2 mod 2**32. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitMUL(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("mul %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit a signed integer divide instruction performing + * RD = RS1 / RS2 mod 2**32, rounding the result toward 0. + * If RS2 == 0, sets RD to -1. If RS1 == -2**31 and RS2 == -1, + * sets RD to -2**31. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitDIV(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("div %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit a remainder instruction: RD = RS1 rem RS2 defined so that + * (RS1 / RS2) * RS2 + (RS1 rem RS2) == RS1, where / is as for + * emitDIV. COMMENT is an optional one-line comment (null if missing). + */ + public void emitREM(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("rem %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit an xor instruction: RD = RS1 ^ RS2. COMMENT is an optional + * one-line comment (null if missing). + */ + public void emitXOR(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("xor %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit an xor-immediate instruction: RD = RS ^ IMM, where + * -2048 <= IMM < 2048. COMMENT is an optional + * one-line comment (null if missing). + */ + public void emitXORI(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("xori %s, %s, %d", rd, rs, imm), comment); + } + + /** + * Emit a bitwise and instruction: RD = RS1 & RS2. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitAND(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("and %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit a bitwise and-immediate instruction: RD = RS & IMM, where + * -2048 <= IMM < 2048. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitANDI(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("andi %s, %s, %d", rd, rs, imm), comment); + } + + /** + * Emit a bitwise or instruction: RD = RS1 | RS2. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitOR(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("or %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit a bitwise or-immediate instruction: RD = RS | IMM, where + * -2048 <= IMM < 2048. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitORI(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("ori %s, %s, %d", rd, rs, imm), comment); + } + + /** + * Emit a logical left shift instruction: RD = RS1 << (RS2 & 0x31). + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSLL(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("sll %s, %s, %d", rd, rs1, rs2), comment); + } + + /** + * Emit a logical left shift instruction: RD = RS << (IMM & 0x31). + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSLLI(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("slli %s, %s, %d", rd, rs, imm), comment); + } + + /** + * Emit a logical right shift instruction: RD = RS1 >>> (RS2 & 0x31). + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSRL(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("srl %s, %s, %d", rd, rs1, rs2), comment); + } + + /** + * Emit a logical right shift instruction: RD = RS >>> (IMM & 0x31). + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSRLI(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("srli %s, %s, %d", rd, rs, imm), comment); + } + + /** + * Emit an arithmetic right shift instruction: RD = RS1 >> (RS2 & 0x31). + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSRA(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("sra %s, %s, %d", rd, rs1, rs2), comment); + } + + /** + * Emit an arithmetic right shift instruction: RD = RS >> (IMM & 0x31). + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSRAI(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("srai %s, %s, %d", rd, rs, imm), comment); + } + + /** + * Emit a load-word instruction: RD = MEMORY[RS + IMM]:4, where + * -2048 <= IMM < 2048. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitLW(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("lw %s, %d(%s)", rd, imm, rs), comment); + } + + /** + * Emit a load-word instruction: RD = MEMORY[RS + IMM]:4, where + * -2048 <= IMM < 2048. Here, IMM is symbolic constant expression + * (see emitADDI). COMMENT is an optional one-line + * comment (null if missing). + */ + public void emitLW(Register rd, Register rs, String imm, + String comment) { + emitInsn(String.format("lw %s, %s(%s)", rd, imm, rs), comment); + } + + /** + * Emit a store-word instruction: MEMORY[RS1 + IMM]:4 = RS2, where + * -2048 <= IMM < 2048. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSW(Register rs2, Register rs1, Integer imm, + String comment) { + emitInsn(String.format("sw %s, %d(%s)", rs2, imm, rs1), comment); + } + + /** + * Emit a store-word instruction: MEMORY[RS1 + IMM]:4 = RS2, where + * -2048 <= IMM < 2048. Here, IMM is symbolic constant expression + * (see emitADDI). COMMENT is an optional one-line + * comment (null if missing). + */ + public void emitSW(Register rs2, Register rs1, String imm, + String comment) { + emitInsn(String.format("sw %s, %s(%s)", rs2, imm, rs1), comment); + } + + /** + * Emit a load-word instruction for globals: RD = MEMORY[LABEL]:4. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitLW(Register rd, Label label, String comment) { + emitInsn(String.format("lw %s, %s", rd, label), comment); + } + + /** + * Emit a store-word instruction for globals: MEMORY[LABEL]:4 = RS, + * using TMP as a temporary register. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSW(Register rs, Label label, Register tmp, + String comment) { + emitInsn(String.format("sw %s, %s, %s", rs, label, tmp), comment); + } + + /** + * Emit a load-byte instruction: RD = MEMORY[RS + IMM]:1, where + * -2048 <= IMM < 2048. Sign extends the byte loaded. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitLB(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("lb %s, %d(%s)", rd, imm, rs), comment); + } + + /** + * Emit a load-byte-unsigned instruction: RD = MEMORY[RS + IMM]:1, where + * -2048 <= IMM < 2048. Zero-extends the byte loaded. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitLBU(Register rd, Register rs, Integer imm, + String comment) { + emitInsn(String.format("lbu %s, %d(%s)", rd, imm, rs), comment); + } + + /** + * Emit a store-byte instruction: MEMORY[RS1 + IMM]:1 = RS2, where + * -2048 <= IMM < 2048. Assigns the low-order byte of RS2 to memory. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSB(Register rs2, Register rs1, Integer imm, + String comment) { + emitInsn(String.format("sb %s, %d(%s)", rs2, imm, rs1), comment); + } + + /** + * Emit a branch-if-equal instruction: if RS1 == RS2 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBEQ(Register rs1, Register rs2, Label label, + String comment) { + emitInsn(String.format("beq %s, %s, %s", rs1, rs2, label), comment); + } + + /** + * Emit a branch-if-unequal instruction: if RS1 != RS2 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBNE(Register rs1, Register rs2, Label label, + String comment) { + emitInsn(String.format("bne %s, %s, %s", rs1, rs2, label), comment); + } + + /** + * Emit a branch-if-greater-or-equal (signed) instruction: + * if RS1 >= RS2 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBGE(Register rs1, Register rs2, Label label, + String comment) { + emitInsn(String.format("bge %s, %s, %s", rs1, rs2, label), comment); + } + + /** + * Emit a branch-if-greater-or-equal (unsigned) instruction: + * if RS1 >= RS2 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBGEU(Register rs1, Register rs2, Label label, + String comment) { + emitInsn(String.format("bgeu %s, %s, %s", rs1, rs2, label), comment); + } + + /** + * Emit a branch-if-greater-or-equal (signed) instruction: + * if RS1 >= RS2 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBLT(Register rs1, Register rs2, Label label, + String comment) { + emitInsn(String.format("blt %s, %s, %s", rs1, rs2, label), comment); + } + + /** + * Emit a branch-if-greater-or-equal (unsigned) instruction: + * if RS1 >= RS2 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBLTU(Register rs1, Register rs2, Label label, + String comment) { + emitInsn(String.format("bltu %s, %s, %s", rs1, rs2, label), comment); + } + + /** + * Emit a branch-if-zero instruction: if RS == 0 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBEQZ(Register rs, Label label, String comment) { + emitInsn(String.format("beqz %s, %s", rs, label), comment); + } + + /** + * Emit a branch-if-not-zero instruction: if RS != 0 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBNEZ(Register rs, Label label, String comment) { + emitInsn(String.format("bnez %s, %s", rs, label), comment); + } + + /** + * Emit a branch-if-less-than-zero instruction: if RS < 0 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBLTZ(Register rs, Label label, String comment) { + emitInsn(String.format("bltz %s, %s", rs, label), comment); + } + + /** + * Emit a branch-if-greater-than-zero instruction: if RS > 0 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBGTZ(Register rs, Label label, String comment) { + emitInsn(String.format("bgtz %s, %s", rs, label), comment); + } + + /** + * Emit a branch-if-less-than-equal-to-zero instruction: + * if RS <= 0 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBLEZ(Register rs, Label label, String comment) { + emitInsn(String.format("blez %s, %s", rs, label), comment); + } + + /** + * Emit a branch-if-greater-than-equal-to-zero instruction: + * if RS >= 0 goto LABEL. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitBGEZ(Register rs, Label label, String comment) { + emitInsn(String.format("bgez %s, %s", rs, label), comment); + } + + /** + * Emit a set-less-than instruction: RD = 1 if RS1 < RS2 else 0. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSLT(Register rd, Register rs1, Register rs2, + String comment) { + emitInsn(String.format("slt %s, %s, %s", rd, rs1, rs2), comment); + } + + /** + * Emit a set-if-zero instruction: RD = 1 if RS == 0 else 0. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSEQZ(Register rd, Register rs, String comment) { + emitInsn(String.format("seqz %s, %s", rd, rs), comment); + } + + /** + * Emit a set-if-not-zero instruction: RD = 1 if RS != 0 else 0. + * COMMENT is an optional one-line comment (null if missing). + */ + public void emitSNEZ(Register rd, Register rs, String comment) { + emitInsn(String.format("snez %s, %s", rd, rs), comment); + } + +} diff --git a/src/main/java/chocopy/common/codegen/StackVarInfo.java b/src/main/java/chocopy/common/codegen/StackVarInfo.java new file mode 100644 index 0000000..066ee7d --- /dev/null +++ b/src/main/java/chocopy/common/codegen/StackVarInfo.java @@ -0,0 +1,30 @@ +package chocopy.common.codegen; + +import chocopy.common.analysis.types.ValueType; +import chocopy.common.astnodes.Literal; + +/** Code-generation information about a local variable or parameter. */ +public class StackVarInfo extends VarInfo { + + /** Information about the enclosing function. */ + protected final FuncInfo funcInfo; + + /** + * A descriptor for a local variable or parameter VARNAME of type VARTYPE, + * whose initial value is given by INITIALVALUE (null if no initial value), + * and which is nested immediately within the function described + * by FUNCINFO. + */ + public StackVarInfo(String varName, ValueType varType, Literal initialValue, + FuncInfo funcInfo) { + super(varName, varType, initialValue); + this.funcInfo = funcInfo; + } + + /** + * Returns the descriptor of the function in which this var is defined. + */ + public FuncInfo getFuncInfo() { + return funcInfo; + } +} diff --git a/src/main/java/chocopy/common/codegen/SymbolInfo.java b/src/main/java/chocopy/common/codegen/SymbolInfo.java new file mode 100644 index 0000000..8a2fd0a --- /dev/null +++ b/src/main/java/chocopy/common/codegen/SymbolInfo.java @@ -0,0 +1,9 @@ +package chocopy.common.codegen; + +/** + * Abstract base class for all the Info classes that + * store information about a symbol during code generation. + */ +public abstract class SymbolInfo { + +} diff --git a/src/main/java/chocopy/common/codegen/VarInfo.java b/src/main/java/chocopy/common/codegen/VarInfo.java new file mode 100644 index 0000000..f435765 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/VarInfo.java @@ -0,0 +1,41 @@ +package chocopy.common.codegen; + +import chocopy.common.analysis.types.ValueType; +import chocopy.common.astnodes.Literal; + +/** Information about a variable or attribute. */ +public abstract class VarInfo extends SymbolInfo { + + /** Name of variable or attribute. */ + protected final String varName; + /** Runtime location of initial value for this variable or attribute. */ + protected final Literal initialValue; + /** Static type of the variable. */ + protected final ValueType varType; + + /** + * A descriptor for variable or attribute VARNAME with VARTYPE as its static + * type and INITIALVALUE as its initial value (or null if None). + */ + public VarInfo(String varName, ValueType varType, Literal initialValue) { + this.varName = varName; + this.varType = varType; + this.initialValue = initialValue; + } + + /** Returns the name of this variable or attribute. */ + public String getVarName() { + return varName; + } + + /** Returns the type of this variable or attribute. */ + public ValueType getVarType() { + return varType; + } + + /** Returns the initial value of this variable or attribute. */ + public Literal getInitialValue() { + return initialValue; + } + +} diff --git a/src/main/java/chocopy/common/codegen/asm/abort.s b/src/main/java/chocopy/common/codegen/asm/abort.s new file mode 100644 index 0000000..fa8148a --- /dev/null +++ b/src/main/java/chocopy/common/codegen/asm/abort.s @@ -0,0 +1,12 @@ +# Runtime support function abort (does not return). + mv t0, a0 # Save exit code in temp + li a0, @print_string # Code for print_string ecall + ecall # Print error message in a1 + li a1, 10 # Load newline character + li a0, @print_char # Code for print_char ecall + ecall # Print newline + mv a1, t0 # Move exit code to a1 + li a0, @exit2 # Code for exit2 ecall + ecall # Exit with code +abort_17: # Infinite loop + j abort_17 # Prevent fallthrough diff --git a/src/main/java/chocopy/common/codegen/asm/alloc.s b/src/main/java/chocopy/common/codegen/asm/alloc.s new file mode 100644 index 0000000..da54abe --- /dev/null +++ b/src/main/java/chocopy/common/codegen/asm/alloc.s @@ -0,0 +1,4 @@ +# Runtime support function alloc. + # Prototype address is in a0. + lw a1, 4(a0) # Get size of object in words + j alloc2 # Allocate object with exact size diff --git a/src/main/java/chocopy/common/codegen/asm/alloc2.s b/src/main/java/chocopy/common/codegen/asm/alloc2.s new file mode 100644 index 0000000..9540512 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/asm/alloc2.s @@ -0,0 +1,27 @@ +# Runtime support function alloc2 (realloc). + # Prototype address is in a0. + # Number of words to allocate is in a1. + li a2, 4 # Word size in bytes + mul a2, a1, a2 # Calculate number of bytes to allocate + add a2, gp, a2 # Estimate where GP will move + bgeu a2, s11, alloc2_15 # Go to OOM handler if too large + lw t0, @.__obj_size__(a0) # Get size of object in words + mv t2, a0 # Initialize src ptr + mv t3, gp # Initialize dest ptr +alloc2_16: # Copy-loop header + lw t1, 0(t2) # Load next word from src + sw t1, 0(t3) # Store next word to dest + addi t2, t2, 4 # Increment src + addi t3, t3, 4 # Increment dest + addi t0, t0, -1 # Decrement counter + bne t0, zero, alloc2_16 # Loop if more words left to copy + mv a0, gp # Save new object's address to return + sw a1, @.__obj_size__(a0) # Set size of new object in words + # (same as requested size) + mv gp, a2 # Set next free slot in the heap + jr ra # Return to caller +alloc2_15: # OOM handler + li a0, @error_oom # Exit code for: Out of memory + la a1, STRING["Out of memory"] # Load error message as str + addi a1, a1, @.__str__ # Load address of attribute __str__ + j abort # Abort diff --git a/src/main/java/chocopy/common/codegen/asm/heap.init.s b/src/main/java/chocopy/common/codegen/asm/heap.init.s new file mode 100644 index 0000000..5dfe9a8 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/asm/heap.init.s @@ -0,0 +1,5 @@ +# Runtime support function heap.init. + mv a1, a0 # Move requested size to A1 + li a0, @sbrk # Code for ecall: sbrk + ecall # Request A1 bytes + jr ra # Return to caller diff --git a/src/main/java/chocopy/common/codegen/asm/input.s b/src/main/java/chocopy/common/codegen/asm/input.s new file mode 100644 index 0000000..0e282ea --- /dev/null +++ b/src/main/java/chocopy/common/codegen/asm/input.s @@ -0,0 +1,5 @@ +# Function input + li a0, @error_nyi # Exit code for: Unsupported operation + la a1, STRING["Unsupported operation"] # Load error message as str + addi a1, a1, @.__str__ # Load address of attribute __str__ + j abort # Abort diff --git a/src/main/java/chocopy/common/codegen/asm/len.s b/src/main/java/chocopy/common/codegen/asm/len.s new file mode 100644 index 0000000..72e9bea --- /dev/null +++ b/src/main/java/chocopy/common/codegen/asm/len.s @@ -0,0 +1,20 @@ +# Function len + # We do not save/restore fp/ra for this function + # because we know that it does not use the stack or does not + # call other functions. + + lw a0, 0(sp) # Load arg + beq a0, zero, len_12 # None is an illegal argument + lw t0, 0(a0) # Get type tag of arg + li t1, 3 # Load type tag of `str` + beq t0, t1, len_13 # Go to len(str) + li t1, -1 # Load type tag for list objects + beq t0, t1, len_13 # Go to len(list) +len_12: # Invalid argument + li a0, @error_arg # Exit code for: Invalid argument + la a1, STRING["Invalid argument"] # Load error message as str + addi a1, a1, @.__str__ # Load address of attribute __str__ + j abort # Abort +len_13: # Get length of string + lw a0, @.__len__(a0) # Load attribute: __len__ + jr ra # Return to caller diff --git a/src/main/java/chocopy/common/codegen/asm/object.__init__.s b/src/main/java/chocopy/common/codegen/asm/object.__init__.s new file mode 100644 index 0000000..e326950 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/asm/object.__init__.s @@ -0,0 +1,3 @@ +# Init method for type object. + mv a0, zero # `None` constant + jr ra # Return diff --git a/src/main/java/chocopy/common/codegen/asm/print.s b/src/main/java/chocopy/common/codegen/asm/print.s new file mode 100644 index 0000000..4a9d376 --- /dev/null +++ b/src/main/java/chocopy/common/codegen/asm/print.s @@ -0,0 +1,52 @@ +# Function print + lw a0, 0(sp) # Load arg + beq a0, zero, print_6 # None is an illegal argument + lw t0, 0(a0) # Get type tag of arg + li t1, 1 # Load type tag of `int` + beq t0, t1, print_7 # Go to print(int) + li t1, 3 # Load type tag of `str` + beq t0, t1, print_8 # Go to print(str) + li t1, 2 # Load type tag of `bool` + beq t0, t1, print_9 # Go to print(bool) +print_6: # Invalid argument + li a0, 1 # Exit code for: Invalid argument + la a1, STRING["Invalid argument"] # Load error message as str + addi a1, a1, @.__str__ # Load address of attribute __str__ + j abort # Abort + +# Printing bools +print_9: # Print bool object in A0 + lw a0, @.__bool__(a0) # Load attribute __bool__ + beq a0, zero, print_10 # Go to: print(False) + la a0, STRING["True"] # String representation: True + j print_8 # Go to: print(str) +print_10: # Print False object in A0 + la a0, STRING["False"] # String representation: False + j print_8 # Go to: print(str) + +# Printing strs. +print_8: # Print str object in A0 + addi a1, a0, @.__str__ # Load address of attribute __str__ + j print_11 # Print the null-terminated string is now in A1 + mv a0, zero # Load None + j print_5 # Go to return +print_11: # Print null-terminated string in A1 + li a0, @print_string # Code for ecall: print_string + ecall # Print string + li a1, 10 # Load newline character + li a0, @print_char # Code for ecall: print_char + ecall # Print character + j print_5 # Go to return + +# Printing ints. +print_7: # Print int object in A0 + lw a1, @.__int__(a0) # Load attribute __int__ + li a0, @print_int # Code for ecall: print_int + ecall # Print integer + li a1, 10 # Load newline character + li a0, 11 # Code for ecall: print_char + ecall # Print character + +print_5: # End of function + mv a0, zero # Load None + jr ra # Return to caller diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java new file mode 100644 index 0000000..7d6c69f --- /dev/null +++ b/src/main/java/chocopy/pa3/CodeGenImpl.java @@ -0,0 +1,204 @@ +package chocopy.pa3; + +import java.util.List; + +import chocopy.common.analysis.SymbolTable; +import chocopy.common.analysis.AbstractNodeAnalyzer; +import chocopy.common.astnodes.Stmt; +import chocopy.common.astnodes.ReturnStmt; +import chocopy.common.codegen.CodeGenBase; +import chocopy.common.codegen.FuncInfo; +import chocopy.common.codegen.Label; +import chocopy.common.codegen.RiscVBackend; +import chocopy.common.codegen.SymbolInfo; + +import static chocopy.common.codegen.RiscVBackend.Register.*; + +/** + * This is where the main implementation of PA3 will live. + * + * A large part of the functionality has already been implemented + * in the base class, CodeGenBase. Make sure to read through that + * class, since you will want to use many of its fields + * and utility methods in this class when emitting code. + * + * Also read the PDF spec for details on what the base class does and + * what APIs it exposes for its sub-class (this one). Of particular + * importance is knowing what all the SymbolInfo classes contain. + */ +public class CodeGenImpl extends CodeGenBase { + + /** A code generator emitting instructions to BACKEND. */ + public CodeGenImpl(RiscVBackend backend) { + super(backend); + } + + /** Operation on None. */ + private final Label errorNone = new Label("error.None"); + /** Division by zero. */ + private final Label errorDiv = new Label("error.Div"); + /** Index out of bounds. */ + private final Label errorOob = new Label("error.OOB"); + + /** + * Emits the top level of the program. + * + * This method is invoked exactly once, and is surrounded + * by some boilerplate code that: (1) initializes the heap + * before the top-level begins and (2) exits after the top-level + * ends. + * + * You only need to generate code for statements. + * + * @param statements top level statements + */ + protected void emitTopLevel(List<Stmt> statements) { + StmtAnalyzer stmtAnalyzer = new StmtAnalyzer(null); + backend.emitADDI(SP, SP, -2 * backend.getWordSize(), + "Saved FP and saved RA (unused at top level)."); + backend.emitSW(ZERO, SP, 0, "Top saved FP is 0."); + backend.emitSW(ZERO, SP, 4, "Top saved RA is 0."); + backend.emitADDI(FP, SP, 2 * backend.getWordSize(), + "Set FP to previous SP."); + + for (Stmt stmt : statements) { + stmt.dispatch(stmtAnalyzer); + } + backend.emitLI(A0, EXIT_ECALL, "Code for ecall: exit"); + backend.emitEcall(null); + } + + /** + * Emits the code for a function described by FUNCINFO. + * + * This method is invoked once per function and method definition. + * At the code generation stage, nested functions are emitted as + * separate functions of their own. So if function `bar` is nested within + * function `foo`, you only emit `foo`'s code for `foo` and only emit + * `bar`'s code for `bar`. + */ + protected void emitUserDefinedFunction(FuncInfo funcInfo) { + backend.emitGlobalLabel(funcInfo.getCodeLabel()); + StmtAnalyzer stmtAnalyzer = new StmtAnalyzer(funcInfo); + + for (Stmt stmt : funcInfo.getStatements()) { + stmt.dispatch(stmtAnalyzer); + } + + backend.emitMV(A0, ZERO, "Returning None implicitly"); + backend.emitLocalLabel(stmtAnalyzer.epilogue, "Epilogue"); + + // FIXME: {... reset fp etc. ...} + backend.emitJR(RA, "Return to caller"); + } + + /** An analyzer that encapsulates code generation for statments. */ + private class StmtAnalyzer extends AbstractNodeAnalyzer<Void> { + /* + * The symbol table has all the info you need to determine + * what a given identifier 'x' in the current scope is. You can + * use it as follows: + * SymbolInfo x = sym.get("x"); + * + * A SymbolInfo can be one the following: + * - ClassInfo: a descriptor for classes + * - FuncInfo: a descriptor for functions/methods + * - AttrInfo: a descriptor for attributes + * - GlobalVarInfo: a descriptor for global variables + * - StackVarInfo: a descriptor for variables allocated on the stack, + * such as locals and parameters + * + * Since the input program is assumed to be semantically + * valid and well-typed at this stage, you can always assume that + * the symbol table contains valid information. For example, in + * an expression `foo()` you KNOW that sym.get("foo") will either be + * a FuncInfo or ClassInfo, but not any of the other infos + * and never null. + * + * The symbol table in funcInfo has already been populated in + * the base class: CodeGenBase. You do not need to add anything to + * the symbol table. Simply query it with an identifier name to + * get a descriptor for a function, class, variable, etc. + * + * The symbol table also maps nonlocal and global vars, so you + * only need to lookup one symbol table and it will fetch the + * appropriate info for the var that is currently in scope. + */ + + /** Symbol table for my statements. */ + private SymbolTable<SymbolInfo> sym; + + /** Label of code that exits from procedure. */ + protected Label epilogue; + + /** The descriptor for the current function, or null at the top + * level. */ + private FuncInfo funcInfo; + + /** An analyzer for the function described by FUNCINFO0, which is null + * for the top level. */ + StmtAnalyzer(FuncInfo funcInfo0) { + funcInfo = funcInfo0; + if (funcInfo == null) { + sym = globalSymbols; + } else { + sym = funcInfo.getSymbolTable(); + } + epilogue = generateLocalLabel(); + } + + // FIXME: Example of statement. + @Override + public Void analyze(ReturnStmt stmt) { + // FIXME: Here, we emit an instruction that does nothing. Clearly, + // this is wrong, and you'll have to fix it. + // This is here just to demonstrate how to emit a + // RISC-V instruction. + backend.emitMV(ZERO, ZERO, "No-op"); + return null; + } + + // FIXME: More, of course. + + } + + /** + * Emits custom code in the CODE segment. + * + * This method is called after emitting the top level and the + * function bodies for each function. + * + * You can use this method to emit anything you want outside of the + * top level or functions, e.g. custom routines that you may want to + * call from within your code to do common tasks. This is not strictly + * needed. You might not modify this at all and still complete + * the assignment. + * + * To start you off, here is an implementation of three routines that + * will be commonly needed from within the code you will generate + * for statements. + * + * The routines are error handlers for operations on None, index out + * of bounds, and division by zero. They never return to their caller. + * Just jump to one of these routines to throw an error and + * exit the program. For example, to throw an OOB error: + * backend.emitJ(errorOob, "Go to out-of-bounds error and abort"); + * + */ + protected void emitCustomCode() { + emitErrorFunc(errorNone, "Operation on None"); + emitErrorFunc(errorDiv, "Divison by zero"); + emitErrorFunc(errorOob, "Index out of bounds"); + } + + /** Emit an error routine labeled ERRLABEL that aborts with message MSG. */ + private void emitErrorFunc(Label errLabel, String msg) { + backend.emitGlobalLabel(errLabel); + backend.emitLI(A0, ERROR_NONE, "Exit code for: " + msg); + backend.emitLA(A1, constants.getStrConstant(msg), + "Load error message as str"); + backend.emitADDI(A1, A1, getAttrOffset(strClass, "__str__"), + "Load address of attribute __str__"); + backend.emitJ(abortLabel, "Abort"); + } +} diff --git a/src/main/java/chocopy/pa3/StudentCodeGen.java b/src/main/java/chocopy/pa3/StudentCodeGen.java new file mode 100644 index 0000000..dac8b37 --- /dev/null +++ b/src/main/java/chocopy/pa3/StudentCodeGen.java @@ -0,0 +1,34 @@ +package chocopy.pa3; + +import chocopy.common.astnodes.Program; +import chocopy.common.codegen.CodeGenBase; +import chocopy.common.codegen.RiscVBackend; + +/** Interface to code generator. */ +public class StudentCodeGen { + + /** + * Perform code generation from PROGRAM, assumed to be well-typed, + * to RISC-V, returning the assembly code. DEBUG iff --debug was on the + * command line. + */ + public static String process(Program program, boolean debug) { + /* Emit code into a ByteOutputStream, and convert to a string. + * If you need instructions not provided by RiscVBackend, simply + * use an extension of it. */ + try { + RiscVBackend backend = new RiscVBackend(); + CodeGenBase cgen = new CodeGenImpl(backend); + cgen.generate(program); + + return backend.toString(); + } catch (IllegalStateException | IllegalArgumentException e) { + System.err.println("Error performing code generation. " + + "Re-run with --debug to see stack trace."); + if (debug) { + e.printStackTrace(); + } + return null; + } + } +} diff --git a/src/test/data/pa3/benchmarks/exp.py b/src/test/data/pa3/benchmarks/exp.py new file mode 100644 index 0000000..3915517 --- /dev/null +++ b/src/test/data/pa3/benchmarks/exp.py @@ -0,0 +1,25 @@ +# Compute x**y +def exp(x: int, y: int) -> int: + a: int = 0 + def f(i: int) -> int: + nonlocal a + def geta() -> int: + return a + if i <= 0: + return geta() + else: + a = a * x + return f(i-1) + a = 1 + return f(y) + +# Input parameter +n:int = 42 + +# Run [0, n] +i:int = 0 + +# Crunch +while i <= n: + print(exp(2, i % 31)) + i = i + 1 \ No newline at end of file diff --git a/src/test/data/pa3/benchmarks/exp.py.ast.typed b/src/test/data/pa3/benchmarks/exp.py.ast.typed new file mode 100644 index 0000000..39a7fa1 --- /dev/null +++ b/src/test/data/pa3/benchmarks/exp.py.ast.typed @@ -0,0 +1,562 @@ +{ + "kind" : "Program", + "location" : [ 2, 1, 26, 1 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 2, 1, 14, 13 ], + "name" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 7 ], + "name" : "exp" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 2, 9, 2, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 9, 2, 9 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 12, 2, 14 ], + "className" : "int" + } + }, { + "kind" : "TypedVar", + "location" : [ 2, 17, 2, 22 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 17, 2, 17 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 20, 2, 22 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 2, 28, 2, 30 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 3, 2, 3, 11 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 2, 3, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 2, 3, 2 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 5, 3, 7 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 11, 3, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 2, 13, 1 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 6, 4, 6 ], + "name" : "f" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 8, 4, 13 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 8, 4, 8 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 11, 4, 13 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 19, 4, 21 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "NonLocalDecl", + "location" : [ 5, 3, 5, 12 ], + "variable" : { + "kind" : "Identifier", + "location" : [ 5, 12, 5, 12 ], + "name" : "a" + } + }, { + "kind" : "FuncDef", + "location" : [ 6, 3, 7, 12 ], + "name" : { + "kind" : "Identifier", + "location" : [ 6, 7, 6, 10 ], + "name" : "geta" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 6, 17, 6, 19 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 7, 4, 7, 11 ], + "value" : { + "kind" : "Identifier", + "location" : [ 7, 11, 7, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "a" + } + } ] + } ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 8, 3, 13, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 8, 6, 8, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 8, 6, 8, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<=", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 8, 11, 8, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 9, 4, 9, 16 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 9, 11, 9, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 11, 9, 14 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "geta" + }, + "args" : [ ] + } + } ], + "elseBody" : [ { + "kind" : "AssignStmt", + "location" : [ 11, 4, 11, 12 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 11, 4, 11, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "a" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 11, 8, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 11, 8, 11, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "a" + }, + "operator" : "*", + "right" : { + "kind" : "Identifier", + "location" : [ 11, 12, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } + }, { + "kind" : "ReturnStmt", + "location" : [ 12, 4, 12, 16 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 12, 11, 12, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 11, 12, 11 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "f" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 12, 13, 12, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 12, 13, 12, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "-", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 12, 15, 12, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + } + } ] + } ] + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 13, 2, 13, 6 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 13, 2, 13, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "a" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 13, 6, 13, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + }, { + "kind" : "ReturnStmt", + "location" : [ 14, 2, 14, 12 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 14, 9, 14, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 9, 14, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "f" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 14, 11, 14, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } ] + } + } ] + }, { + "kind" : "VarDef", + "location" : [ 17, 1, 17, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 17, 1, 17, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 17, 1, 17, 1 ], + "name" : "n" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 17, 3, 17, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 17, 9, 17, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "VarDef", + "location" : [ 20, 1, 20, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 20, 1, 20, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 20, 1, 20, 1 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 20, 3, 20, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 20, 9, 20, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "WhileStmt", + "location" : [ 23, 1, 26, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 23, 7, 23, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 23, 7, 23, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<=", + "right" : { + "kind" : "Identifier", + "location" : [ 23, 12, 23, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "n" + } + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 24, 2, 24, 22 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 24, 2, 24, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 24, 2, 24, 6 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 24, 8, 24, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 24, 8, 24, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "exp" + }, + "args" : [ { + "kind" : "IntegerLiteral", + "location" : [ 24, 12, 24, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "BinaryExpr", + "location" : [ 24, 15, 24, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 24, 15, 24, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "%", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 24, 19, 24, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 31 + } + } ] + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 25, 2, 25, 10 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 25, 2, 25, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 25, 6, 25, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 25, 6, 25, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 25, 10, 25, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/benchmarks/exp.py.ast.typed.s.result b/src/test/data/pa3/benchmarks/exp.py.ast.typed.s.result new file mode 100644 index 0000000..6bce2e5 --- /dev/null +++ b/src/test/data/pa3/benchmarks/exp.py.ast.typed.s.result @@ -0,0 +1,43 @@ +1 +2 +4 +8 +16 +32 +64 +128 +256 +512 +1024 +2048 +4096 +8192 +16384 +32768 +65536 +131072 +262144 +524288 +1048576 +2097152 +4194304 +8388608 +16777216 +33554432 +67108864 +134217728 +268435456 +536870912 +1073741824 +1 +2 +4 +8 +16 +32 +64 +128 +256 +512 +1024 +2048 diff --git a/src/test/data/pa3/benchmarks/prime.py b/src/test/data/pa3/benchmarks/prime.py new file mode 100644 index 0000000..7568705 --- /dev/null +++ b/src/test/data/pa3/benchmarks/prime.py @@ -0,0 +1,30 @@ +# Get the n-th prime starting from 2 +def get_prime(n:int) -> int: + candidate:int = 2 + found:int = 0 + while True: + if is_prime(candidate): + found = found + 1 + if found == n: + return candidate + candidate = candidate + 1 + return 0 # Never happens + +def is_prime(x:int) -> bool: + div:int = 2 + while div < x: + if x % div == 0: + return False + div = div + 1 + return True + +# Input parameter +n:int = 15 + +# Run [1, n] +i:int = 1 + +# Crunch +while i <= n: + print(get_prime(i)) + i = i + 1 diff --git a/src/test/data/pa3/benchmarks/prime.py.ast.typed b/src/test/data/pa3/benchmarks/prime.py.ast.typed new file mode 100644 index 0000000..a3062b6 --- /dev/null +++ b/src/test/data/pa3/benchmarks/prime.py.ast.typed @@ -0,0 +1,658 @@ +{ + "kind" : "Program", + "location" : [ 2, 1, 31, 1 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 2, 1, 11, 29 ], + "name" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 13 ], + "name" : "get_prime" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 2, 15, 2, 19 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 15, 2, 15 ], + "name" : "n" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 17, 2, 19 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 2, 25, 2, 27 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 3, 5, 3, 21 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 5, 3, 17 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 13 ], + "name" : "candidate" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 15, 3, 17 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 21, 3, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + }, { + "kind" : "VarDef", + "location" : [ 4, 5, 4, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 5, 4, 13 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 9 ], + "name" : "found" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 11, 4, 13 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 17, 4, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "WhileStmt", + "location" : [ 5, 5, 11, 4 ], + "condition" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 11, 5, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "body" : [ { + "kind" : "IfStmt", + "location" : [ 6, 9, 10, 8 ], + "condition" : { + "kind" : "CallExpr", + "location" : [ 6, 12, 6, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 12, 6, 19 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "is_prime" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 6, 21, 6, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "candidate" + } ] + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 13, 7, 29 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 7, 13, 7, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "found" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 7, 21, 7, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 7, 21, 7, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "found" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 7, 29, 7, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + }, { + "kind" : "IfStmt", + "location" : [ 8, 13, 10, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 8, 16, 8, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 8, 16, 8, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "found" + }, + "operator" : "==", + "right" : { + "kind" : "Identifier", + "location" : [ 8, 25, 8, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "n" + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 9, 17, 9, 32 ], + "value" : { + "kind" : "Identifier", + "location" : [ 9, 24, 9, 32 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "candidate" + } + } ], + "elseBody" : [ ] + } ], + "elseBody" : [ ] + }, { + "kind" : "AssignStmt", + "location" : [ 10, 9, 10, 33 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 10, 9, 10, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "candidate" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 10, 21, 10, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 10, 21, 10, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "candidate" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 10, 33, 10, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + }, { + "kind" : "ReturnStmt", + "location" : [ 11, 5, 11, 12 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 11, 12, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 13, 1, 19, 16 ], + "name" : { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 12 ], + "name" : "is_prime" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 13, 14, 13, 18 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 13, 14, 13, 14 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 13, 16, 13, 18 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 13, 24, 13, 27 ], + "className" : "bool" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 14, 5, 14, 15 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 14, 5, 14, 11 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 14, 5, 14, 7 ], + "name" : "div" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 14, 9, 14, 11 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 14, 15, 14, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } ], + "statements" : [ { + "kind" : "WhileStmt", + "location" : [ 15, 5, 19, 4 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 15, 11, 15, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 15, 11, 15, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "div" + }, + "operator" : "<", + "right" : { + "kind" : "Identifier", + "location" : [ 15, 17, 15, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + }, + "body" : [ { + "kind" : "IfStmt", + "location" : [ 16, 9, 18, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 16, 12, 16, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 16, 12, 16, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 16, 12, 16, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "%", + "right" : { + "kind" : "Identifier", + "location" : [ 16, 16, 16, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "div" + } + }, + "operator" : "==", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 16, 23, 16, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 17, 13, 17, 24 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 17, 20, 17, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ], + "elseBody" : [ ] + }, { + "kind" : "AssignStmt", + "location" : [ 18, 9, 18, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 18, 9, 18, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "div" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 18, 15, 18, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 18, 15, 18, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "div" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 18, 21, 18, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + }, { + "kind" : "ReturnStmt", + "location" : [ 19, 5, 19, 15 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 19, 12, 19, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ] + }, { + "kind" : "VarDef", + "location" : [ 22, 1, 22, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 22, 1, 22, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 22, 1, 22, 1 ], + "name" : "n" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 22, 3, 22, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 22, 9, 22, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 15 + } + }, { + "kind" : "VarDef", + "location" : [ 25, 1, 25, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 25, 1, 25, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 25, 1, 25, 1 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 25, 3, 25, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 25, 9, 25, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "statements" : [ { + "kind" : "WhileStmt", + "location" : [ 28, 1, 31, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 28, 7, 28, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 28, 7, 28, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<=", + "right" : { + "kind" : "Identifier", + "location" : [ 28, 12, 28, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "n" + } + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 29, 5, 29, 23 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 29, 5, 29, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 29, 5, 29, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 29, 11, 29, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 29, 11, 29, 19 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "get_prime" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 29, 21, 29, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ] + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 30, 5, 30, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 30, 5, 30, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 30, 9, 30, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 30, 9, 30, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 30, 13, 30, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/benchmarks/prime.py.ast.typed.s.result b/src/test/data/pa3/benchmarks/prime.py.ast.typed.s.result new file mode 100644 index 0000000..6beaeaa --- /dev/null +++ b/src/test/data/pa3/benchmarks/prime.py.ast.typed.s.result @@ -0,0 +1,15 @@ +2 +3 +5 +7 +11 +13 +17 +19 +23 +29 +31 +37 +41 +43 +47 diff --git a/src/test/data/pa3/benchmarks/sieve.py b/src/test/data/pa3/benchmarks/sieve.py new file mode 100644 index 0000000..b6aa977 --- /dev/null +++ b/src/test/data/pa3/benchmarks/sieve.py @@ -0,0 +1,107 @@ +# A resizable list of integers +class Vector(object): + items: [int] = None + size: int = 0 + + def __init__(self:"Vector"): + self.items = [0] + + # Returns current capacity + def capacity(self:"Vector") -> int: + return len(self.items) + + # Increases capacity of vector by one element + def increase_capacity(self:"Vector") -> int: + self.items = self.items + [0] + return self.capacity() + + # Appends one item to end of vector + def append(self:"Vector", item: int) -> object: + if self.size == self.capacity(): + self.increase_capacity() + + self.items[self.size] = item + self.size = self.size + 1 + + # Appends many items to end of vector + def append_all(self:"Vector", new_items: [int]) -> object: + item:int = 0 + for item in new_items: + self.append(item) + + # Removes an item from the middle of vector + def remove_at(self:"Vector", idx: int) -> object: + if idx < 0: + return + + while idx < self.size - 1: + self.items[idx] = self.items[idx + 1] + idx = idx + 1 + + self.size = self.size - 1 + + # Retrieves an item at a given index + def get(self:"Vector", idx: int) -> int: + return self.items[idx] + + # Retrieves the current size of the vector + def length(self:"Vector") -> int: + return self.size + +# A faster (but more memory-consuming) implementation of vector +class DoublingVector(Vector): + doubling_limit:int = 1000 + + # Overriding to do fewer resizes + def increase_capacity(self:"DoublingVector") -> int: + if (self.capacity() <= self.doubling_limit // 2): + self.items = self.items + self.items + else: + # If doubling limit has been reached, fall back to + # standard capacity increases + self.items = self.items + [0] + return self.capacity() + +# Makes a vector in the range [i, j) +def vrange(i:int, j:int) -> Vector: + v:Vector = None + v = DoublingVector() + + while i < j: + v.append(i) + i = i + 1 + + return v + +# Sieve of Eratosthenes (not really) +def sieve(v:Vector) -> object: + i:int = 0 + j:int = 0 + k:int = 0 + + while i < v.length(): + k = v.get(i) + j = i + 1 + while j < v.length(): + if v.get(j) % k == 0: + v.remove_at(j) + else: + j = j + 1 + i = i + 1 + +# Input parameter +n:int = 50 + +# Data +v:Vector = None +i:int = 0 + +# Crunch +v = vrange(2, n) +sieve(v) + +# Print +while i < v.length(): + print(v.get(i)) + i = i + 1 + diff --git a/src/test/data/pa3/benchmarks/sieve.py.ast.typed b/src/test/data/pa3/benchmarks/sieve.py.ast.typed new file mode 100644 index 0000000..1c0eb6c --- /dev/null +++ b/src/test/data/pa3/benchmarks/sieve.py.ast.typed @@ -0,0 +1,2816 @@ +{ + "kind" : "Program", + "location" : [ 2, 1, 108, 1 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 2, 1, 52, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 2, 7, 2, 12 ], + "name" : "Vector" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 2, 14, 2, 19 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 3, 5, 3, 23 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 5, 3, 16 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 9 ], + "name" : "items" + }, + "type" : { + "kind" : "ListType", + "location" : [ 3, 12, 3, 16 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 3, 13, 3, 15 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 3, 20, 3, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 4, 5, 4, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 5, 4, 13 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 8 ], + "name" : "size" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 11, 4, 13 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 17, 4, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "FuncDef", + "location" : [ 6, 5, 7, 25 ], + "name" : { + "kind" : "Identifier", + "location" : [ 6, 9, 6, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 6, 18, 6, 30 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 6, 18, 6, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 6, 23, 6, 30 ], + "className" : "Vector" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 6, 32, 6, 32 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 9, 7, 24 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 7, 9, 7, 18 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 7, 14, 7, 18 ], + "name" : "items" + } + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 7, 22, 7, 24 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 7, 23, 7, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 10, 5, 11, 31 ], + "name" : { + "kind" : "Identifier", + "location" : [ 10, 9, 10, 16 ], + "name" : "capacity" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 10, 18, 10, 30 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 18, 10, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 23, 10, 30 ], + "className" : "Vector" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 10, 36, 10, 38 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 11, 9, 11, 30 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 11, 16, 11, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 16, 11, 18 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 11, 20, 11, 29 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 11, 20, 11, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 11, 25, 11, 29 ], + "name" : "items" + } + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 14, 5, 16, 31 ], + "name" : { + "kind" : "Identifier", + "location" : [ 14, 9, 14, 25 ], + "name" : "increase_capacity" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 14, 27, 14, 39 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 14, 27, 14, 30 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 14, 32, 14, 39 ], + "className" : "Vector" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 14, 45, 14, 47 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 15, 9, 15, 37 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 15, 9, 15, 18 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 9, 15, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 14, 15, 18 ], + "name" : "items" + } + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 15, 22, 15, 37 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 15, 22, 15, 31 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 22, 15, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 27, 15, 31 ], + "name" : "items" + } + }, + "operator" : "+", + "right" : { + "kind" : "ListExpr", + "location" : [ 15, 35, 15, 37 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 15, 36, 15, 36 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } ] + } + } + }, { + "kind" : "ReturnStmt", + "location" : [ 16, 9, 16, 30 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 16, 16, 16, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 16, 16, 16, 28 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 16, 16, 16, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 16, 21, 16, 28 ], + "name" : "capacity" + } + }, + "args" : [ ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 19, 5, 24, 34 ], + "name" : { + "kind" : "Identifier", + "location" : [ 19, 9, 19, 14 ], + "name" : "append" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 19, 16, 19, 28 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 19, 16, 19, 19 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 19, 21, 19, 28 ], + "className" : "Vector" + } + }, { + "kind" : "TypedVar", + "location" : [ 19, 31, 19, 39 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 19, 31, 19, 34 ], + "name" : "item" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 19, 37, 19, 39 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 19, 45, 19, 50 ], + "className" : "object" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 20, 9, 23, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 20, 12, 20, 39 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 20, 12, 20, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 20, 12, 20, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 20, 17, 20, 20 ], + "name" : "size" + } + }, + "operator" : "==", + "right" : { + "kind" : "MethodCallExpr", + "location" : [ 20, 25, 20, 39 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 20, 25, 20, 37 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 20, 25, 20, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 20, 30, 20, 37 ], + "name" : "capacity" + } + }, + "args" : [ ] + } + }, + "thenBody" : [ { + "kind" : "ExprStmt", + "location" : [ 21, 13, 21, 36 ], + "expr" : { + "kind" : "MethodCallExpr", + "location" : [ 21, 13, 21, 36 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 21, 13, 21, 34 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 21, 13, 21, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 21, 18, 21, 34 ], + "name" : "increase_capacity" + } + }, + "args" : [ ] + } + } ], + "elseBody" : [ ] + }, { + "kind" : "AssignStmt", + "location" : [ 23, 9, 23, 36 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 23, 9, 23, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "MemberExpr", + "location" : [ 23, 9, 23, 18 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 23, 9, 23, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 23, 14, 23, 18 ], + "name" : "items" + } + }, + "index" : { + "kind" : "MemberExpr", + "location" : [ 23, 20, 23, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 23, 20, 23, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 23, 25, 23, 28 ], + "name" : "size" + } + } + } ], + "value" : { + "kind" : "Identifier", + "location" : [ 23, 33, 23, 36 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "item" + } + }, { + "kind" : "AssignStmt", + "location" : [ 24, 9, 24, 33 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 24, 9, 24, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 24, 9, 24, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 24, 14, 24, 17 ], + "name" : "size" + } + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 24, 21, 24, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 24, 21, 24, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 24, 21, 24, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 24, 26, 24, 29 ], + "name" : "size" + } + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 24, 33, 24, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 27, 5, 33, 4 ], + "name" : { + "kind" : "Identifier", + "location" : [ 27, 9, 27, 18 ], + "name" : "append_all" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 27, 20, 27, 32 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 27, 20, 27, 23 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 27, 25, 27, 32 ], + "className" : "Vector" + } + }, { + "kind" : "TypedVar", + "location" : [ 27, 35, 27, 50 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 27, 35, 27, 43 ], + "name" : "new_items" + }, + "type" : { + "kind" : "ListType", + "location" : [ 27, 46, 27, 50 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 27, 47, 27, 49 ], + "className" : "int" + } + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 27, 56, 27, 61 ], + "className" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 28, 9, 28, 20 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 28, 9, 28, 16 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 28, 9, 28, 12 ], + "name" : "item" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 28, 14, 28, 16 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 28, 20, 28, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 29, 9, 33, 4 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 29, 13, 29, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "item" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 29, 21, 29, 29 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "new_items" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 30, 13, 30, 29 ], + "expr" : { + "kind" : "MethodCallExpr", + "location" : [ 30, 13, 30, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 30, 13, 30, 23 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 30, 13, 30, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 30, 18, 30, 23 ], + "name" : "append" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 30, 25, 30, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "item" + } ] + } + } ] + } ] + }, { + "kind" : "FuncDef", + "location" : [ 33, 5, 41, 34 ], + "name" : { + "kind" : "Identifier", + "location" : [ 33, 9, 33, 17 ], + "name" : "remove_at" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 33, 19, 33, 31 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 33, 19, 33, 22 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 33, 24, 33, 31 ], + "className" : "Vector" + } + }, { + "kind" : "TypedVar", + "location" : [ 33, 34, 33, 41 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 33, 34, 33, 36 ], + "name" : "idx" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 33, 39, 33, 41 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 33, 47, 33, 52 ], + "className" : "object" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 34, 9, 37, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 34, 12, 34, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 34, 12, 34, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "idx" + }, + "operator" : "<", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 34, 18, 34, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 35, 13, 35, 18 ], + "value" : null + } ], + "elseBody" : [ ] + }, { + "kind" : "WhileStmt", + "location" : [ 37, 9, 41, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 37, 15, 37, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 37, 15, 37, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "idx" + }, + "operator" : "<", + "right" : { + "kind" : "BinaryExpr", + "location" : [ 37, 21, 37, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 37, 21, 37, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 37, 21, 37, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 37, 26, 37, 29 ], + "name" : "size" + } + }, + "operator" : "-", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 37, 33, 37, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + }, + "body" : [ { + "kind" : "AssignStmt", + "location" : [ 38, 13, 38, 49 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 38, 13, 38, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "MemberExpr", + "location" : [ 38, 13, 38, 22 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 38, 13, 38, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 38, 18, 38, 22 ], + "name" : "items" + } + }, + "index" : { + "kind" : "Identifier", + "location" : [ 38, 24, 38, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "idx" + } + } ], + "value" : { + "kind" : "IndexExpr", + "location" : [ 38, 31, 38, 49 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "MemberExpr", + "location" : [ 38, 31, 38, 40 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 38, 31, 38, 34 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 38, 36, 38, 40 ], + "name" : "items" + } + }, + "index" : { + "kind" : "BinaryExpr", + "location" : [ 38, 42, 38, 48 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 38, 42, 38, 44 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "idx" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 38, 48, 38, 48 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } + }, { + "kind" : "AssignStmt", + "location" : [ 39, 13, 39, 25 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 39, 13, 39, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "idx" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 39, 19, 39, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 39, 19, 39, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "idx" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 39, 25, 39, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + }, { + "kind" : "AssignStmt", + "location" : [ 41, 9, 41, 33 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 41, 9, 41, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 41, 9, 41, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 41, 14, 41, 17 ], + "name" : "size" + } + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 41, 21, 41, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 41, 21, 41, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 41, 21, 41, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 41, 26, 41, 29 ], + "name" : "size" + } + }, + "operator" : "-", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 41, 33, 41, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 44, 5, 45, 31 ], + "name" : { + "kind" : "Identifier", + "location" : [ 44, 9, 44, 11 ], + "name" : "get" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 44, 13, 44, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 44, 13, 44, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 44, 18, 44, 25 ], + "className" : "Vector" + } + }, { + "kind" : "TypedVar", + "location" : [ 44, 28, 44, 35 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 44, 28, 44, 30 ], + "name" : "idx" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 44, 33, 44, 35 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 44, 41, 44, 43 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 45, 9, 45, 30 ], + "value" : { + "kind" : "IndexExpr", + "location" : [ 45, 16, 45, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "MemberExpr", + "location" : [ 45, 16, 45, 25 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 45, 16, 45, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 45, 21, 45, 25 ], + "name" : "items" + } + }, + "index" : { + "kind" : "Identifier", + "location" : [ 45, 27, 45, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "idx" + } + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 48, 5, 49, 25 ], + "name" : { + "kind" : "Identifier", + "location" : [ 48, 9, 48, 14 ], + "name" : "length" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 48, 16, 48, 28 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 48, 16, 48, 19 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 48, 21, 48, 28 ], + "className" : "Vector" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 48, 34, 48, 36 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 49, 9, 49, 24 ], + "value" : { + "kind" : "MemberExpr", + "location" : [ 49, 16, 49, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 49, 16, 49, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 49, 21, 49, 24 ], + "name" : "size" + } + } + } ] + } ] + }, { + "kind" : "ClassDef", + "location" : [ 52, 1, 66, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 52, 7, 52, 20 ], + "name" : "DoublingVector" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 52, 22, 52, 27 ], + "name" : "Vector" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 53, 5, 53, 29 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 53, 5, 53, 22 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 53, 5, 53, 18 ], + "name" : "doubling_limit" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 53, 20, 53, 22 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 53, 26, 53, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1000 + } + }, { + "kind" : "FuncDef", + "location" : [ 56, 5, 63, 31 ], + "name" : { + "kind" : "Identifier", + "location" : [ 56, 9, 56, 25 ], + "name" : "increase_capacity" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 56, 27, 56, 47 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 56, 27, 56, 30 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 56, 32, 56, 47 ], + "className" : "DoublingVector" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 56, 53, 56, 55 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 57, 9, 63, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 57, 13, 57, 55 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "MethodCallExpr", + "location" : [ 57, 13, 57, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 57, 13, 57, 25 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 57, 13, 57, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 57, 18, 57, 25 ], + "name" : "capacity" + } + }, + "args" : [ ] + }, + "operator" : "<=", + "right" : { + "kind" : "BinaryExpr", + "location" : [ 57, 32, 57, 55 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 57, 32, 57, 50 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 57, 32, 57, 35 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 57, 37, 57, 50 ], + "name" : "doubling_limit" + } + }, + "operator" : "//", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 57, 55, 57, 55 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 58, 13, 58, 48 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 58, 13, 58, 22 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 58, 13, 58, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 58, 18, 58, 22 ], + "name" : "items" + } + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 58, 26, 58, 48 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 58, 26, 58, 35 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 58, 26, 58, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 58, 31, 58, 35 ], + "name" : "items" + } + }, + "operator" : "+", + "right" : { + "kind" : "MemberExpr", + "location" : [ 58, 39, 58, 48 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 58, 39, 58, 42 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 58, 44, 58, 48 ], + "name" : "items" + } + } + } + } ], + "elseBody" : [ { + "kind" : "AssignStmt", + "location" : [ 62, 13, 62, 41 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 62, 13, 62, 22 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 62, 13, 62, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 62, 18, 62, 22 ], + "name" : "items" + } + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 62, 26, 62, 41 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 62, 26, 62, 35 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 62, 26, 62, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 62, 31, 62, 35 ], + "name" : "items" + } + }, + "operator" : "+", + "right" : { + "kind" : "ListExpr", + "location" : [ 62, 39, 62, 41 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 62, 40, 62, 40 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } ] + } + } + } ] + }, { + "kind" : "ReturnStmt", + "location" : [ 63, 9, 63, 30 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 63, 16, 63, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 63, 16, 63, 28 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 63, 16, 63, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 63, 21, 63, 28 ], + "name" : "capacity" + } + }, + "args" : [ ] + } + } ] + } ] + }, { + "kind" : "FuncDef", + "location" : [ 66, 1, 74, 13 ], + "name" : { + "kind" : "Identifier", + "location" : [ 66, 5, 66, 10 ], + "name" : "vrange" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 66, 12, 66, 16 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 66, 12, 66, 12 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 66, 14, 66, 16 ], + "className" : "int" + } + }, { + "kind" : "TypedVar", + "location" : [ 66, 19, 66, 23 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 66, 19, 66, 19 ], + "name" : "j" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 66, 21, 66, 23 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 66, 29, 66, 34 ], + "className" : "Vector" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 67, 5, 67, 19 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 67, 5, 67, 12 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 67, 5, 67, 5 ], + "name" : "v" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 67, 7, 67, 12 ], + "className" : "Vector" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 67, 16, 67, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 68, 5, 68, 24 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 68, 5, 68, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 68, 9, 68, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "DoublingVector" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 68, 9, 68, 22 ], + "name" : "DoublingVector" + }, + "args" : [ ] + } + }, { + "kind" : "WhileStmt", + "location" : [ 70, 5, 74, 4 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 70, 11, 70, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 70, 11, 70, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<", + "right" : { + "kind" : "Identifier", + "location" : [ 70, 15, 70, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "j" + } + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 71, 9, 71, 19 ], + "expr" : { + "kind" : "MethodCallExpr", + "location" : [ 71, 9, 71, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 71, 9, 71, 16 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 71, 9, 71, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 71, 11, 71, 16 ], + "name" : "append" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 71, 18, 71, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 72, 9, 72, 17 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 72, 9, 72, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 72, 13, 72, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 72, 13, 72, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 72, 17, 72, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + }, { + "kind" : "ReturnStmt", + "location" : [ 74, 5, 74, 12 ], + "value" : { + "kind" : "Identifier", + "location" : [ 74, 12, 74, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 77, 1, 93, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 77, 5, 77, 9 ], + "name" : "sieve" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 77, 11, 77, 18 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 77, 11, 77, 11 ], + "name" : "v" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 77, 13, 77, 18 ], + "className" : "Vector" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 77, 24, 77, 29 ], + "className" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 78, 5, 78, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 78, 5, 78, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 78, 5, 78, 5 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 78, 7, 78, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 78, 13, 78, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 79, 5, 79, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 79, 5, 79, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 79, 5, 79, 5 ], + "name" : "j" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 79, 7, 79, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 79, 13, 79, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 80, 5, 80, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 80, 5, 80, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 80, 5, 80, 5 ], + "name" : "k" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 80, 7, 80, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 80, 13, 80, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "WhileStmt", + "location" : [ 82, 5, 93, 0 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 82, 11, 82, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 82, 11, 82, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<", + "right" : { + "kind" : "MethodCallExpr", + "location" : [ 82, 15, 82, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 82, 15, 82, 22 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 82, 15, 82, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 82, 17, 82, 22 ], + "name" : "length" + } + }, + "args" : [ ] + } + }, + "body" : [ { + "kind" : "AssignStmt", + "location" : [ 83, 9, 83, 20 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 83, 9, 83, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "k" + } ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 83, 13, 83, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 83, 13, 83, 17 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 83, 13, 83, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 83, 15, 83, 17 ], + "name" : "get" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 83, 19, 83, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 84, 9, 84, 17 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 84, 9, 84, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "j" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 84, 13, 84, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 84, 13, 84, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 84, 17, 84, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + }, { + "kind" : "WhileStmt", + "location" : [ 85, 9, 90, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 85, 15, 85, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 85, 15, 85, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "j" + }, + "operator" : "<", + "right" : { + "kind" : "MethodCallExpr", + "location" : [ 85, 19, 85, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 85, 19, 85, 26 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 85, 19, 85, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 85, 21, 85, 26 ], + "name" : "length" + } + }, + "args" : [ ] + } + }, + "body" : [ { + "kind" : "IfStmt", + "location" : [ 86, 13, 90, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 86, 16, 86, 32 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 86, 16, 86, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "MethodCallExpr", + "location" : [ 86, 16, 86, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 86, 16, 86, 20 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 86, 16, 86, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 86, 18, 86, 20 ], + "name" : "get" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 86, 22, 86, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "j" + } ] + }, + "operator" : "%", + "right" : { + "kind" : "Identifier", + "location" : [ 86, 27, 86, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "k" + } + }, + "operator" : "==", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 86, 32, 86, 32 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, + "thenBody" : [ { + "kind" : "ExprStmt", + "location" : [ 87, 17, 87, 30 ], + "expr" : { + "kind" : "MethodCallExpr", + "location" : [ 87, 17, 87, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 87, 17, 87, 27 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 87, 17, 87, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 87, 19, 87, 27 ], + "name" : "remove_at" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 87, 29, 87, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "j" + } ] + } + } ], + "elseBody" : [ { + "kind" : "AssignStmt", + "location" : [ 89, 17, 89, 25 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 89, 17, 89, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "j" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 89, 21, 89, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 89, 21, 89, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "j" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 89, 25, 89, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } ] + }, { + "kind" : "AssignStmt", + "location" : [ 90, 9, 90, 17 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 90, 9, 90, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 90, 13, 90, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 90, 13, 90, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 90, 17, 90, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } ] + }, { + "kind" : "VarDef", + "location" : [ 93, 1, 93, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 93, 1, 93, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 93, 1, 93, 1 ], + "name" : "n" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 93, 3, 93, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 93, 9, 93, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 50 + } + }, { + "kind" : "VarDef", + "location" : [ 96, 1, 96, 15 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 96, 1, 96, 8 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 96, 1, 96, 1 ], + "name" : "v" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 96, 3, 96, 8 ], + "className" : "Vector" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 96, 12, 96, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 97, 1, 97, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 97, 1, 97, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 97, 1, 97, 1 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 97, 3, 97, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 97, 9, 97, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 100, 1, 100, 16 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 100, 1, 100, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 100, 5, 100, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 100, 5, 100, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "Vector" + } + }, + "name" : "vrange" + }, + "args" : [ { + "kind" : "IntegerLiteral", + "location" : [ 100, 12, 100, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "Identifier", + "location" : [ 100, 15, 100, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "n" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 101, 1, 101, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 101, 1, 101, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 101, 1, 101, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "name" : "sieve" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 101, 7, 101, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + } ] + } + }, { + "kind" : "WhileStmt", + "location" : [ 104, 1, 108, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 104, 7, 104, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 104, 7, 104, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<", + "right" : { + "kind" : "MethodCallExpr", + "location" : [ 104, 11, 104, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 104, 11, 104, 18 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 104, 11, 104, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 104, 13, 104, 18 ], + "name" : "length" + } + }, + "args" : [ ] + } + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 105, 5, 105, 19 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 105, 5, 105, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 105, 5, 105, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MethodCallExpr", + "location" : [ 105, 11, 105, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 105, 11, 105, 15 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Vector" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 105, 11, 105, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Vector" + }, + "name" : "v" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 105, 13, 105, 15 ], + "name" : "get" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 105, 17, 105, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ] + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 106, 5, 106, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 106, 5, 106, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 106, 9, 106, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 106, 9, 106, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 106, 13, 106, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/benchmarks/sieve.py.ast.typed.s.result b/src/test/data/pa3/benchmarks/sieve.py.ast.typed.s.result new file mode 100644 index 0000000..6beaeaa --- /dev/null +++ b/src/test/data/pa3/benchmarks/sieve.py.ast.typed.s.result @@ -0,0 +1,15 @@ +2 +3 +5 +7 +11 +13 +17 +19 +23 +29 +31 +37 +41 +43 +47 diff --git a/src/test/data/pa3/benchmarks/stdlib.py b/src/test/data/pa3/benchmarks/stdlib.py new file mode 100644 index 0000000..e7323bd --- /dev/null +++ b/src/test/data/pa3/benchmarks/stdlib.py @@ -0,0 +1,77 @@ +# ChocoPy library functions +def int_to_str(x: int) -> str: + digits:[str] = None + result:str = "" + + # Set-up digit mapping + digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] + + # Write sign if necessary + if x < 0: + result = "-" + x = -x + + # Write digits using a recursive call + if x >= 10: + result = result + int_to_str(x // 10) + result = result + digits[x % 10] + return result + +def str_to_int(x: str) -> int: + result:int = 0 + digit:int = 0 + char:str = "" + sign:int = 1 + first_char:bool = True + + # Parse digits + for char in x: + if char == "-": + if not first_char: + return 0 # Error + sign = -1 + elif char == "0": + digit = 0 + elif char == "1": + digit = 1 + elif char == "2": + digit = 2 + elif char == "3": + digit = 3 + elif char == "3": + digit = 3 + elif char == "4": + digit = 4 + elif char == "5": + digit = 5 + elif char == "6": + digit = 6 + elif char == "7": + digit = 7 + elif char == "8": + digit = 8 + elif char == "9": + digit = 9 + else: + return 0 # On error + first_char = False + result = result * 10 + digit + + # Compute result + return result * sign + +# Input parameters +c:int = 42 +n:int = 10 + +# Run [-nc, nc] with step size c +s:str = "" +i:int = 0 +i = -n * c + +# Crunch +while i <= n * c: + s = int_to_str(i) + print(s) + i = str_to_int(s) + c + diff --git a/src/test/data/pa3/benchmarks/stdlib.py.ast.typed b/src/test/data/pa3/benchmarks/stdlib.py.ast.typed new file mode 100644 index 0000000..72079ff --- /dev/null +++ b/src/test/data/pa3/benchmarks/stdlib.py.ast.typed @@ -0,0 +1,1813 @@ +{ + "kind" : "Program", + "location" : [ 2, 1, 78, 1 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 2, 1, 18, 18 ], + "name" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 14 ], + "name" : "int_to_str" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 2, 16, 2, 21 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 16, 2, 16 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 19, 2, 21 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 2, 27, 2, 29 ], + "className" : "str" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 3, 5, 3, 23 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 5, 3, 16 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 10 ], + "name" : "digits" + }, + "type" : { + "kind" : "ListType", + "location" : [ 3, 12, 3, 16 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 3, 13, 3, 15 ], + "className" : "str" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 3, 20, 3, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 4, 5, 4, 19 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 5, 4, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 10 ], + "name" : "result" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 12, 4, 14 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 4, 18, 4, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 5, 7, 63 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 10 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "digits" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 7, 14, 7, 63 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "elements" : [ { + "kind" : "StringLiteral", + "location" : [ 7, 15, 7, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "0" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 20, 7, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "1" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 25, 7, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "2" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 30, 7, 32 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "3" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 35, 7, 37 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "4" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 40, 7, 42 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "5" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 45, 7, 47 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "6" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 50, 7, 52 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "7" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 55, 7, 57 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "8" + }, { + "kind" : "StringLiteral", + "location" : [ 7, 60, 7, 62 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "9" + } ] + } + }, { + "kind" : "IfStmt", + "location" : [ 10, 5, 15, 4 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 10, 8, 10, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 10, 8, 10, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "<", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 10, 12, 10, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 11, 9, 11, 20 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "result" + } ], + "value" : { + "kind" : "StringLiteral", + "location" : [ 11, 18, 11, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "-" + } + }, { + "kind" : "AssignStmt", + "location" : [ 12, 9, 12, 14 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 12, 9, 12, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ], + "value" : { + "kind" : "UnaryExpr", + "location" : [ 12, 13, 12, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "operator" : "-", + "operand" : { + "kind" : "Identifier", + "location" : [ 12, 14, 12, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } + } ], + "elseBody" : [ ] + }, { + "kind" : "IfStmt", + "location" : [ 15, 5, 17, 4 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 15, 8, 15, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 15, 8, 15, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : ">=", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 15, 13, 15, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 10 + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 16, 9, 16, 45 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 16, 9, 16, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "result" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 16, 18, 16, 45 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 16, 18, 16, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "result" + }, + "operator" : "+", + "right" : { + "kind" : "CallExpr", + "location" : [ 16, 27, 16, 45 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 27, 16, 36 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "int_to_str" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 16, 38, 16, 44 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 16, 38, 16, 38 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "//", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 16, 43, 16, 44 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 10 + } + } ] + } + } + } ], + "elseBody" : [ ] + }, { + "kind" : "AssignStmt", + "location" : [ 17, 5, 17, 36 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 17, 5, 17, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "result" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 17, 14, 17, 36 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 17, 14, 17, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "result" + }, + "operator" : "+", + "right" : { + "kind" : "IndexExpr", + "location" : [ 17, 23, 17, 36 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 17, 23, 17, 28 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "digits" + }, + "index" : { + "kind" : "BinaryExpr", + "location" : [ 17, 30, 17, 35 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 17, 30, 17, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "%", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 17, 34, 17, 35 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 10 + } + } + } + } + }, { + "kind" : "ReturnStmt", + "location" : [ 18, 5, 18, 17 ], + "value" : { + "kind" : "Identifier", + "location" : [ 18, 12, 18, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "result" + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 20, 1, 61, 25 ], + "name" : { + "kind" : "Identifier", + "location" : [ 20, 5, 20, 14 ], + "name" : "str_to_int" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 20, 16, 20, 21 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 20, 16, 20, 16 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 20, 19, 20, 21 ], + "className" : "str" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 20, 27, 20, 29 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 21, 5, 21, 18 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 21, 5, 21, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 21, 5, 21, 10 ], + "name" : "result" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 21, 12, 21, 14 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 21, 18, 21, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 22, 5, 22, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 22, 5, 22, 13 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 22, 5, 22, 9 ], + "name" : "digit" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 22, 11, 22, 13 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 22, 17, 22, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 23, 5, 23, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 23, 5, 23, 12 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 23, 5, 23, 8 ], + "name" : "char" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 23, 10, 23, 12 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 23, 16, 23, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 24, 5, 24, 16 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 24, 5, 24, 12 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 24, 5, 24, 8 ], + "name" : "sign" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 24, 10, 24, 12 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 24, 16, 24, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + }, { + "kind" : "VarDef", + "location" : [ 25, 5, 25, 26 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 25, 5, 25, 19 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 25, 5, 25, 14 ], + "name" : "first_char" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 25, 16, 25, 19 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 25, 23, 25, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 28, 5, 61, 4 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 28, 9, 28, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 28, 17, 28, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "body" : [ { + "kind" : "IfStmt", + "location" : [ 29, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 29, 12, 29, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 29, 12, 29, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 29, 20, 29, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "-" + } + }, + "thenBody" : [ { + "kind" : "IfStmt", + "location" : [ 30, 13, 32, 12 ], + "condition" : { + "kind" : "UnaryExpr", + "location" : [ 30, 16, 30, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "operator" : "not", + "operand" : { + "kind" : "Identifier", + "location" : [ 30, 20, 30, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "name" : "first_char" + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 31, 17, 31, 24 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 31, 24, 31, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "elseBody" : [ ] + }, { + "kind" : "AssignStmt", + "location" : [ 32, 13, 32, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 32, 13, 32, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "sign" + } ], + "value" : { + "kind" : "UnaryExpr", + "location" : [ 32, 20, 32, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "operator" : "-", + "operand" : { + "kind" : "IntegerLiteral", + "location" : [ 32, 21, 32, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 33, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 33, 14, 33, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 33, 14, 33, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 33, 22, 33, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "0" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 34, 13, 34, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 34, 13, 34, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 34, 21, 34, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 35, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 35, 14, 35, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 35, 14, 35, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 35, 22, 35, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "1" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 36, 13, 36, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 36, 13, 36, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 36, 21, 36, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 37, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 37, 14, 37, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 37, 14, 37, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 37, 22, 37, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "2" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 38, 13, 38, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 38, 13, 38, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 38, 21, 38, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 39, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 39, 14, 39, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 39, 14, 39, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 39, 22, 39, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "3" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 40, 13, 40, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 40, 13, 40, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 40, 21, 40, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 41, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 41, 14, 41, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 41, 14, 41, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 41, 22, 41, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "3" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 42, 13, 42, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 42, 13, 42, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 42, 21, 42, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 43, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 43, 14, 43, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 43, 14, 43, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 43, 22, 43, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "4" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 44, 13, 44, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 44, 13, 44, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 44, 21, 44, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 45, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 45, 14, 45, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 45, 14, 45, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 45, 22, 45, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "5" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 46, 13, 46, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 46, 13, 46, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 46, 21, 46, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 5 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 47, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 47, 14, 47, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 47, 14, 47, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 47, 22, 47, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "6" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 48, 13, 48, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 48, 13, 48, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 48, 21, 48, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 6 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 49, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 49, 14, 49, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 49, 14, 49, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 49, 22, 49, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "7" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 50, 13, 50, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 50, 13, 50, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 50, 21, 50, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 7 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 51, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 51, 14, 51, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 51, 14, 51, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 51, 22, 51, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "8" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 52, 13, 52, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 52, 13, 52, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 52, 21, 52, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 8 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 53, 9, 57, 8 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 53, 14, 53, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 53, 14, 53, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "char" + }, + "operator" : "==", + "right" : { + "kind" : "StringLiteral", + "location" : [ 53, 22, 53, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "9" + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 54, 13, 54, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 54, 13, 54, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 54, 21, 54, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 9 + } + } ], + "elseBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 56, 13, 56, 20 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 56, 20, 56, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } ] + } ] + } ] + } ] + } ] + } ] + } ] + } ] + } ] + } ] + } ] + }, { + "kind" : "AssignStmt", + "location" : [ 57, 9, 57, 26 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 57, 9, 57, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "name" : "first_char" + } ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 57, 22, 57, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + }, { + "kind" : "AssignStmt", + "location" : [ 58, 9, 58, 36 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 58, 9, 58, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "result" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 58, 18, 58, 36 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 58, 18, 58, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 58, 18, 58, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "result" + }, + "operator" : "*", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 58, 27, 58, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 10 + } + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 58, 32, 58, 36 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "digit" + } + } + } ] + }, { + "kind" : "ReturnStmt", + "location" : [ 61, 5, 61, 24 ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 61, 12, 61, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 61, 12, 61, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "result" + }, + "operator" : "*", + "right" : { + "kind" : "Identifier", + "location" : [ 61, 21, 61, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "sign" + } + } + } ] + }, { + "kind" : "VarDef", + "location" : [ 64, 1, 64, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 64, 1, 64, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 64, 1, 64, 1 ], + "name" : "c" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 64, 3, 64, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 64, 9, 64, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "VarDef", + "location" : [ 65, 1, 65, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 65, 1, 65, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 65, 1, 65, 1 ], + "name" : "n" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 65, 3, 65, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 65, 9, 65, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 10 + } + }, { + "kind" : "VarDef", + "location" : [ 68, 1, 68, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 68, 1, 68, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 68, 1, 68, 1 ], + "name" : "s" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 68, 3, 68, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 68, 9, 68, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 69, 1, 69, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 69, 1, 69, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 69, 1, 69, 1 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 69, 3, 69, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 69, 9, 69, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 70, 1, 70, 10 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 70, 1, 70, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 70, 5, 70, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "UnaryExpr", + "location" : [ 70, 5, 70, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "operator" : "-", + "operand" : { + "kind" : "Identifier", + "location" : [ 70, 6, 70, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "n" + } + }, + "operator" : "*", + "right" : { + "kind" : "Identifier", + "location" : [ 70, 10, 70, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "c" + } + } + }, { + "kind" : "WhileStmt", + "location" : [ 73, 1, 78, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 73, 7, 73, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 73, 7, 73, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<=", + "right" : { + "kind" : "BinaryExpr", + "location" : [ 73, 12, 73, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 73, 12, 73, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "n" + }, + "operator" : "*", + "right" : { + "kind" : "Identifier", + "location" : [ 73, 16, 73, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "c" + } + } + }, + "body" : [ { + "kind" : "AssignStmt", + "location" : [ 74, 5, 74, 21 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 74, 5, 74, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "s" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 74, 9, 74, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 74, 9, 74, 18 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "int_to_str" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 74, 20, 74, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 75, 5, 75, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 75, 5, 75, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 75, 5, 75, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 75, 11, 75, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "s" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 76, 5, 76, 25 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 76, 5, 76, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 76, 9, 76, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "CallExpr", + "location" : [ 76, 9, 76, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 76, 9, 76, 18 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "str_to_int" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 76, 20, 76, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "s" + } ] + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 76, 25, 76, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "c" + } + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/benchmarks/stdlib.py.ast.typed.s.result b/src/test/data/pa3/benchmarks/stdlib.py.ast.typed.s.result new file mode 100644 index 0000000..3a07fa4 --- /dev/null +++ b/src/test/data/pa3/benchmarks/stdlib.py.ast.typed.s.result @@ -0,0 +1,21 @@ +-420 +-378 +-336 +-294 +-252 +-210 +-168 +-126 +-84 +-42 +0 +42 +84 +126 +168 +210 +252 +294 +336 +378 +420 diff --git a/src/test/data/pa3/benchmarks/tree.py b/src/test/data/pa3/benchmarks/tree.py new file mode 100644 index 0000000..9f337fd --- /dev/null +++ b/src/test/data/pa3/benchmarks/tree.py @@ -0,0 +1,83 @@ +# Binary-search trees +class TreeNode(object): + value:int = 0 + left:"TreeNode" = None + right:"TreeNode" = None + + def insert(self:"TreeNode", x:int) -> bool: + if x < self.value: + if self.left is None: + self.left = makeNode(x) + return True + else: + return self.left.insert(x) + elif x > self.value: + if self.right is None: + self.right = makeNode(x) + return True + else: + return self.right.insert(x) + return False + + def contains(self:"TreeNode", x:int) -> bool: + if x < self.value: + if self.left is None: + return False + else: + return self.left.contains(x) + elif x > self.value: + if self.right is None: + return False + else: + return self.right.contains(x) + else: + return True + +class Tree(object): + root:TreeNode = None + size:int = 0 + + def insert(self:"Tree", x:int) -> object: + if self.root is None: + self.root = makeNode(x) + self.size = 1 + else: + if self.root.insert(x): + self.size = self.size + 1 + + def contains(self:"Tree", x:int) -> bool: + if self.root is None: + return False + else: + return self.root.contains(x) + +def makeNode(x: int) -> TreeNode: + b:TreeNode = None + b = TreeNode() + b.value = x + return b + + +# Input parameters +n:int = 100 +c:int = 4 + +# Data +t:Tree = None +i:int = 0 +k:int = 37813 + +# Crunch +t = Tree() +while i < n: + t.insert(k) + k = (k * 37813) % 37831 + if i % c != 0: + t.insert(i) + i = i + 1 + +print(t.size) + +for i in [4, 8, 15, 16, 23, 42]: + if t.contains(i): + print(i) diff --git a/src/test/data/pa3/benchmarks/tree.py.ast.typed b/src/test/data/pa3/benchmarks/tree.py.ast.typed new file mode 100644 index 0000000..a8d3cb3 --- /dev/null +++ b/src/test/data/pa3/benchmarks/tree.py.ast.typed @@ -0,0 +1,2301 @@ +{ + "kind" : "Program", + "location" : [ 2, 1, 84, 2 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 2, 1, 36, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 2, 7, 2, 14 ], + "name" : "TreeNode" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 2, 16, 2, 21 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 3, 2, 3, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 2, 3, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 2, 3, 6 ], + "name" : "value" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 8, 3, 10 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 14, 3, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 4, 2, 4, 23 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 2, 4, 16 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 2, 4, 5 ], + "name" : "left" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 7, 4, 16 ], + "className" : "TreeNode" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 4, 20, 4, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 5, 2, 5, 24 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 2, 5, 17 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 2, 5, 6 ], + "name" : "right" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 8, 5, 17 ], + "className" : "TreeNode" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 5, 21, 5, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "FuncDef", + "location" : [ 7, 2, 20, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 6, 7, 11 ], + "name" : "insert" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 7, 13, 7, 27 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 13, 7, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 18, 7, 27 ], + "className" : "TreeNode" + } + }, { + "kind" : "TypedVar", + "location" : [ 7, 30, 7, 34 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 30, 7, 30 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 32, 7, 34 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 7, 40, 7, 43 ], + "className" : "bool" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 8, 3, 20, 2 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 8, 6, 8, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 8, 6, 8, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "<", + "right" : { + "kind" : "MemberExpr", + "location" : [ 8, 10, 8, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 8, 10, 8, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 8, 15, 8, 19 ], + "name" : "value" + } + } + }, + "thenBody" : [ { + "kind" : "IfStmt", + "location" : [ 9, 4, 14, 2 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 9, 7, 9, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 9, 7, 9, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 9, 7, 9, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 9, 12, 9, 15 ], + "name" : "left" + } + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 9, 20, 9, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 10, 5, 10, 27 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 10, 5, 10, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 10, 5, 10, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 10, 10, 10, 13 ], + "name" : "left" + } + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 10, 17, 10, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 10, 17, 10, 24 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + } + }, + "name" : "makeNode" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 10, 26, 10, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 11, 5, 11, 15 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 11, 12, 11, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ], + "elseBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 13, 5, 13, 30 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 13, 12, 13, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 13, 12, 13, 27 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "object" : { + "kind" : "MemberExpr", + "location" : [ 13, 12, 13, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 13, 12, 13, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 13, 17, 13, 20 ], + "name" : "left" + } + }, + "member" : { + "kind" : "Identifier", + "location" : [ 13, 22, 13, 27 ], + "name" : "insert" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 13, 29, 13, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 14, 3, 20, 2 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 14, 8, 14, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 14, 8, 14, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : ">", + "right" : { + "kind" : "MemberExpr", + "location" : [ 14, 12, 14, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 12, 14, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 17, 14, 21 ], + "name" : "value" + } + } + }, + "thenBody" : [ { + "kind" : "IfStmt", + "location" : [ 15, 4, 20, 2 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 15, 7, 15, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 15, 7, 15, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 7, 15, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 12, 15, 16 ], + "name" : "right" + } + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 15, 21, 15, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 16, 5, 16, 28 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 16, 5, 16, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 16, 5, 16, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 16, 10, 16, 14 ], + "name" : "right" + } + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 16, 18, 16, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 18, 16, 25 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + } + }, + "name" : "makeNode" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 16, 27, 16, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 17, 5, 17, 15 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 17, 12, 17, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ], + "elseBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 19, 5, 19, 31 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 19, 12, 19, 31 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 19, 12, 19, 28 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "object" : { + "kind" : "MemberExpr", + "location" : [ 19, 12, 19, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 19, 12, 19, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 19, 17, 19, 21 ], + "name" : "right" + } + }, + "member" : { + "kind" : "Identifier", + "location" : [ 19, 23, 19, 28 ], + "name" : "insert" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 19, 30, 19, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "elseBody" : [ ] + } ] + }, { + "kind" : "ReturnStmt", + "location" : [ 20, 3, 20, 14 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 20, 10, 20, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 22, 2, 36, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 22, 6, 22, 13 ], + "name" : "contains" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 22, 15, 22, 29 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 22, 15, 22, 18 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 22, 20, 22, 29 ], + "className" : "TreeNode" + } + }, { + "kind" : "TypedVar", + "location" : [ 22, 32, 22, 36 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 22, 32, 22, 32 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 22, 34, 22, 36 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 22, 42, 22, 45 ], + "className" : "bool" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 23, 3, 36, 0 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 23, 6, 23, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 23, 6, 23, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "<", + "right" : { + "kind" : "MemberExpr", + "location" : [ 23, 10, 23, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 23, 10, 23, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 23, 15, 23, 19 ], + "name" : "value" + } + } + }, + "thenBody" : [ { + "kind" : "IfStmt", + "location" : [ 24, 4, 28, 2 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 24, 7, 24, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 24, 7, 24, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 24, 7, 24, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 24, 12, 24, 15 ], + "name" : "left" + } + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 24, 20, 24, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 25, 5, 25, 16 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 25, 12, 25, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ], + "elseBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 27, 5, 27, 32 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 27, 12, 27, 32 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 27, 12, 27, 29 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "object" : { + "kind" : "MemberExpr", + "location" : [ 27, 12, 27, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 27, 12, 27, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 27, 17, 27, 20 ], + "name" : "left" + } + }, + "member" : { + "kind" : "Identifier", + "location" : [ 27, 22, 27, 29 ], + "name" : "contains" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 27, 31, 27, 31 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 28, 3, 36, 0 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 28, 8, 28, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 28, 8, 28, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : ">", + "right" : { + "kind" : "MemberExpr", + "location" : [ 28, 12, 28, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 28, 12, 28, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 28, 17, 28, 21 ], + "name" : "value" + } + } + }, + "thenBody" : [ { + "kind" : "IfStmt", + "location" : [ 29, 4, 33, 2 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 29, 7, 29, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 29, 7, 29, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 29, 7, 29, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 29, 12, 29, 16 ], + "name" : "right" + } + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 29, 21, 29, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 30, 5, 30, 16 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 30, 12, 30, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ], + "elseBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 32, 5, 32, 33 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 32, 12, 32, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 32, 12, 32, 30 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "object" : { + "kind" : "MemberExpr", + "location" : [ 32, 12, 32, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 32, 12, 32, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 32, 17, 32, 21 ], + "name" : "right" + } + }, + "member" : { + "kind" : "Identifier", + "location" : [ 32, 23, 32, 30 ], + "name" : "contains" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 32, 32, 32, 32 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "elseBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 34, 4, 34, 14 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 34, 11, 34, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ] + } ] + } ] + } ] + }, { + "kind" : "ClassDef", + "location" : [ 36, 1, 54, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 36, 7, 36, 10 ], + "name" : "Tree" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 36, 12, 36, 17 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 37, 2, 37, 21 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 37, 2, 37, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 37, 2, 37, 5 ], + "name" : "root" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 37, 7, 37, 14 ], + "className" : "TreeNode" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 37, 18, 37, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 38, 2, 38, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 38, 2, 38, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 38, 2, 38, 5 ], + "name" : "size" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 38, 7, 38, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 38, 13, 38, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "FuncDef", + "location" : [ 40, 2, 48, 1 ], + "name" : { + "kind" : "Identifier", + "location" : [ 40, 6, 40, 11 ], + "name" : "insert" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 40, 13, 40, 23 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 40, 13, 40, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 40, 18, 40, 23 ], + "className" : "Tree" + } + }, { + "kind" : "TypedVar", + "location" : [ 40, 26, 40, 30 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 40, 26, 40, 26 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 40, 28, 40, 30 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 40, 36, 40, 41 ], + "className" : "object" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 41, 3, 48, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 41, 6, 41, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 41, 6, 41, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 41, 6, 41, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 41, 11, 41, 14 ], + "name" : "root" + } + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 41, 19, 41, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 42, 4, 42, 26 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 42, 4, 42, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 42, 4, 42, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 42, 9, 42, 12 ], + "name" : "root" + } + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 42, 16, 42, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 42, 16, 42, 23 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + } + }, + "name" : "makeNode" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 42, 25, 42, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 43, 4, 43, 16 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 43, 4, 43, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 43, 4, 43, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 43, 9, 43, 12 ], + "name" : "size" + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 43, 16, 43, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 45, 4, 48, 1 ], + "condition" : { + "kind" : "MethodCallExpr", + "location" : [ 45, 7, 45, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 45, 7, 45, 22 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "object" : { + "kind" : "MemberExpr", + "location" : [ 45, 7, 45, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 45, 7, 45, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 45, 12, 45, 15 ], + "name" : "root" + } + }, + "member" : { + "kind" : "Identifier", + "location" : [ 45, 17, 45, 22 ], + "name" : "insert" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 45, 24, 45, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + }, + "thenBody" : [ { + "kind" : "AssignStmt", + "location" : [ 46, 5, 46, 29 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 46, 5, 46, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 46, 5, 46, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 46, 10, 46, 13 ], + "name" : "size" + } + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 46, 17, 46, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 46, 17, 46, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 46, 17, 46, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 46, 22, 46, 25 ], + "name" : "size" + } + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 46, 29, 46, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ], + "elseBody" : [ ] + } ] + } ] + }, { + "kind" : "FuncDef", + "location" : [ 48, 2, 54, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 48, 6, 48, 13 ], + "name" : "contains" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 48, 15, 48, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 48, 15, 48, 18 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 48, 20, 48, 25 ], + "className" : "Tree" + } + }, { + "kind" : "TypedVar", + "location" : [ 48, 28, 48, 32 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 48, 28, 48, 28 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 48, 30, 48, 32 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 48, 38, 48, 41 ], + "className" : "bool" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 49, 3, 54, 0 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 49, 6, 49, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "MemberExpr", + "location" : [ 49, 6, 49, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 49, 6, 49, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 49, 11, 49, 14 ], + "name" : "root" + } + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 49, 19, 49, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 50, 4, 50, 15 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 50, 11, 50, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ], + "elseBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 52, 4, 52, 31 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 52, 11, 52, 31 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 52, 11, 52, 28 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "object" : { + "kind" : "MemberExpr", + "location" : [ 52, 11, 52, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 52, 11, 52, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 52, 16, 52, 19 ], + "name" : "root" + } + }, + "member" : { + "kind" : "Identifier", + "location" : [ 52, 21, 52, 28 ], + "name" : "contains" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 52, 30, 52, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ] + } ] + }, { + "kind" : "FuncDef", + "location" : [ 54, 1, 58, 10 ], + "name" : { + "kind" : "Identifier", + "location" : [ 54, 5, 54, 12 ], + "name" : "makeNode" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 54, 14, 54, 19 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 54, 14, 54, 14 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 54, 17, 54, 19 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 54, 25, 54, 32 ], + "className" : "TreeNode" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 55, 2, 55, 18 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 55, 2, 55, 11 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 55, 2, 55, 2 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 55, 4, 55, 11 ], + "className" : "TreeNode" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 55, 15, 55, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 56, 2, 56, 15 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 56, 2, 56, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "b" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 56, 6, 56, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 56, 6, 56, 13 ], + "name" : "TreeNode" + }, + "args" : [ ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 57, 2, 57, 12 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 57, 2, 57, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 57, 2, 57, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 57, 4, 57, 8 ], + "name" : "value" + } + } ], + "value" : { + "kind" : "Identifier", + "location" : [ 57, 12, 57, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + }, { + "kind" : "ReturnStmt", + "location" : [ 58, 2, 58, 9 ], + "value" : { + "kind" : "Identifier", + "location" : [ 58, 9, 58, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "TreeNode" + }, + "name" : "b" + } + } ] + }, { + "kind" : "VarDef", + "location" : [ 62, 1, 62, 11 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 62, 1, 62, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 62, 1, 62, 1 ], + "name" : "n" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 62, 3, 62, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 62, 9, 62, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 100 + } + }, { + "kind" : "VarDef", + "location" : [ 63, 1, 63, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 63, 1, 63, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 63, 1, 63, 1 ], + "name" : "c" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 63, 3, 63, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 63, 9, 63, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + }, { + "kind" : "VarDef", + "location" : [ 66, 1, 66, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 66, 1, 66, 6 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 66, 1, 66, 1 ], + "name" : "t" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 66, 3, 66, 6 ], + "className" : "Tree" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 66, 10, 66, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 67, 1, 67, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 67, 1, 67, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 67, 1, 67, 1 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 67, 3, 67, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 67, 9, 67, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 68, 1, 68, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 68, 1, 68, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 68, 1, 68, 1 ], + "name" : "k" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 68, 3, 68, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 68, 9, 68, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 37813 + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 71, 1, 71, 10 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 71, 1, 71, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "t" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 71, 5, 71, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 71, 5, 71, 8 ], + "name" : "Tree" + }, + "args" : [ ] + } + }, { + "kind" : "WhileStmt", + "location" : [ 72, 1, 79, 0 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 72, 7, 72, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 72, 7, 72, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<", + "right" : { + "kind" : "Identifier", + "location" : [ 72, 11, 72, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "n" + } + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 73, 2, 73, 12 ], + "expr" : { + "kind" : "MethodCallExpr", + "location" : [ 73, 2, 73, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 73, 2, 73, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Tree" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 73, 2, 73, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "t" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 73, 4, 73, 9 ], + "name" : "insert" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 73, 11, 73, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "k" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 74, 2, 74, 24 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 74, 2, 74, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "k" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 74, 6, 74, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 74, 7, 74, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 74, 7, 74, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "k" + }, + "operator" : "*", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 74, 11, 74, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 37813 + } + }, + "operator" : "%", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 74, 20, 74, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 37831 + } + } + }, { + "kind" : "IfStmt", + "location" : [ 75, 2, 77, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 75, 5, 75, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 75, 5, 75, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 75, 5, 75, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "%", + "right" : { + "kind" : "Identifier", + "location" : [ 75, 9, 75, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "c" + } + }, + "operator" : "!=", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 75, 14, 75, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, + "thenBody" : [ { + "kind" : "ExprStmt", + "location" : [ 76, 3, 76, 13 ], + "expr" : { + "kind" : "MethodCallExpr", + "location" : [ 76, 3, 76, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 76, 3, 76, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Tree" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 76, 3, 76, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "t" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 76, 5, 76, 10 ], + "name" : "insert" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 76, 12, 76, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ] + } + } ], + "elseBody" : [ ] + }, { + "kind" : "AssignStmt", + "location" : [ 77, 2, 77, 10 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 77, 2, 77, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 77, 6, 77, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 77, 6, 77, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 77, 10, 77, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + }, { + "kind" : "ExprStmt", + "location" : [ 79, 1, 79, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 79, 1, 79, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 79, 1, 79, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 79, 7, 79, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 79, 7, 79, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "t" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 79, 9, 79, 12 ], + "name" : "size" + } + } ] + } + }, { + "kind" : "ForStmt", + "location" : [ 81, 1, 84, 2 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 81, 5, 81, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "iterable" : { + "kind" : "ListExpr", + "location" : [ 81, 10, 81, 31 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 81, 11, 81, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + }, { + "kind" : "IntegerLiteral", + "location" : [ 81, 14, 81, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 8 + }, { + "kind" : "IntegerLiteral", + "location" : [ 81, 17, 81, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 15 + }, { + "kind" : "IntegerLiteral", + "location" : [ 81, 21, 81, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 16 + }, { + "kind" : "IntegerLiteral", + "location" : [ 81, 25, 81, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 23 + }, { + "kind" : "IntegerLiteral", + "location" : [ 81, 29, 81, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } ] + }, + "body" : [ { + "kind" : "IfStmt", + "location" : [ 82, 2, 84, 1 ], + "condition" : { + "kind" : "MethodCallExpr", + "location" : [ 82, 5, 82, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 82, 5, 82, 14 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "Tree" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 82, 5, 82, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "Tree" + }, + "name" : "t" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 82, 7, 82, 14 ], + "name" : "contains" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 82, 16, 82, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ] + }, + "thenBody" : [ { + "kind" : "ExprStmt", + "location" : [ 83, 3, 83, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 83, 3, 83, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 83, 3, 83, 7 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 83, 9, 83, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ] + } + } ], + "elseBody" : [ ] + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/benchmarks/tree.py.ast.typed.s.result b/src/test/data/pa3/benchmarks/tree.py.ast.typed.s.result new file mode 100644 index 0000000..bc9d65b --- /dev/null +++ b/src/test/data/pa3/benchmarks/tree.py.ast.typed.s.result @@ -0,0 +1,4 @@ +175 +15 +23 +42 diff --git a/src/test/data/pa3/sample/call.py b/src/test/data/pa3/sample/call.py new file mode 100644 index 0000000..6b9ba64 --- /dev/null +++ b/src/test/data/pa3/sample/call.py @@ -0,0 +1,17 @@ +def f() -> int: + print("start f") + g() + print("end f") + return 42 + + +def g() -> object: + print("start g") + h() + print("end g") + +def h() -> object: + print("start h") + print("end h") + +print(f()) diff --git a/src/test/data/pa3/sample/call.py.ast.typed b/src/test/data/pa3/sample/call.py.ast.typed new file mode 100644 index 0000000..dd6d3f1 --- /dev/null +++ b/src/test/data/pa3/sample/call.py.ast.typed @@ -0,0 +1,386 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 17, 11 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 1, 1, 5, 14 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 5, 1, 5 ], + "name" : "f" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 1, 12, 1, 14 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 2, 5, 2, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 5, 2, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 2, 11, 2, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "start f" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 3, 5, 3, 7 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 3, 5, 3, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "name" : "g" + }, + "args" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 5, 4, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 5, 4, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 4, 11, 4, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "end f" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 5, 5, 5, 13 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 12, 5, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 8, 1, 11, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 5 ], + "name" : "g" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 8, 12, 8, 17 ], + "className" : "object" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 9, 5, 9, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 9, 5, 9, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 5, 9, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 9, 11, 9, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "start g" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 10, 5, 10, 7 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 10, 5, 10, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 10, 5, 10, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "name" : "h" + }, + "args" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 11, 5, 11, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 5, 11, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 5, 11, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 11, 11, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "end g" + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 13, 1, 15, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 5 ], + "name" : "h" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 13, 12, 13, 17 ], + "className" : "object" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 14, 5, 14, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 5, 14, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 5, 14, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 14, 11, 14, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "start h" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 15, 5, 15, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 15, 5, 15, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 5, 15, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 15, 11, 15, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "end h" + } ] + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 17, 1, 17, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 17, 1, 17, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 17, 1, 17, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 17, 7, 17, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 17, 7, 17, 7 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "f" + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/call.py.ast.typed.s.result b/src/test/data/pa3/sample/call.py.ast.typed.s.result new file mode 100644 index 0000000..ff1eea8 --- /dev/null +++ b/src/test/data/pa3/sample/call.py.ast.typed.s.result @@ -0,0 +1,7 @@ +start f +start g +start h +end h +end g +end f +42 diff --git a/src/test/data/pa3/sample/call_with_args.py b/src/test/data/pa3/sample/call_with_args.py new file mode 100644 index 0000000..bc9b16a --- /dev/null +++ b/src/test/data/pa3/sample/call_with_args.py @@ -0,0 +1,19 @@ +def f(x:int) -> int: + print("start f") + print(x) + g(1, x) + print("end f") + return x + + +def g(y:int, z:int) -> object: + print("start g") + print(y) + print(z) + h("h") + print("end g") + +def h(msg: str) -> object: + print(msg) + +print(f(4)) diff --git a/src/test/data/pa3/sample/call_with_args.py.ast.typed b/src/test/data/pa3/sample/call_with_args.py.ast.typed new file mode 100644 index 0000000..0ff917c --- /dev/null +++ b/src/test/data/pa3/sample/call_with_args.py.ast.typed @@ -0,0 +1,554 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 19, 12 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 1, 1, 6, 13 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 5, 1, 5 ], + "name" : "f" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 1, 7, 1, 11 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 9, 1, 11 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 1, 17, 1, 19 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 2, 5, 2, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 5, 2, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 2, 11, 2, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "start f" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 3, 5, 3, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 3, 5, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 3, 11, 3, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 5, 4, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 5, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "name" : "g" + }, + "args" : [ { + "kind" : "IntegerLiteral", + "location" : [ 4, 7, 4, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "Identifier", + "location" : [ 4, 10, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 5, 5, 5, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 5, 5, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 5, 11, 5, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "end f" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 6, 5, 6, 12 ], + "value" : { + "kind" : "Identifier", + "location" : [ 6, 12, 6, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 9, 1, 14, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 9, 5, 9, 5 ], + "name" : "g" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 9, 7, 9, 11 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 9, 7, 9, 7 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 9, 9, 9, 11 ], + "className" : "int" + } + }, { + "kind" : "TypedVar", + "location" : [ 9, 14, 9, 18 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 9, 14, 9, 14 ], + "name" : "z" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 9, 16, 9, 18 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 9, 24, 9, 29 ], + "className" : "object" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 10, 5, 10, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 10, 5, 10, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 10, 5, 10, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 10, 11, 10, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "start g" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 11, 5, 11, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 5, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 5, 11, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 11, 11, 11, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 12, 5, 12, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 12, 5, 12, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 5, 12, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 12, 11, 12, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "z" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 13, 5, 13, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 13, 5, 13, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "name" : "h" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 13, 7, 13, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "h" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 5, 14, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 5, 14, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 5, 14, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 14, 11, 14, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "end g" + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 16, 1, 17, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 16, 5, 16, 5 ], + "name" : "h" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 16, 7, 16, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 9 ], + "name" : "msg" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 16, 12, 16, 14 ], + "className" : "str" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 16, 20, 16, 25 ], + "className" : "object" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 17, 5, 17, 14 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 17, 5, 17, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 17, 5, 17, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 17, 11, 17, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "msg" + } ] + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 19, 1, 19, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 19, 1, 19, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 1, 19, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 19, 7, 19, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 7, 19, 7 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "f" + }, + "args" : [ { + "kind" : "IntegerLiteral", + "location" : [ 19, 9, 19, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/call_with_args.py.ast.typed.s.result b/src/test/data/pa3/sample/call_with_args.py.ast.typed.s.result new file mode 100644 index 0000000..816ee29 --- /dev/null +++ b/src/test/data/pa3/sample/call_with_args.py.ast.typed.s.result @@ -0,0 +1,9 @@ +start f +4 +start g +1 +4 +h +end g +end f +4 diff --git a/src/test/data/pa3/sample/error_div_zero.py b/src/test/data/pa3/sample/error_div_zero.py new file mode 100644 index 0000000..f4481c6 --- /dev/null +++ b/src/test/data/pa3/sample/error_div_zero.py @@ -0,0 +1 @@ +print(42 // 0) diff --git a/src/test/data/pa3/sample/error_div_zero.py.ast.typed b/src/test/data/pa3/sample/error_div_zero.py.ast.typed new file mode 100644 index 0000000..c498a39 --- /dev/null +++ b/src/test/data/pa3/sample/error_div_zero.py.ast.typed @@ -0,0 +1,65 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 15 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 14 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 1, 7, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 7, 1, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + }, + "operator" : "//", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 13, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/error_div_zero.py.ast.typed.s.result b/src/test/data/pa3/sample/error_div_zero.py.ast.typed.s.result new file mode 100644 index 0000000..ffe81ab --- /dev/null +++ b/src/test/data/pa3/sample/error_div_zero.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Divison by zero +Exited with error code 2 diff --git a/src/test/data/pa3/sample/error_invalid_print.py b/src/test/data/pa3/sample/error_invalid_print.py new file mode 100644 index 0000000..ca057e5 --- /dev/null +++ b/src/test/data/pa3/sample/error_invalid_print.py @@ -0,0 +1 @@ +print(None) diff --git a/src/test/data/pa3/sample/error_invalid_print.py.ast.typed b/src/test/data/pa3/sample/error_invalid_print.py.ast.typed new file mode 100644 index 0000000..311e64a --- /dev/null +++ b/src/test/data/pa3/sample/error_invalid_print.py.ast.typed @@ -0,0 +1,46 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 12 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "NoneLiteral", + "location" : [ 1, 7, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/error_invalid_print.py.ast.typed.s.result b/src/test/data/pa3/sample/error_invalid_print.py.ast.typed.s.result new file mode 100644 index 0000000..cfb08fa --- /dev/null +++ b/src/test/data/pa3/sample/error_invalid_print.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Invalid argument +Exited with error code 1 diff --git a/src/test/data/pa3/sample/error_mod_zero.py b/src/test/data/pa3/sample/error_mod_zero.py new file mode 100644 index 0000000..09cfbef --- /dev/null +++ b/src/test/data/pa3/sample/error_mod_zero.py @@ -0,0 +1 @@ +print(42 % 0) diff --git a/src/test/data/pa3/sample/error_mod_zero.py.ast.typed b/src/test/data/pa3/sample/error_mod_zero.py.ast.typed new file mode 100644 index 0000000..371eb36 --- /dev/null +++ b/src/test/data/pa3/sample/error_mod_zero.py.ast.typed @@ -0,0 +1,65 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 14 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 1, 7, 1, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 7, 1, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + }, + "operator" : "%", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 12, 1, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/error_mod_zero.py.ast.typed.s.result b/src/test/data/pa3/sample/error_mod_zero.py.ast.typed.s.result new file mode 100644 index 0000000..ffe81ab --- /dev/null +++ b/src/test/data/pa3/sample/error_mod_zero.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Divison by zero +Exited with error code 2 diff --git a/src/test/data/pa3/sample/expr_if.py b/src/test/data/pa3/sample/expr_if.py new file mode 100644 index 0000000..e0f0764 --- /dev/null +++ b/src/test/data/pa3/sample/expr_if.py @@ -0,0 +1,2 @@ +print(3 if True else 4) +print(3 if False else 4) diff --git a/src/test/data/pa3/sample/expr_if.py.ast.typed b/src/test/data/pa3/sample/expr_if.py.ast.typed new file mode 100644 index 0000000..3b06e26 --- /dev/null +++ b/src/test/data/pa3/sample/expr_if.py.ast.typed @@ -0,0 +1,135 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 2, 25 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 23 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IfExpr", + "location" : [ 1, 7, 1, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "condition" : { + "kind" : "BooleanLiteral", + "location" : [ 1, 12, 1, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "thenExpr" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 7, 1, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + }, + "elseExpr" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 22, 1, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 2, 1, 2, 24 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 1, 2, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IfExpr", + "location" : [ 2, 7, 2, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "condition" : { + "kind" : "BooleanLiteral", + "location" : [ 2, 12, 2, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + }, + "thenExpr" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 7, 2, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + }, + "elseExpr" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 23, 2, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/expr_if.py.ast.typed.s.result b/src/test/data/pa3/sample/expr_if.py.ast.typed.s.result new file mode 100644 index 0000000..b944734 --- /dev/null +++ b/src/test/data/pa3/sample/expr_if.py.ast.typed.s.result @@ -0,0 +1,2 @@ +3 +4 diff --git a/src/test/data/pa3/sample/id_global.py b/src/test/data/pa3/sample/id_global.py new file mode 100644 index 0000000..d72c7d2 --- /dev/null +++ b/src/test/data/pa3/sample/id_global.py @@ -0,0 +1,2 @@ +x:int = 42 +print(x) diff --git a/src/test/data/pa3/sample/id_global.py.ast.typed b/src/test/data/pa3/sample/id_global.py.ast.typed new file mode 100644 index 0000000..9605936 --- /dev/null +++ b/src/test/data/pa3/sample/id_global.py.ast.typed @@ -0,0 +1,73 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 2, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 2, 1, 2, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 1, 2, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 2, 7, 2, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/id_global.py.ast.typed.s.result b/src/test/data/pa3/sample/id_global.py.ast.typed.s.result new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/src/test/data/pa3/sample/id_global.py.ast.typed.s.result @@ -0,0 +1 @@ +42 diff --git a/src/test/data/pa3/sample/id_local.py b/src/test/data/pa3/sample/id_local.py new file mode 100644 index 0000000..ff6dec8 --- /dev/null +++ b/src/test/data/pa3/sample/id_local.py @@ -0,0 +1,5 @@ +def f() -> int: + x:int = 1 + return x + +print(f()) diff --git a/src/test/data/pa3/sample/id_local.py.ast.typed b/src/test/data/pa3/sample/id_local.py.ast.typed new file mode 100644 index 0000000..472aa17 --- /dev/null +++ b/src/test/data/pa3/sample/id_local.py.ast.typed @@ -0,0 +1,114 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 5, 11 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 1, 1, 3, 11 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 5, 1, 5 ], + "name" : "f" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 1, 12, 1, 14 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 3, 2, 11 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 3, 2, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 3, 2, 3 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 5, 2, 7 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 11, 2, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 3, 3, 3, 10 ], + "value" : { + "kind" : "Identifier", + "location" : [ 3, 10, 3, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 5, 1, 5, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 1, 5, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 5, 7, 5, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 7, 5, 7 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "f" + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/id_local.py.ast.typed.s.result b/src/test/data/pa3/sample/id_local.py.ast.typed.s.result new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/src/test/data/pa3/sample/id_local.py.ast.typed.s.result @@ -0,0 +1 @@ +1 diff --git a/src/test/data/pa3/sample/len_invalid_1.py b/src/test/data/pa3/sample/len_invalid_1.py new file mode 100644 index 0000000..1dfa598 --- /dev/null +++ b/src/test/data/pa3/sample/len_invalid_1.py @@ -0,0 +1,3 @@ +x:[int] = None + +print(len(x)) diff --git a/src/test/data/pa3/sample/len_invalid_1.py.ast.typed b/src/test/data/pa3/sample/len_invalid_1.py.ast.typed new file mode 100644 index 0000000..170d7ee --- /dev/null +++ b/src/test/data/pa3/sample/len_invalid_1.py.ast.typed @@ -0,0 +1,103 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 3, 14 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 3, 1, 3, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 3, 1, 3, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 3, 7, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 7, 3, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 3, 11, 3, 11 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/len_invalid_1.py.ast.typed.s.result b/src/test/data/pa3/sample/len_invalid_1.py.ast.typed.s.result new file mode 100644 index 0000000..cfb08fa --- /dev/null +++ b/src/test/data/pa3/sample/len_invalid_1.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Invalid argument +Exited with error code 1 diff --git a/src/test/data/pa3/sample/len_invalid_2.py b/src/test/data/pa3/sample/len_invalid_2.py new file mode 100644 index 0000000..de46502 --- /dev/null +++ b/src/test/data/pa3/sample/len_invalid_2.py @@ -0,0 +1,3 @@ +x:int = 1 + +print(len(x)) diff --git a/src/test/data/pa3/sample/len_invalid_2.py.ast.typed b/src/test/data/pa3/sample/len_invalid_2.py.ast.typed new file mode 100644 index 0000000..afc264d --- /dev/null +++ b/src/test/data/pa3/sample/len_invalid_2.py.ast.typed @@ -0,0 +1,97 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 3, 14 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 3, 1, 3, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 3, 1, 3, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 3, 7, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 7, 3, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 3, 11, 3, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/len_invalid_2.py.ast.typed.s.result b/src/test/data/pa3/sample/len_invalid_2.py.ast.typed.s.result new file mode 100644 index 0000000..cfb08fa --- /dev/null +++ b/src/test/data/pa3/sample/len_invalid_2.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Invalid argument +Exited with error code 1 diff --git a/src/test/data/pa3/sample/list_concat.py b/src/test/data/pa3/sample/list_concat.py new file mode 100644 index 0000000..d2ef21d --- /dev/null +++ b/src/test/data/pa3/sample/list_concat.py @@ -0,0 +1,12 @@ +def concat(x:[int], y:[int]) -> [int]: + return x + y + +z:[int] = None +i:int = 0 + +z = concat([1,2,3], [4,5,6]) + +while i < len(z): + print(z[i]) + i = i + 1 + diff --git a/src/test/data/pa3/sample/list_concat.py.ast.typed b/src/test/data/pa3/sample/list_concat.py.ast.typed new file mode 100644 index 0000000..38ba198 --- /dev/null +++ b/src/test/data/pa3/sample/list_concat.py.ast.typed @@ -0,0 +1,437 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 13, 1 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 1, 1, 2, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 5, 1, 10 ], + "name" : "concat" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 1, 12, 1, 18 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 12, 1, 12 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 14, 1, 18 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 15, 1, 17 ], + "className" : "int" + } + } + }, { + "kind" : "TypedVar", + "location" : [ 1, 21, 1, 27 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 21, 1, 21 ], + "name" : "y" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 23, 1, 27 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 24, 1, 26 ], + "className" : "int" + } + } + } ], + "returnType" : { + "kind" : "ListType", + "location" : [ 1, 33, 1, 37 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 34, 1, 36 ], + "className" : "int" + } + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 2, 5, 2, 16 ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 2, 12, 2, 16 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "left" : { + "kind" : "Identifier", + "location" : [ 2, 12, 2, 12 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 2, 16, 2, 16 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "y" + } + } + } ] + }, { + "kind" : "VarDef", + "location" : [ 4, 1, 4, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 1, 4, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 4, 3, 4, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 4, 4, 4, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 4, 11, 4, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 5, 1, 5, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 1, 5, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 1 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 3, 5, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 9, 5, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 1, 7, 28 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 7, 5, 7, 28 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + } + }, + "name" : "concat" + }, + "args" : [ { + "kind" : "ListExpr", + "location" : [ 7, 12, 7, 18 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 7, 13, 7, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 7, 15, 7, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 7, 17, 7, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + }, { + "kind" : "ListExpr", + "location" : [ 7, 21, 7, 27 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 7, 22, 7, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + }, { + "kind" : "IntegerLiteral", + "location" : [ 7, 24, 7, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 5 + }, { + "kind" : "IntegerLiteral", + "location" : [ 7, 26, 7, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 6 + } ] + } ] + } + }, { + "kind" : "WhileStmt", + "location" : [ 9, 1, 13, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 9, 7, 9, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 9, 7, 9, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<", + "right" : { + "kind" : "CallExpr", + "location" : [ 9, 11, 9, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 11, 9, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 9, 15, 9, 15 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ] + } + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 10, 5, 10, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 10, 5, 10, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 10, 5, 10, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 10, 11, 10, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 10, 11, 10, 11 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "index" : { + "kind" : "Identifier", + "location" : [ 10, 13, 10, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 11, 5, 11, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 11, 5, 11, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 11, 9, 11, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 11, 13, 11, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_concat.py.ast.typed.s.result b/src/test/data/pa3/sample/list_concat.py.ast.typed.s.result new file mode 100644 index 0000000..b414108 --- /dev/null +++ b/src/test/data/pa3/sample/list_concat.py.ast.typed.s.result @@ -0,0 +1,6 @@ +1 +2 +3 +4 +5 +6 diff --git a/src/test/data/pa3/sample/list_concat_2.py b/src/test/data/pa3/sample/list_concat_2.py new file mode 100644 index 0000000..ed0826c --- /dev/null +++ b/src/test/data/pa3/sample/list_concat_2.py @@ -0,0 +1,8 @@ +z:[int] = None +i:int = 0 + +z = [1,2,3] + [4,5,6] + [7,8,9] + +while i < len(z): + print(z[i]) + i = i + 1 diff --git a/src/test/data/pa3/sample/list_concat_2.py.ast.typed b/src/test/data/pa3/sample/list_concat_2.py.ast.typed new file mode 100644 index 0000000..f5a28b0 --- /dev/null +++ b/src/test/data/pa3/sample/list_concat_2.py.ast.typed @@ -0,0 +1,366 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 9, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 9, 2, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 4, 1, 4, 31 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 4, 5, 4, 31 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 4, 5, 4, 21 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "left" : { + "kind" : "ListExpr", + "location" : [ 4, 5, 4, 11 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 4, 6, 4, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 8, 4, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 10, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + }, + "operator" : "+", + "right" : { + "kind" : "ListExpr", + "location" : [ 4, 15, 4, 21 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 4, 16, 4, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 18, 4, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 5 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 20, 4, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 6 + } ] + } + }, + "operator" : "+", + "right" : { + "kind" : "ListExpr", + "location" : [ 4, 25, 4, 31 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 4, 26, 4, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 7 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 28, 4, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 8 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 30, 4, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 9 + } ] + } + } + }, { + "kind" : "WhileStmt", + "location" : [ 6, 1, 9, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 6, 7, 6, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 6, 7, 6, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "<", + "right" : { + "kind" : "CallExpr", + "location" : [ 6, 11, 6, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 11, 6, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 6, 15, 6, 15 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ] + } + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 7, 5, 7, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 7, 5, 7, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 7, 11, 7, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 7, 11, 7, 11 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "index" : { + "kind" : "Identifier", + "location" : [ 7, 13, 7, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 8, 5, 8, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 8, 13, 8, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_concat_2.py.ast.typed.s.result b/src/test/data/pa3/sample/list_concat_2.py.ast.typed.s.result new file mode 100644 index 0000000..0719398 --- /dev/null +++ b/src/test/data/pa3/sample/list_concat_2.py.ast.typed.s.result @@ -0,0 +1,9 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 diff --git a/src/test/data/pa3/sample/list_concat_none.py b/src/test/data/pa3/sample/list_concat_none.py new file mode 100644 index 0000000..ad0a310 --- /dev/null +++ b/src/test/data/pa3/sample/list_concat_none.py @@ -0,0 +1,4 @@ +x:[int] = None +y:[int] = None + +print(len(x+y)) diff --git a/src/test/data/pa3/sample/list_concat_none.py.ast.typed b/src/test/data/pa3/sample/list_concat_none.py.ast.typed new file mode 100644 index 0000000..5c50b2a --- /dev/null +++ b/src/test/data/pa3/sample/list_concat_none.py.ast.typed @@ -0,0 +1,156 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 16 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ListType", + "location" : [ 2, 3, 2, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 2, 4, 2, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 2, 11, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 4, 7, 4, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 4, 11, 4, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "left" : { + "kind" : "Identifier", + "location" : [ 4, 11, 4, 11 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "y" + } + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_concat_none.py.ast.typed.s.result b/src/test/data/pa3/sample/list_concat_none.py.ast.typed.s.result new file mode 100644 index 0000000..ae52477 --- /dev/null +++ b/src/test/data/pa3/sample/list_concat_none.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Operation on None +Exited with error code 4 diff --git a/src/test/data/pa3/sample/list_get_element.py b/src/test/data/pa3/sample/list_get_element.py new file mode 100644 index 0000000..54a3835 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element.py @@ -0,0 +1,6 @@ +x:[int] = None + +x = [1, 2, 3] +print(x[0]) +print(x[1]) +print(x[2]) diff --git a/src/test/data/pa3/sample/list_get_element.py.ast.typed b/src/test/data/pa3/sample/list_get_element.py.ast.typed new file mode 100644 index 0000000..71a94cb --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element.py.ast.typed @@ -0,0 +1,259 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 6, 12 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 3, 6, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 12, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 4, 7, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 9, 4, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 5, 1, 5, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 1, 5, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 5, 7, 5, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 5, 7, 5, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 9, 5, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 6, 1, 6, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 1, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 6, 7, 6, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 6, 7, 6, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 6, 9, 6, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_get_element.py.ast.typed.s.result b/src/test/data/pa3/sample/list_get_element.py.ast.typed.s.result new file mode 100644 index 0000000..01e79c3 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element.py.ast.typed.s.result @@ -0,0 +1,3 @@ +1 +2 +3 diff --git a/src/test/data/pa3/sample/list_get_element_complex.py b/src/test/data/pa3/sample/list_get_element_complex.py new file mode 100644 index 0000000..fe03e8d --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_complex.py @@ -0,0 +1,11 @@ +next:int = 0 + +def next_int() -> int: + global next + next = next + 1 + return next + +def make_list() -> [int]: + return [next_int(), next_int(), next_int()] + +print(make_list()[next_int() - 3]) diff --git a/src/test/data/pa3/sample/list_get_element_complex.py.ast.typed b/src/test/data/pa3/sample/list_get_element_complex.py.ast.typed new file mode 100644 index 0000000..f3c48bb --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_complex.py.ast.typed @@ -0,0 +1,313 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 11, 35 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 12 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 8 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 4 ], + "name" : "next" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 6, 1, 8 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 12, 1, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "FuncDef", + "location" : [ 3, 1, 6, 16 ], + "name" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 12 ], + "name" : "next_int" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 3, 19, 3, 21 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "GlobalDecl", + "location" : [ 4, 5, 4, 15 ], + "variable" : { + "kind" : "Identifier", + "location" : [ 4, 12, 4, 15 ], + "name" : "next" + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 5, 5, 5, 19 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "next" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 5, 12, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 5, 12, 5, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "next" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 19, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + }, { + "kind" : "ReturnStmt", + "location" : [ 6, 5, 6, 15 ], + "value" : { + "kind" : "Identifier", + "location" : [ 6, 12, 6, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "next" + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 8, 1, 9, 48 ], + "name" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 13 ], + "name" : "make_list" + }, + "params" : [ ], + "returnType" : { + "kind" : "ListType", + "location" : [ 8, 20, 8, 24 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 8, 21, 8, 23 ], + "className" : "int" + } + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 9, 5, 9, 47 ], + "value" : { + "kind" : "ListExpr", + "location" : [ 9, 12, 9, 47 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "CallExpr", + "location" : [ 9, 13, 9, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 13, 9, 20 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "next_int" + }, + "args" : [ ] + }, { + "kind" : "CallExpr", + "location" : [ 9, 25, 9, 34 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 25, 9, 32 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "next_int" + }, + "args" : [ ] + }, { + "kind" : "CallExpr", + "location" : [ 9, 37, 9, 46 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 37, 9, 44 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "next_int" + }, + "args" : [ ] + } ] + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 1, 11, 34 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 1, 11, 34 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 11, 7, 11, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "CallExpr", + "location" : [ 11, 7, 11, 17 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 7, 11, 15 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + } + }, + "name" : "make_list" + }, + "args" : [ ] + }, + "index" : { + "kind" : "BinaryExpr", + "location" : [ 11, 19, 11, 32 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "CallExpr", + "location" : [ 11, 19, 11, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 19, 11, 26 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "next_int" + }, + "args" : [ ] + }, + "operator" : "-", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 11, 32, 11, 32 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_get_element_complex.py.ast.typed.s.result b/src/test/data/pa3/sample/list_get_element_complex.py.ast.typed.s.result new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_complex.py.ast.typed.s.result @@ -0,0 +1 @@ +2 diff --git a/src/test/data/pa3/sample/list_get_element_none.py b/src/test/data/pa3/sample/list_get_element_none.py new file mode 100644 index 0000000..871b395 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_none.py @@ -0,0 +1,3 @@ +x:[int] = None + +print(x[0]) diff --git a/src/test/data/pa3/sample/list_get_element_none.py.ast.typed b/src/test/data/pa3/sample/list_get_element_none.py.ast.typed new file mode 100644 index 0000000..a95c813 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_none.py.ast.typed @@ -0,0 +1,96 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 3, 12 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 3, 1, 3, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 3, 1, 3, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 3, 7, 3, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 3, 7, 3, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_get_element_none.py.ast.typed.s.result b/src/test/data/pa3/sample/list_get_element_none.py.ast.typed.s.result new file mode 100644 index 0000000..ae52477 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_none.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Operation on None +Exited with error code 4 diff --git a/src/test/data/pa3/sample/list_get_element_oob_1.py b/src/test/data/pa3/sample/list_get_element_oob_1.py new file mode 100644 index 0000000..7b0e490 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_1.py @@ -0,0 +1,4 @@ +x:[int] = None + +x = [1, 2, 3] +print(x[-1]) diff --git a/src/test/data/pa3/sample/list_get_element_oob_1.py.ast.typed b/src/test/data/pa3/sample/list_get_element_oob_1.py.ast.typed new file mode 100644 index 0000000..c5e9254 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_1.py.ast.typed @@ -0,0 +1,156 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 13 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 3, 6, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 12, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 4, 7, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "UnaryExpr", + "location" : [ 4, 9, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "operator" : "-", + "operand" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 10, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_get_element_oob_1.py.ast.typed.s.result b/src/test/data/pa3/sample/list_get_element_oob_1.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_1.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/list_get_element_oob_2.py b/src/test/data/pa3/sample/list_get_element_oob_2.py new file mode 100644 index 0000000..ba070b2 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_2.py @@ -0,0 +1,4 @@ +x:[int] = None + +x = [1, 2, 3] +print(x[3]) diff --git a/src/test/data/pa3/sample/list_get_element_oob_2.py.ast.typed b/src/test/data/pa3/sample/list_get_element_oob_2.py.ast.typed new file mode 100644 index 0000000..070d13b --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_2.py.ast.typed @@ -0,0 +1,147 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 12 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 3, 6, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 12, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 4, 7, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 9, 4, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_get_element_oob_2.py.ast.typed.s.result b/src/test/data/pa3/sample/list_get_element_oob_2.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_2.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/list_get_element_oob_3.py b/src/test/data/pa3/sample/list_get_element_oob_3.py new file mode 100644 index 0000000..827aae5 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_3.py @@ -0,0 +1,4 @@ +x:[int] = None + +x = [] +print(x[0]) diff --git a/src/test/data/pa3/sample/list_get_element_oob_3.py.ast.typed b/src/test/data/pa3/sample/list_get_element_oob_3.py.ast.typed new file mode 100644 index 0000000..aaeb34f --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_3.py.ast.typed @@ -0,0 +1,120 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 12 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 6 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<Empty>" + }, + "elements" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 4, 7, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 9, 4, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_get_element_oob_3.py.ast.typed.s.result b/src/test/data/pa3/sample/list_get_element_oob_3.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/list_get_element_oob_3.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/list_len.py b/src/test/data/pa3/sample/list_len.py new file mode 100644 index 0000000..95ba341 --- /dev/null +++ b/src/test/data/pa3/sample/list_len.py @@ -0,0 +1,4 @@ +x:[int] = None + +x = [1, 2, 3] +print(len(x)) diff --git a/src/test/data/pa3/sample/list_len.py.ast.typed b/src/test/data/pa3/sample/list_len.py.ast.typed new file mode 100644 index 0000000..5a34893 --- /dev/null +++ b/src/test/data/pa3/sample/list_len.py.ast.typed @@ -0,0 +1,154 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 14 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 3, 6, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 12, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 4, 7, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 4, 11, 4, 11 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_len.py.ast.typed.s.result b/src/test/data/pa3/sample/list_len.py.ast.typed.s.result new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/src/test/data/pa3/sample/list_len.py.ast.typed.s.result @@ -0,0 +1 @@ +3 diff --git a/src/test/data/pa3/sample/list_len_empty.py b/src/test/data/pa3/sample/list_len_empty.py new file mode 100644 index 0000000..52bd178 --- /dev/null +++ b/src/test/data/pa3/sample/list_len_empty.py @@ -0,0 +1,4 @@ +x:[int] = None + +x = [] +print(len(x)) diff --git a/src/test/data/pa3/sample/list_len_empty.py.ast.typed b/src/test/data/pa3/sample/list_len_empty.py.ast.typed new file mode 100644 index 0000000..4b70475 --- /dev/null +++ b/src/test/data/pa3/sample/list_len_empty.py.ast.typed @@ -0,0 +1,127 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 14 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 6 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<Empty>" + }, + "elements" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 4, 7, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 4, 11, 4, 11 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_len_empty.py.ast.typed.s.result b/src/test/data/pa3/sample/list_len_empty.py.ast.typed.s.result new file mode 100644 index 0000000..573541a --- /dev/null +++ b/src/test/data/pa3/sample/list_len_empty.py.ast.typed.s.result @@ -0,0 +1 @@ +0 diff --git a/src/test/data/pa3/sample/list_set_element.py b/src/test/data/pa3/sample/list_set_element.py new file mode 100644 index 0000000..c678fe9 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element.py @@ -0,0 +1,9 @@ +x:[int] = None + +x = [1, 2, 3] +x[0] = 4 +x[1] = 5 +x[2] = 6 +print(x[0]) +print(x[1]) +print(x[2]) diff --git a/src/test/data/pa3/sample/list_set_element.py.ast.typed b/src/test/data/pa3/sample/list_set_element.py.ast.typed new file mode 100644 index 0000000..69649ee --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element.py.ast.typed @@ -0,0 +1,382 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 9, 12 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 3, 6, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 12, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 4, 1, 4, 8 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 4, 1, 4, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 3, 4, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 8, 4, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + }, { + "kind" : "AssignStmt", + "location" : [ 5, 1, 5, 8 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 5, 1, 5, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 3, 5, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 8, 5, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 5 + } + }, { + "kind" : "AssignStmt", + "location" : [ 6, 1, 6, 8 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 6, 1, 6, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 6, 3, 6, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 6, 8, 6, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 6 + } + }, { + "kind" : "ExprStmt", + "location" : [ 7, 1, 7, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 7, 1, 7, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 7, 7, 7, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 7, 9, 7, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 8, 1, 8, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 1, 8, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 1, 8, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 8, 7, 8, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 8, 7, 8, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 8, 9, 8, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 9, 1, 9, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 9, 1, 9, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 1, 9, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 9, 7, 9, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 9, 7, 9, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 9, 9, 9, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_set_element.py.ast.typed.s.result b/src/test/data/pa3/sample/list_set_element.py.ast.typed.s.result new file mode 100644 index 0000000..4578bc1 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element.py.ast.typed.s.result @@ -0,0 +1,3 @@ +4 +5 +6 diff --git a/src/test/data/pa3/sample/list_set_element_none.py b/src/test/data/pa3/sample/list_set_element_none.py new file mode 100644 index 0000000..281c7b4 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_none.py @@ -0,0 +1,4 @@ +x:[int] = None + +x[0] = 1 + diff --git a/src/test/data/pa3/sample/list_set_element_none.py.ast.typed b/src/test/data/pa3/sample/list_set_element_none.py.ast.typed new file mode 100644 index 0000000..fd16a97 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_none.py.ast.typed @@ -0,0 +1,81 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 3, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 8 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 3, 1, 3, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 3, 3, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 8, 3, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_set_element_none.py.ast.typed.s.result b/src/test/data/pa3/sample/list_set_element_none.py.ast.typed.s.result new file mode 100644 index 0000000..ae52477 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_none.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Operation on None +Exited with error code 4 diff --git a/src/test/data/pa3/sample/list_set_element_oob_1.py b/src/test/data/pa3/sample/list_set_element_oob_1.py new file mode 100644 index 0000000..efd92ca --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_1.py @@ -0,0 +1,7 @@ +x:[int] = None + +x = [1, 2, 3] +x[-1] = 4 +print(x[0]) +print(x[1]) +print(x[2]) diff --git a/src/test/data/pa3/sample/list_set_element_oob_1.py.ast.typed b/src/test/data/pa3/sample/list_set_element_oob_1.py.ast.typed new file mode 100644 index 0000000..ed84b22 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_1.py.ast.typed @@ -0,0 +1,309 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 7, 12 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 3, 6, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 12, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 4, 1, 4, 9 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "UnaryExpr", + "location" : [ 4, 3, 4, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "operator" : "-", + "operand" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 4, 4, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 9, 4, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + }, { + "kind" : "ExprStmt", + "location" : [ 5, 1, 5, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 1, 5, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 5, 7, 5, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 5, 7, 5, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 9, 5, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 6, 1, 6, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 1, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 6, 7, 6, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 6, 7, 6, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 6, 9, 6, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 7, 1, 7, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 7, 1, 7, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 7, 7, 7, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 7, 9, 7, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_set_element_oob_1.py.ast.typed.s.result b/src/test/data/pa3/sample/list_set_element_oob_1.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_1.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/list_set_element_oob_2.py b/src/test/data/pa3/sample/list_set_element_oob_2.py new file mode 100644 index 0000000..301cea1 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_2.py @@ -0,0 +1,7 @@ +x:[int] = None + +x = [1, 2, 3] +x[4] = 4 +print(x[0]) +print(x[1]) +print(x[2]) diff --git a/src/test/data/pa3/sample/list_set_element_oob_2.py.ast.typed b/src/test/data/pa3/sample/list_set_element_oob_2.py.ast.typed new file mode 100644 index 0000000..5c06dca --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_2.py.ast.typed @@ -0,0 +1,300 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 7, 12 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 3, 6, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 3, 12, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 4, 1, 4, 8 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 4, 1, 4, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 3, 4, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 8, 4, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + }, { + "kind" : "ExprStmt", + "location" : [ 5, 1, 5, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 1, 5, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 5, 7, 5, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 5, 7, 5, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 9, 5, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 6, 1, 6, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 1, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 6, 7, 6, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 6, 7, 6, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 6, 9, 6, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 7, 1, 7, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 7, 1, 7, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IndexExpr", + "location" : [ 7, 7, 7, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 7, 9, 7, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_set_element_oob_2.py.ast.typed.s.result b/src/test/data/pa3/sample/list_set_element_oob_2.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_2.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/list_set_element_oob_3.py b/src/test/data/pa3/sample/list_set_element_oob_3.py new file mode 100644 index 0000000..281c93c --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_3.py @@ -0,0 +1,4 @@ +x:[int] = None + +x = [] +x[0] = 4 diff --git a/src/test/data/pa3/sample/list_set_element_oob_3.py.ast.typed b/src/test/data/pa3/sample/list_set_element_oob_3.py.ast.typed new file mode 100644 index 0000000..ec34032 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_3.py.ast.typed @@ -0,0 +1,105 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 3, 1, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 1, 11, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 6 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 3, 5, 3, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<Empty>" + }, + "elements" : [ ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 4, 1, 4, 8 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 4, 1, 4, 4 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "x" + }, + "index" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 3, 4, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 8, 4, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/list_set_element_oob_3.py.ast.typed.s.result b/src/test/data/pa3/sample/list_set_element_oob_3.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/list_set_element_oob_3.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/literal_bool.py b/src/test/data/pa3/sample/literal_bool.py new file mode 100644 index 0000000..54b7f1f --- /dev/null +++ b/src/test/data/pa3/sample/literal_bool.py @@ -0,0 +1,2 @@ +print(True) +print(False) diff --git a/src/test/data/pa3/sample/literal_bool.py.ast.typed b/src/test/data/pa3/sample/literal_bool.py.ast.typed new file mode 100644 index 0000000..436e5f7 --- /dev/null +++ b/src/test/data/pa3/sample/literal_bool.py.ast.typed @@ -0,0 +1,83 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 2, 13 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 11 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BooleanLiteral", + "location" : [ 1, 7, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 2, 1, 2, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 1, 2, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BooleanLiteral", + "location" : [ 2, 7, 2, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/literal_bool.py.ast.typed.s.result b/src/test/data/pa3/sample/literal_bool.py.ast.typed.s.result new file mode 100644 index 0000000..1cc8b5e --- /dev/null +++ b/src/test/data/pa3/sample/literal_bool.py.ast.typed.s.result @@ -0,0 +1,2 @@ +True +False diff --git a/src/test/data/pa3/sample/literal_int.py b/src/test/data/pa3/sample/literal_int.py new file mode 100644 index 0000000..3e78541 --- /dev/null +++ b/src/test/data/pa3/sample/literal_int.py @@ -0,0 +1,2 @@ +print(42) +print(65999) diff --git a/src/test/data/pa3/sample/literal_int.py.ast.typed b/src/test/data/pa3/sample/literal_int.py.ast.typed new file mode 100644 index 0000000..eed7bda --- /dev/null +++ b/src/test/data/pa3/sample/literal_int.py.ast.typed @@ -0,0 +1,83 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 2, 13 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 9 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IntegerLiteral", + "location" : [ 1, 7, 1, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 2, 1, 2, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 1, 2, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "IntegerLiteral", + "location" : [ 2, 7, 2, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 65999 + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/literal_int.py.ast.typed.s.result b/src/test/data/pa3/sample/literal_int.py.ast.typed.s.result new file mode 100644 index 0000000..454025b --- /dev/null +++ b/src/test/data/pa3/sample/literal_int.py.ast.typed.s.result @@ -0,0 +1,2 @@ +42 +65999 diff --git a/src/test/data/pa3/sample/literal_str.py b/src/test/data/pa3/sample/literal_str.py new file mode 100644 index 0000000..ad35e5a --- /dev/null +++ b/src/test/data/pa3/sample/literal_str.py @@ -0,0 +1 @@ +print("Hello World") diff --git a/src/test/data/pa3/sample/literal_str.py.ast.typed b/src/test/data/pa3/sample/literal_str.py.ast.typed new file mode 100644 index 0000000..9b924a5 --- /dev/null +++ b/src/test/data/pa3/sample/literal_str.py.ast.typed @@ -0,0 +1,47 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 21 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 1, 7, 1, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Hello World" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/literal_str.py.ast.typed.s.result b/src/test/data/pa3/sample/literal_str.py.ast.typed.s.result new file mode 100644 index 0000000..557db03 --- /dev/null +++ b/src/test/data/pa3/sample/literal_str.py.ast.typed.s.result @@ -0,0 +1 @@ +Hello World diff --git a/src/test/data/pa3/sample/nested.py b/src/test/data/pa3/sample/nested.py new file mode 100644 index 0000000..3faa85b --- /dev/null +++ b/src/test/data/pa3/sample/nested.py @@ -0,0 +1,11 @@ +g: int = 1 +def foo(x: int) -> int: + y: int = 2 + def bar() -> int: + z: int = 3 + def baz() -> int: + return y + return baz() + return bar() + +print(foo(g)) diff --git a/src/test/data/pa3/sample/nested.py.ast.typed b/src/test/data/pa3/sample/nested.py.ast.typed new file mode 100644 index 0000000..ecdc57d --- /dev/null +++ b/src/test/data/pa3/sample/nested.py.ast.typed @@ -0,0 +1,272 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 11, 14 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 6 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "g" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 10, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + }, { + "kind" : "FuncDef", + "location" : [ 2, 1, 9, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 7 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 2, 9, 2, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 9, 2, 9 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 12, 2, 14 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 2, 20, 2, 22 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 3, 5, 3, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 5, 3, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 5 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 8, 3, 10 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 14, 3, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 5, 8, 21 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 11 ], + "name" : "bar" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 18, 4, 20 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 5, 9, 5, 18 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 9, 5, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 9, 5, 9 ], + "name" : "z" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 12, 5, 14 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 18, 5, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } + }, { + "kind" : "FuncDef", + "location" : [ 6, 9, 7, 21 ], + "name" : { + "kind" : "Identifier", + "location" : [ 6, 13, 6, 15 ], + "name" : "baz" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 6, 22, 6, 24 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 7, 13, 7, 20 ], + "value" : { + "kind" : "Identifier", + "location" : [ 7, 20, 7, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 8, 9, 8, 20 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 8, 16, 8, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 16, 8, 18 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "baz" + }, + "args" : [ ] + } + } ] + } ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 9, 5, 9, 16 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 9, 12, 9, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 12, 9, 14 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "bar" + }, + "args" : [ ] + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 1, 11, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 1, 11, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 11, 7, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 7, 11, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "foo" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 11, 11, 11, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "g" + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/nested.py.ast.typed.s.result b/src/test/data/pa3/sample/nested.py.ast.typed.s.result new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/src/test/data/pa3/sample/nested.py.ast.typed.s.result @@ -0,0 +1 @@ +2 diff --git a/src/test/data/pa3/sample/nested2.py b/src/test/data/pa3/sample/nested2.py new file mode 100644 index 0000000..abafcce --- /dev/null +++ b/src/test/data/pa3/sample/nested2.py @@ -0,0 +1,14 @@ +g: int = 1 +def foo(x: int) -> int: + y: int = 2 + def bar() -> int: + z: int = 3 + def baz() -> int: + return qux(y) + return baz() + def qux(p: int) -> int: + return p + + return bar() + +print(foo(g)) diff --git a/src/test/data/pa3/sample/nested2.py.ast.typed b/src/test/data/pa3/sample/nested2.py.ast.typed new file mode 100644 index 0000000..8955e9f --- /dev/null +++ b/src/test/data/pa3/sample/nested2.py.ast.typed @@ -0,0 +1,337 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 14, 14 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 6 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "g" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 4, 1, 6 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 10, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + }, { + "kind" : "FuncDef", + "location" : [ 2, 1, 12, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 7 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 2, 9, 2, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 9, 2, 9 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 12, 2, 14 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 2, 20, 2, 22 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 3, 5, 3, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 5, 3, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 5 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 8, 3, 10 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 14, 3, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 5, 8, 21 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 11 ], + "name" : "bar" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 18, 4, 20 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 5, 9, 5, 18 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 9, 5, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 9, 5, 9 ], + "name" : "z" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 12, 5, 14 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 18, 5, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } + }, { + "kind" : "FuncDef", + "location" : [ 6, 9, 7, 26 ], + "name" : { + "kind" : "Identifier", + "location" : [ 6, 13, 6, 15 ], + "name" : "baz" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 6, 22, 6, 24 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 7, 13, 7, 25 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 7, 20, 7, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 20, 7, 22 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "qux" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 7, 24, 7, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } ] + } + } ] + } ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 8, 9, 8, 20 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 8, 16, 8, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 16, 8, 18 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "baz" + }, + "args" : [ ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 9, 5, 10, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 9, 9, 9, 11 ], + "name" : "qux" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 9, 13, 9, 18 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 9, 13, 9, 13 ], + "name" : "p" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 9, 16, 9, 18 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 9, 24, 9, 26 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 10, 9, 10, 16 ], + "value" : { + "kind" : "Identifier", + "location" : [ 10, 16, 10, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "p" + } + } ] + } ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 12, 5, 12, 16 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 12, 12, 12, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 12, 12, 14 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "bar" + }, + "args" : [ ] + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 14, 7, 14, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "foo" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 14, 11, 14, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "g" + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/nested2.py.ast.typed.s.result b/src/test/data/pa3/sample/nested2.py.ast.typed.s.result new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/src/test/data/pa3/sample/nested2.py.ast.typed.s.result @@ -0,0 +1 @@ +2 diff --git a/src/test/data/pa3/sample/object_attr_get.py b/src/test/data/pa3/sample/object_attr_get.py new file mode 100644 index 0000000..a6bed67 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_get.py @@ -0,0 +1,16 @@ +class A(object): + a:int = 42 + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + +a:A = None +b:B = None + +a = b = B() +print(a.a) +print(b.a) +print(b.b) diff --git a/src/test/data/pa3/sample/object_attr_get.py.ast.typed b/src/test/data/pa3/sample/object_attr_get.py.ast.typed new file mode 100644 index 0000000..f87f054 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_get.py.ast.typed @@ -0,0 +1,387 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 16, 11 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 2, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ] + }, { + "kind" : "ClassDef", + "location" : [ 4, 1, 10, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 5, 5, 5, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 5, 5, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 7, 5, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 14, 5, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 7, 5, 8, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 7, 18, 7, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 18, 7, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 23, 7, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 7, 27, 7, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 9, 8, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 9, 8, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 8, 15, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + } ] + }, { + "kind" : "VarDef", + "location" : [ 10, 1, 10, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 10, 1, 10, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 1, 10, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 3, 10, 3 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 10, 7, 10, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 11, 1, 11, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 11, 1, 11, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 11, 3, 11, 3 ], + "className" : "B" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 11, 7, 11, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 13, 1, 13, 11 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 13, 9, 13, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 9, 13, 9 ], + "name" : "B" + }, + "args" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 14, 7, 14, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 9, 14, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 15, 1, 15, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 15, 1, 15, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 15, 7, 15, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 7, 15, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 9, 15, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 16, 1, 16, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 16, 1, 16, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 16, 7, 16, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 16, 9, 16, 9 ], + "name" : "b" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_attr_get.py.ast.typed.s.result b/src/test/data/pa3/sample/object_attr_get.py.ast.typed.s.result new file mode 100644 index 0000000..79171bc --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_get.py.ast.typed.s.result @@ -0,0 +1,4 @@ +B +42 +42 +True diff --git a/src/test/data/pa3/sample/object_attr_get_none.py b/src/test/data/pa3/sample/object_attr_get_none.py new file mode 100644 index 0000000..270bb16 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_get_none.py @@ -0,0 +1,16 @@ +class A(object): + a:int = 42 + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + +a:A = None +b:B = None + +a = B() +print(a.a) +print(b.a) +print(b.b) diff --git a/src/test/data/pa3/sample/object_attr_get_none.py.ast.typed b/src/test/data/pa3/sample/object_attr_get_none.py.ast.typed new file mode 100644 index 0000000..2787984 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_get_none.py.ast.typed @@ -0,0 +1,379 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 16, 11 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 2, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ] + }, { + "kind" : "ClassDef", + "location" : [ 4, 1, 10, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 5, 5, 5, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 5, 5, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 7, 5, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 14, 5, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 7, 5, 8, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 7, 18, 7, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 18, 7, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 23, 7, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 7, 27, 7, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 9, 8, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 9, 8, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 8, 15, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + } ] + }, { + "kind" : "VarDef", + "location" : [ 10, 1, 10, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 10, 1, 10, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 1, 10, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 3, 10, 3 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 10, 7, 10, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 11, 1, 11, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 11, 1, 11, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 11, 3, 11, 3 ], + "className" : "B" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 11, 7, 11, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 13, 1, 13, 7 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 13, 5, 13, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 5 ], + "name" : "B" + }, + "args" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 14, 7, 14, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 9, 14, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 15, 1, 15, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 15, 1, 15, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 15, 7, 15, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 7, 15, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 9, 15, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 16, 1, 16, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 16, 1, 16, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 16, 7, 16, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 16, 9, 16, 9 ], + "name" : "b" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_attr_get_none.py.ast.typed.s.result b/src/test/data/pa3/sample/object_attr_get_none.py.ast.typed.s.result new file mode 100644 index 0000000..80d81d1 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_get_none.py.ast.typed.s.result @@ -0,0 +1,4 @@ +B +42 +Operation on None +Exited with error code 4 diff --git a/src/test/data/pa3/sample/object_attr_set.py b/src/test/data/pa3/sample/object_attr_set.py new file mode 100644 index 0000000..4183999 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set.py @@ -0,0 +1,18 @@ +class A(object): + a:int = 42 + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + +a:A = None +b:B = None + +a = b = B() +b.a = 1 +b.b = False +print(a.a) +print(b.a) +print(b.b) diff --git a/src/test/data/pa3/sample/object_attr_set.py.ast.typed b/src/test/data/pa3/sample/object_attr_set.py.ast.typed new file mode 100644 index 0000000..4ea6427 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set.py.ast.typed @@ -0,0 +1,455 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 18, 11 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 2, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ] + }, { + "kind" : "ClassDef", + "location" : [ 4, 1, 10, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 5, 5, 5, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 5, 5, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 7, 5, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 14, 5, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 7, 5, 8, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 7, 18, 7, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 18, 7, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 23, 7, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 7, 27, 7, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 9, 8, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 9, 8, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 8, 15, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + } ] + }, { + "kind" : "VarDef", + "location" : [ 10, 1, 10, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 10, 1, 10, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 1, 10, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 3, 10, 3 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 10, 7, 10, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 11, 1, 11, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 11, 1, 11, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 11, 3, 11, 3 ], + "className" : "B" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 11, 7, 11, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 13, 1, 13, 11 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 13, 9, 13, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 9, 13, 9 ], + "name" : "B" + }, + "args" : [ ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 14, 1, 14, 7 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 14, 1, 14, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 3, 14, 3 ], + "name" : "a" + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 14, 7, 14, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + }, { + "kind" : "AssignStmt", + "location" : [ 15, 1, 15, 11 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 15, 1, 15, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 3, 15, 3 ], + "name" : "b" + } + } ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 15, 7, 15, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + }, { + "kind" : "ExprStmt", + "location" : [ 16, 1, 16, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 16, 1, 16, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 16, 7, 16, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 16, 9, 16, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 17, 1, 17, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 17, 1, 17, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 17, 1, 17, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 17, 7, 17, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 17, 7, 17, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 17, 9, 17, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 18, 1, 18, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 18, 1, 18, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 18, 1, 18, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 18, 7, 18, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 18, 7, 18, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 18, 9, 18, 9 ], + "name" : "b" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_attr_set.py.ast.typed.s.result b/src/test/data/pa3/sample/object_attr_set.py.ast.typed.s.result new file mode 100644 index 0000000..abf1b17 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set.py.ast.typed.s.result @@ -0,0 +1,4 @@ +B +1 +1 +False diff --git a/src/test/data/pa3/sample/object_attr_set_eval_order.py b/src/test/data/pa3/sample/object_attr_set_eval_order.py new file mode 100644 index 0000000..162559d --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set_eval_order.py @@ -0,0 +1,33 @@ +class A(object): + a:int = 42 + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + +a:A = None +b:B = None + +def get_b() -> B: + print("Getting B") + return b + +def get_one() -> int: + print("Getting 1") + return 1 + +def get_false() -> bool: + print("Getting False") + return False + +a = b = B() +get_b().a = get_one() +print("Assigned B.a") +get_b().b = get_false() +print("Assigned B.b") + +print(a.a) +print(b.a) +print(b.b) diff --git a/src/test/data/pa3/sample/object_attr_set_eval_order.py.ast.typed b/src/test/data/pa3/sample/object_attr_set_eval_order.py.ast.typed new file mode 100644 index 0000000..16ae244 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set_eval_order.py.ast.typed @@ -0,0 +1,771 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 33, 11 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 2, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ] + }, { + "kind" : "ClassDef", + "location" : [ 4, 1, 10, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 5, 5, 5, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 5, 5, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 7, 5, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 14, 5, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 7, 5, 8, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 7, 18, 7, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 18, 7, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 23, 7, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 7, 27, 7, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 9, 8, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 9, 8, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 8, 15, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + } ] + }, { + "kind" : "VarDef", + "location" : [ 10, 1, 10, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 10, 1, 10, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 1, 10, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 3, 10, 3 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 10, 7, 10, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 11, 1, 11, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 11, 1, 11, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 11, 3, 11, 3 ], + "className" : "B" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 11, 7, 11, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "FuncDef", + "location" : [ 13, 1, 15, 13 ], + "name" : { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 9 ], + "name" : "get_b" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 13, 16, 13, 16 ], + "className" : "B" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 14, 5, 14, 22 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 5, 14, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 5, 14, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 14, 11, 14, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Getting B" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 15, 5, 15, 12 ], + "value" : { + "kind" : "Identifier", + "location" : [ 15, 12, 15, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 17, 1, 19, 13 ], + "name" : { + "kind" : "Identifier", + "location" : [ 17, 5, 17, 11 ], + "name" : "get_one" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 17, 18, 17, 20 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 18, 5, 18, 22 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 18, 5, 18, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 18, 5, 18, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 18, 11, 18, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Getting 1" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 19, 5, 19, 12 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 19, 12, 19, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 21, 1, 23, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 21, 5, 21, 13 ], + "name" : "get_false" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 21, 20, 21, 23 ], + "className" : "bool" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 22, 5, 22, 26 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 22, 5, 22, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 22, 5, 22, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 22, 11, 22, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Getting False" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 23, 5, 23, 16 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 23, 12, 23, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ] + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 25, 1, 25, 11 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 25, 1, 25, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 25, 5, 25, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 25, 9, 25, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 25, 9, 25, 9 ], + "name" : "B" + }, + "args" : [ ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 26, 1, 26, 21 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 26, 1, 26, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "CallExpr", + "location" : [ 26, 1, 26, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 26, 1, 26, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "B" + } + }, + "name" : "get_b" + }, + "args" : [ ] + }, + "member" : { + "kind" : "Identifier", + "location" : [ 26, 9, 26, 9 ], + "name" : "a" + } + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 26, 13, 26, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 26, 13, 26, 19 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "get_one" + }, + "args" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 27, 1, 27, 21 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 27, 1, 27, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 27, 1, 27, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 27, 7, 27, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Assigned B.a" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 28, 1, 28, 23 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 28, 1, 28, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "CallExpr", + "location" : [ 28, 1, 28, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 28, 1, 28, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "B" + } + }, + "name" : "get_b" + }, + "args" : [ ] + }, + "member" : { + "kind" : "Identifier", + "location" : [ 28, 9, 28, 9 ], + "name" : "b" + } + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 28, 13, 28, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 28, 13, 28, 21 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "get_false" + }, + "args" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 29, 1, 29, 21 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 29, 1, 29, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 29, 1, 29, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 29, 7, 29, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Assigned B.b" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 31, 1, 31, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 31, 1, 31, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 31, 1, 31, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 31, 7, 31, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 31, 7, 31, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 31, 9, 31, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 32, 1, 32, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 32, 1, 32, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 32, 1, 32, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 32, 7, 32, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 32, 7, 32, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 32, 9, 32, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 33, 1, 33, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 33, 1, 33, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 33, 1, 33, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 33, 7, 33, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 33, 7, 33, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 33, 9, 33, 9 ], + "name" : "b" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_attr_set_eval_order.py.ast.typed.s.result b/src/test/data/pa3/sample/object_attr_set_eval_order.py.ast.typed.s.result new file mode 100644 index 0000000..3f82dac --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set_eval_order.py.ast.typed.s.result @@ -0,0 +1,10 @@ +B +Getting 1 +Getting B +Assigned B.a +Getting False +Getting B +Assigned B.b +1 +1 +False diff --git a/src/test/data/pa3/sample/object_attr_set_none.py b/src/test/data/pa3/sample/object_attr_set_none.py new file mode 100644 index 0000000..bfd3184 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set_none.py @@ -0,0 +1,19 @@ +class A(object): + a:int = 42 + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + +a:A = None +b:B = None + +a = B() +print(a.a) + +b.a = 1 +b.b = False +print(b.a) +print(b.b) diff --git a/src/test/data/pa3/sample/object_attr_set_none.py.ast.typed b/src/test/data/pa3/sample/object_attr_set_none.py.ast.typed new file mode 100644 index 0000000..e6f5695 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set_none.py.ast.typed @@ -0,0 +1,447 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 19, 11 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 2, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ] + }, { + "kind" : "ClassDef", + "location" : [ 4, 1, 10, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 5, 5, 5, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 5, 5, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 7, 5, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 14, 5, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 7, 5, 8, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 7, 18, 7, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 18, 7, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 23, 7, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 7, 27, 7, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 9, 8, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 9, 8, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 8, 15, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + } ] + }, { + "kind" : "VarDef", + "location" : [ 10, 1, 10, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 10, 1, 10, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 1, 10, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 3, 10, 3 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 10, 7, 10, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 11, 1, 11, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 11, 1, 11, 3 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 11, 3, 11, 3 ], + "className" : "B" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 11, 7, 11, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 13, 1, 13, 7 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 13, 5, 13, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 5 ], + "name" : "B" + }, + "args" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 14, 7, 14, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 9, 14, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 16, 1, 16, 7 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 16, 1, 16, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 16, 3, 16, 3 ], + "name" : "a" + } + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 16, 7, 16, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + }, { + "kind" : "AssignStmt", + "location" : [ 17, 1, 17, 11 ], + "targets" : [ { + "kind" : "MemberExpr", + "location" : [ 17, 1, 17, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 17, 1, 17, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 17, 3, 17, 3 ], + "name" : "b" + } + } ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 17, 7, 17, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + }, { + "kind" : "ExprStmt", + "location" : [ 18, 1, 18, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 18, 1, 18, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 18, 1, 18, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 18, 7, 18, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 18, 7, 18, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 18, 9, 18, 9 ], + "name" : "a" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 19, 1, 19, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 19, 1, 19, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 1, 19, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 19, 7, 19, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 19, 7, 19, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "b" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 19, 9, 19, 9 ], + "name" : "b" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_attr_set_none.py.ast.typed.s.result b/src/test/data/pa3/sample/object_attr_set_none.py.ast.typed.s.result new file mode 100644 index 0000000..80d81d1 --- /dev/null +++ b/src/test/data/pa3/sample/object_attr_set_none.py.ast.typed.s.result @@ -0,0 +1,4 @@ +B +42 +Operation on None +Exited with error code 4 diff --git a/src/test/data/pa3/sample/object_init.py b/src/test/data/pa3/sample/object_init.py new file mode 100644 index 0000000..e48a5cd --- /dev/null +++ b/src/test/data/pa3/sample/object_init.py @@ -0,0 +1,11 @@ +class A(object): + a:int = 42 + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + + +B() diff --git a/src/test/data/pa3/sample/object_init.py.ast.typed b/src/test/data/pa3/sample/object_init.py.ast.typed new file mode 100644 index 0000000..1ed066e --- /dev/null +++ b/src/test/data/pa3/sample/object_init.py.ast.typed @@ -0,0 +1,173 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 11, 4 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 2, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ] + }, { + "kind" : "ClassDef", + "location" : [ 4, 1, 11, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 5, 5, 5, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 5, 5, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 7, 5, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 14, 5, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 7, 5, 8, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 7, 18, 7, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 18, 7, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 23, 7, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 7, 27, 7, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 9, 8, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 9, 8, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 8, 15, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 1, 11, 3 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 1, 11, 3 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 1 ], + "name" : "B" + }, + "args" : [ ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_init.py.ast.typed.s.result b/src/test/data/pa3/sample/object_init.py.ast.typed.s.result new file mode 100644 index 0000000..223b783 --- /dev/null +++ b/src/test/data/pa3/sample/object_init.py.ast.typed.s.result @@ -0,0 +1 @@ +B diff --git a/src/test/data/pa3/sample/object_method.py b/src/test/data/pa3/sample/object_method.py new file mode 100644 index 0000000..6b71299 --- /dev/null +++ b/src/test/data/pa3/sample/object_method.py @@ -0,0 +1,16 @@ +class A(object): + a:int = 42 + + def foo(self:"A", ignore:object) -> int: + return self.a + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + + def bar(self:"B") -> int: + return self.foo(self.b) + +print(B().bar()) diff --git a/src/test/data/pa3/sample/object_method.py.ast.typed b/src/test/data/pa3/sample/object_method.py.ast.typed new file mode 100644 index 0000000..955c83b --- /dev/null +++ b/src/test/data/pa3/sample/object_method.py.ast.typed @@ -0,0 +1,387 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 16, 17 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 7, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 5, 5, 22 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 11 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 13, 4, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 18, 4, 20 ], + "className" : "A" + } + }, { + "kind" : "TypedVar", + "location" : [ 4, 23, 4, 35 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 23, 4, 28 ], + "name" : "ignore" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 30, 4, 35 ], + "className" : "object" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 41, 4, 43 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 5, 9, 5, 21 ], + "value" : { + "kind" : "MemberExpr", + "location" : [ 5, 16, 5, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 5, 16, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 5, 21, 5, 21 ], + "name" : "a" + } + } + } ] + } ] + }, { + "kind" : "ClassDef", + "location" : [ 7, 1, 16, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 8, 5, 8, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 8, 5, 8, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 7, 8, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 8, 14, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 10, 5, 11, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 10, 9, 10, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 10, 18, 10, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 18, 10, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 23, 10, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 10, 27, 10, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 9, 11, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 9, 11, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 11, 15, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 13, 5, 14, 32 ], + "name" : { + "kind" : "Identifier", + "location" : [ 13, 9, 13, 11 ], + "name" : "bar" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 13, 13, 13, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 13, 13, 13, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 13, 18, 13, 20 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 13, 26, 13, 28 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 14, 9, 14, 31 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 14, 16, 14, 31 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 14, 16, 14, 23 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "A" + }, { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 16, 14, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 21, 14, 23 ], + "name" : "foo" + } + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 14, 25, 14, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 25, 14, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 30, 14, 30 ], + "name" : "b" + } + } ] + } + } ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 16, 1, 16, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 16, 1, 16, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MethodCallExpr", + "location" : [ 16, 7, 16, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 16, 7, 16, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "B" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "CallExpr", + "location" : [ 16, 7, 16, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 7 ], + "name" : "B" + }, + "args" : [ ] + }, + "member" : { + "kind" : "Identifier", + "location" : [ 16, 11, 16, 13 ], + "name" : "bar" + } + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_method.py.ast.typed.s.result b/src/test/data/pa3/sample/object_method.py.ast.typed.s.result new file mode 100644 index 0000000..418c69b --- /dev/null +++ b/src/test/data/pa3/sample/object_method.py.ast.typed.s.result @@ -0,0 +1,2 @@ +B +42 diff --git a/src/test/data/pa3/sample/object_method_complex_call.py b/src/test/data/pa3/sample/object_method_complex_call.py new file mode 100644 index 0000000..d82ec1b --- /dev/null +++ b/src/test/data/pa3/sample/object_method_complex_call.py @@ -0,0 +1,19 @@ +class A(object): + a:int = 42 + + def foo(self:"A", ignore:object) -> int: + return self.a + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + + def bar(self:"B") -> int: + return self.foo(self.foo(print("..."))) + + def foo(self:"B", ignore:object) -> int: + return 1 + +print(B().bar()) diff --git a/src/test/data/pa3/sample/object_method_complex_call.py.ast.typed b/src/test/data/pa3/sample/object_method_complex_call.py.ast.typed new file mode 100644 index 0000000..270f634 --- /dev/null +++ b/src/test/data/pa3/sample/object_method_complex_call.py.ast.typed @@ -0,0 +1,492 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 19, 17 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 7, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 5, 5, 22 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 11 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 13, 4, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 18, 4, 20 ], + "className" : "A" + } + }, { + "kind" : "TypedVar", + "location" : [ 4, 23, 4, 35 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 23, 4, 28 ], + "name" : "ignore" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 30, 4, 35 ], + "className" : "object" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 41, 4, 43 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 5, 9, 5, 21 ], + "value" : { + "kind" : "MemberExpr", + "location" : [ 5, 16, 5, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 5, 16, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 5, 21, 5, 21 ], + "name" : "a" + } + } + } ] + } ] + }, { + "kind" : "ClassDef", + "location" : [ 7, 1, 19, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 8, 5, 8, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 8, 5, 8, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 7, 8, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 8, 14, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 10, 5, 11, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 10, 9, 10, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 10, 18, 10, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 18, 10, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 23, 10, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 10, 27, 10, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 9, 11, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 9, 11, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 11, 15, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 13, 5, 14, 48 ], + "name" : { + "kind" : "Identifier", + "location" : [ 13, 9, 13, 11 ], + "name" : "bar" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 13, 13, 13, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 13, 13, 13, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 13, 18, 13, 20 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 13, 26, 13, 28 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 14, 9, 14, 47 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 14, 16, 14, 47 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 14, 16, 14, 23 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "B" + }, { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 16, 14, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 21, 14, 23 ], + "name" : "foo" + } + }, + "args" : [ { + "kind" : "MethodCallExpr", + "location" : [ 14, 25, 14, 46 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 14, 25, 14, 32 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "B" + }, { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 25, 14, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 30, 14, 32 ], + "name" : "foo" + } + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 14, 34, 14, 45 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 34, 14, 38 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 14, 40, 14, 44 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "..." + } ] + } ] + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 16, 5, 17, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 16, 9, 16, 11 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 16, 13, 16, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 16, 13, 16, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 16, 18, 16, 20 ], + "className" : "B" + } + }, { + "kind" : "TypedVar", + "location" : [ 16, 23, 16, 35 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 16, 23, 16, 28 ], + "name" : "ignore" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 16, 30, 16, 35 ], + "className" : "object" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 16, 41, 16, 43 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 17, 9, 17, 16 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 17, 16, 17, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 19, 1, 19, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 19, 1, 19, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 1, 19, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MethodCallExpr", + "location" : [ 19, 7, 19, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 19, 7, 19, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "B" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "CallExpr", + "location" : [ 19, 7, 19, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 7, 19, 7 ], + "name" : "B" + }, + "args" : [ ] + }, + "member" : { + "kind" : "Identifier", + "location" : [ 19, 11, 19, 13 ], + "name" : "bar" + } + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_method_complex_call.py.ast.typed.s.result b/src/test/data/pa3/sample/object_method_complex_call.py.ast.typed.s.result new file mode 100644 index 0000000..f83c3f1 --- /dev/null +++ b/src/test/data/pa3/sample/object_method_complex_call.py.ast.typed.s.result @@ -0,0 +1,3 @@ +B +... +1 diff --git a/src/test/data/pa3/sample/object_method_nested.py b/src/test/data/pa3/sample/object_method_nested.py new file mode 100644 index 0000000..b193ecd --- /dev/null +++ b/src/test/data/pa3/sample/object_method_nested.py @@ -0,0 +1,18 @@ +class A(object): + a:int = 42 + + def foo(self:"A", ignore:object) -> int: + return self.a + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + + def bar(self:"B") -> int: + def qux(p: bool) -> int: + return self.foo(p) + return qux(True) + +print(B().bar()) diff --git a/src/test/data/pa3/sample/object_method_nested.py.ast.typed b/src/test/data/pa3/sample/object_method_nested.py.ast.typed new file mode 100644 index 0000000..5480892 --- /dev/null +++ b/src/test/data/pa3/sample/object_method_nested.py.ast.typed @@ -0,0 +1,439 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 18, 17 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 7, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 5, 5, 22 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 11 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 13, 4, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 18, 4, 20 ], + "className" : "A" + } + }, { + "kind" : "TypedVar", + "location" : [ 4, 23, 4, 35 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 23, 4, 28 ], + "name" : "ignore" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 30, 4, 35 ], + "className" : "object" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 41, 4, 43 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 5, 9, 5, 21 ], + "value" : { + "kind" : "MemberExpr", + "location" : [ 5, 16, 5, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 5, 16, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 5, 21, 5, 21 ], + "name" : "a" + } + } + } ] + } ] + }, { + "kind" : "ClassDef", + "location" : [ 7, 1, 18, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 8, 5, 8, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 8, 5, 8, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 7, 8, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 8, 14, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 10, 5, 11, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 10, 9, 10, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 10, 18, 10, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 18, 10, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 23, 10, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 10, 27, 10, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 9, 11, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 9, 11, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 11, 15, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 13, 5, 16, 25 ], + "name" : { + "kind" : "Identifier", + "location" : [ 13, 9, 13, 11 ], + "name" : "bar" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 13, 13, 13, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 13, 13, 13, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 13, 18, 13, 20 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 13, 26, 13, 28 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 14, 9, 15, 31 ], + "name" : { + "kind" : "Identifier", + "location" : [ 14, 13, 14, 15 ], + "name" : "qux" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 14, 17, 14, 23 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 14, 17, 14, 17 ], + "name" : "p" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 14, 20, 14, 23 ], + "className" : "bool" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 14, 29, 14, 31 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 15, 13, 15, 30 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 15, 20, 15, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 15, 20, 15, 27 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "A" + }, { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 20, 15, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 25, 15, 27 ], + "name" : "foo" + } + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 15, 29, 15, 29 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "name" : "p" + } ] + } + } ] + } ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 16, 9, 16, 24 ], + "value" : { + "kind" : "CallExpr", + "location" : [ 16, 16, 16, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 16, 16, 18 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "bool" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "qux" + }, + "args" : [ { + "kind" : "BooleanLiteral", + "location" : [ 16, 20, 16, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } ] + } + } ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 18, 1, 18, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 18, 1, 18, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 18, 1, 18, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MethodCallExpr", + "location" : [ 18, 7, 18, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 18, 7, 18, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "B" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "CallExpr", + "location" : [ 18, 7, 18, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 18, 7, 18, 7 ], + "name" : "B" + }, + "args" : [ ] + }, + "member" : { + "kind" : "Identifier", + "location" : [ 18, 11, 18, 13 ], + "name" : "bar" + } + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_method_nested.py.ast.typed.s.result b/src/test/data/pa3/sample/object_method_nested.py.ast.typed.s.result new file mode 100644 index 0000000..418c69b --- /dev/null +++ b/src/test/data/pa3/sample/object_method_nested.py.ast.typed.s.result @@ -0,0 +1,2 @@ +B +42 diff --git a/src/test/data/pa3/sample/object_method_none.py b/src/test/data/pa3/sample/object_method_none.py new file mode 100644 index 0000000..cd50666 --- /dev/null +++ b/src/test/data/pa3/sample/object_method_none.py @@ -0,0 +1,17 @@ +class A(object): + a:int = 42 + + def foo(self:"A", ignore:object) -> int: + return self.a + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + + def bar(self:"B") -> int: + a:A = None + return a.foo(self.b) + +print(B().bar()) diff --git a/src/test/data/pa3/sample/object_method_none.py.ast.typed b/src/test/data/pa3/sample/object_method_none.py.ast.typed new file mode 100644 index 0000000..db92330 --- /dev/null +++ b/src/test/data/pa3/sample/object_method_none.py.ast.typed @@ -0,0 +1,412 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 17, 17 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 7, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 5, 5, 22 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 11 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 13, 4, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 18, 4, 20 ], + "className" : "A" + } + }, { + "kind" : "TypedVar", + "location" : [ 4, 23, 4, 35 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 23, 4, 28 ], + "name" : "ignore" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 30, 4, 35 ], + "className" : "object" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 41, 4, 43 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 5, 9, 5, 21 ], + "value" : { + "kind" : "MemberExpr", + "location" : [ 5, 16, 5, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 5, 16, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 5, 21, 5, 21 ], + "name" : "a" + } + } + } ] + } ] + }, { + "kind" : "ClassDef", + "location" : [ 7, 1, 17, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 8, 5, 8, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 8, 5, 8, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 7, 8, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 8, 14, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 10, 5, 11, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 10, 9, 10, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 10, 18, 10, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 18, 10, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 23, 10, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 10, 27, 10, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 9, 11, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 9, 11, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 11, 15, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 13, 5, 15, 29 ], + "name" : { + "kind" : "Identifier", + "location" : [ 13, 9, 13, 11 ], + "name" : "bar" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 13, 13, 13, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 13, 13, 13, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 13, 18, 13, 20 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 13, 26, 13, 28 ], + "className" : "int" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 14, 9, 14, 18 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 14, 9, 14, 11 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 14, 9, 14, 9 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 14, 11, 14, 11 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 14, 15, 14, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 15, 9, 15, 28 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 15, 16, 15, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 15, 16, 15, 20 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "A" + }, { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 16, 15, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 18, 15, 20 ], + "name" : "foo" + } + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 15, 22, 15, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 15, 22, 15, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 15, 27, 15, 27 ], + "name" : "b" + } + } ] + } + } ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 17, 1, 17, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 17, 1, 17, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 17, 1, 17, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MethodCallExpr", + "location" : [ 17, 7, 17, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 17, 7, 17, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "B" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "CallExpr", + "location" : [ 17, 7, 17, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 17, 7, 17, 7 ], + "name" : "B" + }, + "args" : [ ] + }, + "member" : { + "kind" : "Identifier", + "location" : [ 17, 11, 17, 13 ], + "name" : "bar" + } + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_method_none.py.ast.typed.s.result b/src/test/data/pa3/sample/object_method_none.py.ast.typed.s.result new file mode 100644 index 0000000..d9d147e --- /dev/null +++ b/src/test/data/pa3/sample/object_method_none.py.ast.typed.s.result @@ -0,0 +1,3 @@ +B +Operation on None +Exited with error code 4 diff --git a/src/test/data/pa3/sample/object_method_override.py b/src/test/data/pa3/sample/object_method_override.py new file mode 100644 index 0000000..879b2ba --- /dev/null +++ b/src/test/data/pa3/sample/object_method_override.py @@ -0,0 +1,19 @@ +class A(object): + a:int = 42 + + def foo(self:"A", ignore:object) -> int: + return self.a + +class B(A): + b:bool = True + + def __init__(self:"B"): + print("B") + + def bar(self:"B") -> int: + return self.foo(self.b) + + def foo(self:"B", ignore:object) -> int: + return 1 + +print(B().bar()) diff --git a/src/test/data/pa3/sample/object_method_override.py.ast.typed b/src/test/data/pa3/sample/object_method_override.py.ast.typed new file mode 100644 index 0000000..5684f7d --- /dev/null +++ b/src/test/data/pa3/sample/object_method_override.py.ast.typed @@ -0,0 +1,441 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 19, 17 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 7, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 5, 5, 22 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 11 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 13, 4, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 18, 4, 20 ], + "className" : "A" + } + }, { + "kind" : "TypedVar", + "location" : [ 4, 23, 4, 35 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 23, 4, 28 ], + "name" : "ignore" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 30, 4, 35 ], + "className" : "object" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 41, 4, 43 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 5, 9, 5, 21 ], + "value" : { + "kind" : "MemberExpr", + "location" : [ 5, 16, 5, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 5, 16, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 5, 21, 5, 21 ], + "name" : "a" + } + } + } ] + } ] + }, { + "kind" : "ClassDef", + "location" : [ 7, 1, 19, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "name" : "B" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 9 ], + "name" : "A" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 8, 5, 8, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 8, 5, 8, 10 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 5 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 7, 8, 10 ], + "className" : "bool" + } + }, + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 8, 14, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + }, { + "kind" : "FuncDef", + "location" : [ 10, 5, 11, 19 ], + "name" : { + "kind" : "Identifier", + "location" : [ 10, 9, 10, 16 ], + "name" : "__init__" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 10, 18, 10, 25 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 18, 10, 21 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 23, 10, 25 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 10, 27, 10, 27 ], + "className" : "<None>" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 9, 11, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 9, 11, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 11, 15, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "B" + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 13, 5, 14, 32 ], + "name" : { + "kind" : "Identifier", + "location" : [ 13, 9, 13, 11 ], + "name" : "bar" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 13, 13, 13, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 13, 13, 13, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 13, 18, 13, 20 ], + "className" : "B" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 13, 26, 13, 28 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 14, 9, 14, 31 ], + "value" : { + "kind" : "MethodCallExpr", + "location" : [ 14, 16, 14, 31 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 14, 16, 14, 23 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "B" + }, { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 16, 14, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 21, 14, 23 ], + "name" : "foo" + } + }, + "args" : [ { + "kind" : "MemberExpr", + "location" : [ 14, 25, 14, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "object" : { + "kind" : "Identifier", + "location" : [ 14, 25, 14, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "name" : "self" + }, + "member" : { + "kind" : "Identifier", + "location" : [ 14, 30, 14, 30 ], + "name" : "b" + } + } ] + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 16, 5, 17, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 16, 9, 16, 11 ], + "name" : "foo" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 16, 13, 16, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 16, 13, 16, 16 ], + "name" : "self" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 16, 18, 16, 20 ], + "className" : "B" + } + }, { + "kind" : "TypedVar", + "location" : [ 16, 23, 16, 35 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 16, 23, 16, 28 ], + "name" : "ignore" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 16, 30, 16, 35 ], + "className" : "object" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 16, 41, 16, 43 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 17, 9, 17, 16 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 17, 16, 17, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 19, 1, 19, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 19, 1, 19, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 1, 19, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "MethodCallExpr", + "location" : [ 19, 7, 19, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "method" : { + "kind" : "MemberExpr", + "location" : [ 19, 7, 19, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "B" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "object" : { + "kind" : "CallExpr", + "location" : [ 19, 7, 19, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "B" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 7, 19, 7 ], + "name" : "B" + }, + "args" : [ ] + }, + "member" : { + "kind" : "Identifier", + "location" : [ 19, 11, 19, 13 ], + "name" : "bar" + } + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/object_method_override.py.ast.typed.s.result b/src/test/data/pa3/sample/object_method_override.py.ast.typed.s.result new file mode 100644 index 0000000..9a6e55a --- /dev/null +++ b/src/test/data/pa3/sample/object_method_override.py.ast.typed.s.result @@ -0,0 +1,2 @@ +B +1 diff --git a/src/test/data/pa3/sample/op_add.py b/src/test/data/pa3/sample/op_add.py new file mode 100644 index 0000000..95e89ae --- /dev/null +++ b/src/test/data/pa3/sample/op_add.py @@ -0,0 +1 @@ +print(1 + 100) diff --git a/src/test/data/pa3/sample/op_add.py.ast.typed b/src/test/data/pa3/sample/op_add.py.ast.typed new file mode 100644 index 0000000..a0a2d9b --- /dev/null +++ b/src/test/data/pa3/sample/op_add.py.ast.typed @@ -0,0 +1,65 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 15 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 14 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 1, 7, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 7, 1, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 11, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 100 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_add.py.ast.typed.s.result b/src/test/data/pa3/sample/op_add.py.ast.typed.s.result new file mode 100644 index 0000000..398050c --- /dev/null +++ b/src/test/data/pa3/sample/op_add.py.ast.typed.s.result @@ -0,0 +1 @@ +101 diff --git a/src/test/data/pa3/sample/op_cmp_bool.py b/src/test/data/pa3/sample/op_cmp_bool.py new file mode 100644 index 0000000..7f8d4b5 --- /dev/null +++ b/src/test/data/pa3/sample/op_cmp_bool.py @@ -0,0 +1,8 @@ +print(True == True) +print(True == False) +print(False == True) +print(False == False) +print(True != True) +print(True != False) +print(False != True) +print(False != False) diff --git a/src/test/data/pa3/sample/op_cmp_bool.py.ast.typed b/src/test/data/pa3/sample/op_cmp_bool.py.ast.typed new file mode 100644 index 0000000..4c25364 --- /dev/null +++ b/src/test/data/pa3/sample/op_cmp_bool.py.ast.typed @@ -0,0 +1,443 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 8, 22 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 19 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 1, 7, 1, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BooleanLiteral", + "location" : [ 1, 7, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "operator" : "==", + "right" : { + "kind" : "BooleanLiteral", + "location" : [ 1, 15, 1, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 2, 1, 2, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 1, 2, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 2, 7, 2, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BooleanLiteral", + "location" : [ 2, 7, 2, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "operator" : "==", + "right" : { + "kind" : "BooleanLiteral", + "location" : [ 2, 15, 2, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 3, 1, 3, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 3, 1, 3, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 3, 7, 3, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BooleanLiteral", + "location" : [ 3, 7, 3, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + }, + "operator" : "==", + "right" : { + "kind" : "BooleanLiteral", + "location" : [ 3, 16, 3, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 21 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 4, 7, 4, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BooleanLiteral", + "location" : [ 4, 7, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + }, + "operator" : "==", + "right" : { + "kind" : "BooleanLiteral", + "location" : [ 4, 16, 4, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 5, 1, 5, 19 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 1, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 5, 7, 5, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 7, 5, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "operator" : "!=", + "right" : { + "kind" : "BooleanLiteral", + "location" : [ 5, 15, 5, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 6, 1, 6, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 1, 6, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 6, 7, 6, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BooleanLiteral", + "location" : [ 6, 7, 6, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "operator" : "!=", + "right" : { + "kind" : "BooleanLiteral", + "location" : [ 6, 15, 6, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 7, 1, 7, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 7, 1, 7, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 7, 7, 7, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BooleanLiteral", + "location" : [ 7, 7, 7, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + }, + "operator" : "!=", + "right" : { + "kind" : "BooleanLiteral", + "location" : [ 7, 16, 7, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 8, 1, 8, 21 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 1, 8, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 1, 8, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 8, 7, 8, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "BooleanLiteral", + "location" : [ 8, 7, 8, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + }, + "operator" : "!=", + "right" : { + "kind" : "BooleanLiteral", + "location" : [ 8, 16, 8, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_cmp_bool.py.ast.typed.s.result b/src/test/data/pa3/sample/op_cmp_bool.py.ast.typed.s.result new file mode 100644 index 0000000..12ea2d4 --- /dev/null +++ b/src/test/data/pa3/sample/op_cmp_bool.py.ast.typed.s.result @@ -0,0 +1,8 @@ +True +False +False +True +False +True +True +False diff --git a/src/test/data/pa3/sample/op_cmp_int.py b/src/test/data/pa3/sample/op_cmp_int.py new file mode 100644 index 0000000..fd70a09 --- /dev/null +++ b/src/test/data/pa3/sample/op_cmp_int.py @@ -0,0 +1,16 @@ +x:int = 42 +y:int = 7 + +print(x == y) +print(x != y) +print(x < y) +print(x <= y) +print(x > y) +print(x >= y) + +print(x == x) +print(x != x) +print(x < x) +print(x <= x) +print(x > x) +print(x >= x) diff --git a/src/test/data/pa3/sample/op_cmp_int.py.ast.typed b/src/test/data/pa3/sample/op_cmp_int.py.ast.typed new file mode 100644 index 0000000..4b3633f --- /dev/null +++ b/src/test/data/pa3/sample/op_cmp_int.py.ast.typed @@ -0,0 +1,711 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 16, 14 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 9, 2, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 7 + } + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 4, 7, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "==", + "right" : { + "kind" : "Identifier", + "location" : [ 4, 12, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 5, 1, 5, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 1, 5, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 5, 7, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 5, 7, 5, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "!=", + "right" : { + "kind" : "Identifier", + "location" : [ 5, 12, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 6, 1, 6, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 1, 6, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 6, 7, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 6, 7, 6, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "<", + "right" : { + "kind" : "Identifier", + "location" : [ 6, 11, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 7, 1, 7, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 7, 1, 7, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 7, 7, 7, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "<=", + "right" : { + "kind" : "Identifier", + "location" : [ 7, 12, 7, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 8, 1, 8, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 1, 8, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 1, 8, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 8, 7, 8, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 8, 7, 8, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : ">", + "right" : { + "kind" : "Identifier", + "location" : [ 8, 11, 8, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 9, 1, 9, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 9, 1, 9, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 1, 9, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 9, 7, 9, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 9, 7, 9, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : ">=", + "right" : { + "kind" : "Identifier", + "location" : [ 9, 12, 9, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 11, 1, 11, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 1, 11, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 11, 7, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 11, 7, 11, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "==", + "right" : { + "kind" : "Identifier", + "location" : [ 11, 12, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 12, 1, 12, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 12, 1, 12, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 1, 12, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 12, 7, 12, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 12, 7, 12, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "!=", + "right" : { + "kind" : "Identifier", + "location" : [ 12, 12, 12, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 13, 1, 13, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 13, 1, 13, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 13, 7, 13, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 13, 7, 13, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "<", + "right" : { + "kind" : "Identifier", + "location" : [ 13, 11, 13, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 14, 7, 14, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "<=", + "right" : { + "kind" : "Identifier", + "location" : [ 14, 12, 14, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 15, 1, 15, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 15, 1, 15, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 15, 7, 15, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 15, 7, 15, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : ">", + "right" : { + "kind" : "Identifier", + "location" : [ 15, 11, 15, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 16, 1, 16, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 16, 1, 16, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 16, 7, 16, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : ">=", + "right" : { + "kind" : "Identifier", + "location" : [ 16, 12, 16, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_cmp_int.py.ast.typed.s.result b/src/test/data/pa3/sample/op_cmp_int.py.ast.typed.s.result new file mode 100644 index 0000000..4386d2a --- /dev/null +++ b/src/test/data/pa3/sample/op_cmp_int.py.ast.typed.s.result @@ -0,0 +1,12 @@ +False +True +False +False +True +True +True +False +False +True +False +True diff --git a/src/test/data/pa3/sample/op_div_mod.py b/src/test/data/pa3/sample/op_div_mod.py new file mode 100644 index 0000000..9e41a78 --- /dev/null +++ b/src/test/data/pa3/sample/op_div_mod.py @@ -0,0 +1,5 @@ +x:int = 42 +y:int = 9 + +print(x // y) +print(x % y) diff --git a/src/test/data/pa3/sample/op_div_mod.py.ast.typed b/src/test/data/pa3/sample/op_div_mod.py.ast.typed new file mode 100644 index 0000000..eded4a3 --- /dev/null +++ b/src/test/data/pa3/sample/op_div_mod.py.ast.typed @@ -0,0 +1,171 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 5, 13 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 9, 2, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 9 + } + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 4, 7, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "//", + "right" : { + "kind" : "Identifier", + "location" : [ 4, 12, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 5, 1, 5, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 1, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 5, 7, 5, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 5, 7, 5, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "%", + "right" : { + "kind" : "Identifier", + "location" : [ 5, 11, 5, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_div_mod.py.ast.typed.s.result b/src/test/data/pa3/sample/op_div_mod.py.ast.typed.s.result new file mode 100644 index 0000000..cfbeb15 --- /dev/null +++ b/src/test/data/pa3/sample/op_div_mod.py.ast.typed.s.result @@ -0,0 +1,2 @@ +4 +6 diff --git a/src/test/data/pa3/sample/op_is.py b/src/test/data/pa3/sample/op_is.py new file mode 100644 index 0000000..4207f29 --- /dev/null +++ b/src/test/data/pa3/sample/op_is.py @@ -0,0 +1,19 @@ +class A(object): + a:int = 42 + +a1:A = None +a2:A = None +a3:A = None +a4:A = None + +a1 = A() +a2 = a1 +a3 = A() + +print(a1 is a1) +print(a1 is a2) +print(a1 is a3) +print(a1 is a4) +print(a1 is None) +print(a4 is None) +print(None is None) diff --git a/src/test/data/pa3/sample/op_is.py.ast.typed b/src/test/data/pa3/sample/op_is.py.ast.typed new file mode 100644 index 0000000..962be5e --- /dev/null +++ b/src/test/data/pa3/sample/op_is.py.ast.typed @@ -0,0 +1,598 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 19, 20 ], + "declarations" : [ { + "kind" : "ClassDef", + "location" : [ 1, 1, 2, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 7 ], + "name" : "A" + }, + "superClass" : { + "kind" : "Identifier", + "location" : [ 1, 9, 1, 14 ], + "name" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ] + }, { + "kind" : "VarDef", + "location" : [ 4, 1, 4, 11 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 1, 4, 4 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 2 ], + "name" : "a1" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 4, 4, 4 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 4, 8, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 5, 1, 5, 11 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 1, 5, 4 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 2 ], + "name" : "a2" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 4, 5, 4 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 5, 8, 5, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 6, 1, 6, 11 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 6, 1, 6, 4 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 2 ], + "name" : "a3" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 6, 4, 6, 4 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 6, 8, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 7, 1, 7, 11 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 7, 1, 7, 4 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 2 ], + "name" : "a4" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 4, 7, 4 ], + "className" : "A" + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 7, 8, 7, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 9, 1, 9, 8 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 9, 1, 9, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a1" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 9, 6, 9, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 6, 9, 6 ], + "name" : "A" + }, + "args" : [ ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 10, 1, 10, 7 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 10, 1, 10, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a2" + } ], + "value" : { + "kind" : "Identifier", + "location" : [ 10, 6, 10, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a1" + } + }, { + "kind" : "AssignStmt", + "location" : [ 11, 1, 11, 8 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 2 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a3" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 11, 6, 11, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 6, 11, 6 ], + "name" : "A" + }, + "args" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 13, 1, 13, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 13, 1, 13, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 13, 7, 13, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 13, 7, 13, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a1" + }, + "operator" : "is", + "right" : { + "kind" : "Identifier", + "location" : [ 13, 13, 13, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a1" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 14, 7, 14, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a1" + }, + "operator" : "is", + "right" : { + "kind" : "Identifier", + "location" : [ 14, 13, 14, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a2" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 15, 1, 15, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 15, 1, 15, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 15, 7, 15, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 15, 7, 15, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a1" + }, + "operator" : "is", + "right" : { + "kind" : "Identifier", + "location" : [ 15, 13, 15, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a3" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 16, 1, 16, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 16, 1, 16, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 16, 7, 16, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a1" + }, + "operator" : "is", + "right" : { + "kind" : "Identifier", + "location" : [ 16, 13, 16, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a4" + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 17, 1, 17, 17 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 17, 1, 17, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 17, 1, 17, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 17, 7, 17, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 17, 7, 17, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a1" + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 17, 13, 17, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 18, 1, 18, 17 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 18, 1, 18, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 18, 1, 18, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 18, 7, 18, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 18, 7, 18, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "A" + }, + "name" : "a4" + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 18, 13, 18, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 19, 1, 19, 19 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 19, 1, 19, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 1, 19, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 19, 7, 19, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "NoneLiteral", + "location" : [ 19, 7, 19, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 19, 15, 19, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_is.py.ast.typed.s.result b/src/test/data/pa3/sample/op_is.py.ast.typed.s.result new file mode 100644 index 0000000..0ac4f5b --- /dev/null +++ b/src/test/data/pa3/sample/op_is.py.ast.typed.s.result @@ -0,0 +1,7 @@ +True +True +False +False +False +True +True diff --git a/src/test/data/pa3/sample/op_logical.py b/src/test/data/pa3/sample/op_logical.py new file mode 100644 index 0000000..7b55262 --- /dev/null +++ b/src/test/data/pa3/sample/op_logical.py @@ -0,0 +1,13 @@ +def f() -> bool: + print("f called") + return True + +def g() -> bool: + print("g called") + return False + +if f() or g(): # Short-circuit + if g() and f(): # Short-circuit + print("Never") + else: + print(not (f() and (g() or f()))) diff --git a/src/test/data/pa3/sample/op_logical.py.ast.typed b/src/test/data/pa3/sample/op_logical.py.ast.typed new file mode 100644 index 0000000..4aa1544 --- /dev/null +++ b/src/test/data/pa3/sample/op_logical.py.ast.typed @@ -0,0 +1,411 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 14, 2 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 1, 1, 3, 14 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 5, 1, 5 ], + "name" : "f" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 1, 12, 1, 15 ], + "className" : "bool" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 2, 3, 2, 19 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 3, 2, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 3, 2, 7 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "f called" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 3, 3, 3, 13 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 3, 10, 3, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 5, 1, 7, 15 ], + "name" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "name" : "g" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 5, 12, 5, 15 ], + "className" : "bool" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 6, 3, 6, 19 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 3, 6, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 3, 6, 7 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 6, 9, 6, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "g called" + } ] + } + }, { + "kind" : "ReturnStmt", + "location" : [ 7, 3, 7, 14 ], + "value" : { + "kind" : "BooleanLiteral", + "location" : [ 7, 10, 7, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + } + } ] + } ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 9, 1, 14, 2 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 9, 4, 9, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "CallExpr", + "location" : [ 9, 4, 9, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 4, 9, 4 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "f" + }, + "args" : [ ] + }, + "operator" : "or", + "right" : { + "kind" : "CallExpr", + "location" : [ 9, 11, 9, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 11, 9, 11 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "g" + }, + "args" : [ ] + } + }, + "thenBody" : [ { + "kind" : "IfStmt", + "location" : [ 10, 3, 14, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 10, 6, 10, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "CallExpr", + "location" : [ 10, 6, 10, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 10, 6, 10, 6 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "g" + }, + "args" : [ ] + }, + "operator" : "and", + "right" : { + "kind" : "CallExpr", + "location" : [ 10, 14, 10, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 10, 14, 10, 14 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "f" + }, + "args" : [ ] + } + }, + "thenBody" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 5, 11, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 5, 11, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 5, 11, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 11, 11, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Never" + } ] + } + } ], + "elseBody" : [ { + "kind" : "ExprStmt", + "location" : [ 13, 5, 13, 37 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 13, 5, 13, 37 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "UnaryExpr", + "location" : [ 13, 11, 13, 36 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "operator" : "not", + "operand" : { + "kind" : "BinaryExpr", + "location" : [ 13, 16, 13, 35 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "CallExpr", + "location" : [ 13, 16, 13, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 16, 13, 16 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "f" + }, + "args" : [ ] + }, + "operator" : "and", + "right" : { + "kind" : "BinaryExpr", + "location" : [ 13, 25, 13, 34 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "CallExpr", + "location" : [ 13, 25, 13, 27 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 25, 13, 25 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "g" + }, + "args" : [ ] + }, + "operator" : "or", + "right" : { + "kind" : "CallExpr", + "location" : [ 13, 32, 13, 34 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 32, 13, 32 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "f" + }, + "args" : [ ] + } + } + } + } ] + } + } ] + } ], + "elseBody" : [ ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_logical.py.ast.typed.s.result b/src/test/data/pa3/sample/op_logical.py.ast.typed.s.result new file mode 100644 index 0000000..82c1ab2 --- /dev/null +++ b/src/test/data/pa3/sample/op_logical.py.ast.typed.s.result @@ -0,0 +1,6 @@ +f called +g called +f called +g called +f called +False diff --git a/src/test/data/pa3/sample/op_mul.py b/src/test/data/pa3/sample/op_mul.py new file mode 100644 index 0000000..cf6201d --- /dev/null +++ b/src/test/data/pa3/sample/op_mul.py @@ -0,0 +1 @@ +print(6*9*2) diff --git a/src/test/data/pa3/sample/op_mul.py.ast.typed b/src/test/data/pa3/sample/op_mul.py.ast.typed new file mode 100644 index 0000000..6ed26cc --- /dev/null +++ b/src/test/data/pa3/sample/op_mul.py.ast.typed @@ -0,0 +1,83 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 13 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 1, 7, 1, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 1, 7, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 7, 1, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 6 + }, + "operator" : "*", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 9 + } + }, + "operator" : "*", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 11, 1, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_mul.py.ast.typed.s.result b/src/test/data/pa3/sample/op_mul.py.ast.typed.s.result new file mode 100644 index 0000000..3b20426 --- /dev/null +++ b/src/test/data/pa3/sample/op_mul.py.ast.typed.s.result @@ -0,0 +1 @@ +108 diff --git a/src/test/data/pa3/sample/op_negate.py b/src/test/data/pa3/sample/op_negate.py new file mode 100644 index 0000000..0f3b2be --- /dev/null +++ b/src/test/data/pa3/sample/op_negate.py @@ -0,0 +1,2 @@ +x:int = 42 +print(-x) diff --git a/src/test/data/pa3/sample/op_negate.py.ast.typed b/src/test/data/pa3/sample/op_negate.py.ast.typed new file mode 100644 index 0000000..4268b3b --- /dev/null +++ b/src/test/data/pa3/sample/op_negate.py.ast.typed @@ -0,0 +1,82 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 2, 10 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 2, 1, 2, 9 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 1, 2, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "UnaryExpr", + "location" : [ 2, 7, 2, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "operator" : "-", + "operand" : { + "kind" : "Identifier", + "location" : [ 2, 8, 2, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_negate.py.ast.typed.s.result b/src/test/data/pa3/sample/op_negate.py.ast.typed.s.result new file mode 100644 index 0000000..6a0e60d --- /dev/null +++ b/src/test/data/pa3/sample/op_negate.py.ast.typed.s.result @@ -0,0 +1 @@ +-42 diff --git a/src/test/data/pa3/sample/op_sub.py b/src/test/data/pa3/sample/op_sub.py new file mode 100644 index 0000000..48aa45b --- /dev/null +++ b/src/test/data/pa3/sample/op_sub.py @@ -0,0 +1 @@ +print(1 - 100) diff --git a/src/test/data/pa3/sample/op_sub.py.ast.typed b/src/test/data/pa3/sample/op_sub.py.ast.typed new file mode 100644 index 0000000..2c927e8 --- /dev/null +++ b/src/test/data/pa3/sample/op_sub.py.ast.typed @@ -0,0 +1,65 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 15 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 14 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 1, 7, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 7, 1, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, + "operator" : "-", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 11, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 100 + } + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/op_sub.py.ast.typed.s.result b/src/test/data/pa3/sample/op_sub.py.ast.typed.s.result new file mode 100644 index 0000000..d3a0ef5 --- /dev/null +++ b/src/test/data/pa3/sample/op_sub.py.ast.typed.s.result @@ -0,0 +1 @@ +-99 diff --git a/src/test/data/pa3/sample/pass.py b/src/test/data/pa3/sample/pass.py new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/src/test/data/pa3/sample/pass.py @@ -0,0 +1 @@ +pass diff --git a/src/test/data/pa3/sample/pass.py.ast.typed b/src/test/data/pa3/sample/pass.py.ast.typed new file mode 100644 index 0000000..ceb0bbd --- /dev/null +++ b/src/test/data/pa3/sample/pass.py.ast.typed @@ -0,0 +1,11 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 5 ], + "declarations" : [ ], + "statements" : [ ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/pass.py.ast.typed.s.result b/src/test/data/pa3/sample/pass.py.ast.typed.s.result new file mode 100644 index 0000000..e69de29 diff --git a/src/test/data/pa3/sample/predef_constructors.py b/src/test/data/pa3/sample/predef_constructors.py new file mode 100644 index 0000000..0086564 --- /dev/null +++ b/src/test/data/pa3/sample/predef_constructors.py @@ -0,0 +1,4 @@ +print(object() is None) +print(int()) +print(str()) +print(bool()) diff --git a/src/test/data/pa3/sample/predef_constructors.py.ast.typed b/src/test/data/pa3/sample/predef_constructors.py.ast.typed new file mode 100644 index 0000000..3644f24 --- /dev/null +++ b/src/test/data/pa3/sample/predef_constructors.py.ast.typed @@ -0,0 +1,192 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 14 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 23 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 1, 7, 1, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "CallExpr", + "location" : [ 1, 7, 1, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 12 ], + "name" : "object" + }, + "args" : [ ] + }, + "operator" : "is", + "right" : { + "kind" : "NoneLiteral", + "location" : [ 1, 19, 1, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 2, 1, 2, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 1, 2, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 2, 7, 2, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 7, 2, 9 ], + "name" : "int" + }, + "args" : [ ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 3, 1, 3, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 3, 1, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 3, 7, 3, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 7, 3, 9 ], + "name" : "str" + }, + "args" : [ ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 4, 7, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 10 ], + "name" : "bool" + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/predef_constructors.py.ast.typed.s.result b/src/test/data/pa3/sample/predef_constructors.py.ast.typed.s.result new file mode 100644 index 0000000..8add9b0 --- /dev/null +++ b/src/test/data/pa3/sample/predef_constructors.py.ast.typed.s.result @@ -0,0 +1,4 @@ +False +0 + +False diff --git a/src/test/data/pa3/sample/stmt_for_list.py b/src/test/data/pa3/sample/stmt_for_list.py new file mode 100644 index 0000000..78c5c00 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list.py @@ -0,0 +1,7 @@ +x:int = 0 +z:[int] = None + +z = [1, 2, 3] + +for x in z: + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_list.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list.py.ast.typed new file mode 100644 index 0000000..53d6834 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list.py.ast.typed @@ -0,0 +1,178 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 8, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 2, 3, 2, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 2, 4, 2, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 2, 11, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 4, 1, 4, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 4, 5, 4, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 4, 6, 4, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 9, 4, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 12, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ForStmt", + "location" : [ 6, 1, 8, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 6, 5, 6, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 6, 10, 6, 10 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 7, 5, 7, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 7, 5, 7, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 7, 11, 7, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list.py.ast.typed.s.result new file mode 100644 index 0000000..01e79c3 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list.py.ast.typed.s.result @@ -0,0 +1,3 @@ +1 +2 +3 diff --git a/src/test/data/pa3/sample/stmt_for_list_empty.py b/src/test/data/pa3/sample/stmt_for_list_empty.py new file mode 100644 index 0000000..23fba4a --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_empty.py @@ -0,0 +1,12 @@ +x:int = 0 +y:int = 0 +z:[int] = None +e:[int] = None + +z = [1,2,3] +e = [] + +for x in z: + for y in e: + print("Never") + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_list_empty.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list_empty.py.ast.typed new file mode 100644 index 0000000..ca4160c --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_empty.py.ast.typed @@ -0,0 +1,318 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 13, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 9, 2, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 3, 3, 3, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 3, 4, 3, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 3, 11, 3, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "VarDef", + "location" : [ 4, 1, 4, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 1, 4, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "name" : "e" + }, + "type" : { + "kind" : "ListType", + "location" : [ 4, 3, 4, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 4, 4, 4, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 4, 11, 4, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 6, 1, 6, 11 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 6, 5, 6, 11 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 6, 6, 6, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 6, 8, 6, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 6, 10, 6, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 7, 1, 7, 6 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "e" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 7, 5, 7, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<Empty>" + }, + "elements" : [ ] + } + }, { + "kind" : "ForStmt", + "location" : [ 9, 1, 13, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 9, 5, 9, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 9, 10, 9, 10 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ForStmt", + "location" : [ 10, 5, 12, 4 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 9, 10, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 10, 14, 10, 14 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "e" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 9, 11, 22 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 9, 11, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 11, 15, 11, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Never" + } ] + } + } ] + }, { + "kind" : "ExprStmt", + "location" : [ 12, 5, 12, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 12, 5, 12, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 5, 12, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 12, 11, 12, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list_empty.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list_empty.py.ast.typed.s.result new file mode 100644 index 0000000..01e79c3 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_empty.py.ast.typed.s.result @@ -0,0 +1,3 @@ +1 +2 +3 diff --git a/src/test/data/pa3/sample/stmt_for_list_eval.py b/src/test/data/pa3/sample/stmt_for_list_eval.py new file mode 100644 index 0000000..a77b171 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_eval.py @@ -0,0 +1,8 @@ +x:int = 0 +z:[int] = None + +z = [1, 2, 3] + +for x in z: + z = [] + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_list_eval.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list_eval.py.ast.typed new file mode 100644 index 0000000..c86d718 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_eval.py.ast.typed @@ -0,0 +1,202 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 9, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 2, 3, 2, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 2, 4, 2, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 2, 11, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 4, 1, 4, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 4, 5, 4, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 4, 6, 4, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 9, 4, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 12, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ForStmt", + "location" : [ 6, 1, 9, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 6, 5, 6, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 6, 10, 6, 10 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 5, 7, 10 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 5 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 7, 9, 7, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<Empty>" + }, + "elements" : [ ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 8, 5, 8, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 5, 8, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 8, 11, 8, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list_eval.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list_eval.py.ast.typed.s.result new file mode 100644 index 0000000..01e79c3 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_eval.py.ast.typed.s.result @@ -0,0 +1,3 @@ +1 +2 +3 diff --git a/src/test/data/pa3/sample/stmt_for_list_modify.py b/src/test/data/pa3/sample/stmt_for_list_modify.py new file mode 100644 index 0000000..3006cd2 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_modify.py @@ -0,0 +1,8 @@ +x:int = 0 +z:[int] = None + +z = [1, 2, 1] + +for x in z: + z[x] = x + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_list_modify.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list_modify.py.ast.typed new file mode 100644 index 0000000..fa19b60 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_modify.py.ast.typed @@ -0,0 +1,219 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 9, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 2, 3, 2, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 2, 4, 2, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 2, 11, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 4, 1, 4, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 4, 5, 4, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 4, 6, 4, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 9, 4, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 4, 12, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } ] + } + }, { + "kind" : "ForStmt", + "location" : [ 6, 1, 9, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 6, 5, 6, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 6, 10, 6, 10 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 5, 7, 12 ], + "targets" : [ { + "kind" : "IndexExpr", + "location" : [ 7, 5, 7, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 5 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "index" : { + "kind" : "Identifier", + "location" : [ 7, 7, 7, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + } ], + "value" : { + "kind" : "Identifier", + "location" : [ 7, 12, 7, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } + }, { + "kind" : "ExprStmt", + "location" : [ 8, 5, 8, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 5, 8, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 8, 11, 8, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list_modify.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list_modify.py.ast.typed.s.result new file mode 100644 index 0000000..e8183f0 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_modify.py.ast.typed.s.result @@ -0,0 +1,3 @@ +1 +1 +1 diff --git a/src/test/data/pa3/sample/stmt_for_list_nested.py b/src/test/data/pa3/sample/stmt_for_list_nested.py new file mode 100644 index 0000000..b69f3f0 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nested.py @@ -0,0 +1,9 @@ +x:int = 0 +y:int = 0 +z:[int] = None + +z = [1, 2, 3] + +for x in z: + for y in z: + print(x * y) diff --git a/src/test/data/pa3/sample/stmt_for_list_nested.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list_nested.py.ast.typed new file mode 100644 index 0000000..0521e4a --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nested.py.ast.typed @@ -0,0 +1,247 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 10, 2 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 9, 2, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 3, 3, 3, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 3, 4, 3, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 3, 11, 3, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 5, 1, 5, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 5, 5, 5, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 5, 6, 5, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 5, 9, 5, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 5, 12, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ForStmt", + "location" : [ 7, 1, 10, 2 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 7, 10, 7, 10 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ForStmt", + "location" : [ 8, 5, 10, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 8, 14, 8, 14 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 9, 9, 9, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 9, 9, 9, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 9, 9, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "BinaryExpr", + "location" : [ 9, 15, 9, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 9, 15, 9, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "*", + "right" : { + "kind" : "Identifier", + "location" : [ 9, 19, 9, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "y" + } + } ] + } + } ] + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list_nested.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list_nested.py.ast.typed.s.result new file mode 100644 index 0000000..0d1fb9e --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nested.py.ast.typed.s.result @@ -0,0 +1,9 @@ +1 +2 +3 +2 +4 +6 +3 +6 +9 diff --git a/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py b/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py new file mode 100644 index 0000000..0057164 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py @@ -0,0 +1,9 @@ +x:int = 0 +y:int = 0 +z:[int] = None + +z = [1, 2, 3] + +for x in z: + for x in z: + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py.ast.typed new file mode 100644 index 0000000..2feac51 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py.ast.typed @@ -0,0 +1,229 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 10, 2 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 9, 2, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 3, 3, 3, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 3, 4, 3, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 3, 11, 3, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 5, 1, 5, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 1 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + } ], + "value" : { + "kind" : "ListExpr", + "location" : [ 5, 5, 5, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 5, 6, 5, 6 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 5, 9, 5, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 5, 12, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ForStmt", + "location" : [ 7, 1, 10, 2 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 7, 10, 7, 10 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ForStmt", + "location" : [ 8, 5, 10, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 8, 14, 8, 14 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 9, 9, 9, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 9, 9, 9, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 9, 9, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 9, 15, 9, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py.ast.typed.s.result new file mode 100644 index 0000000..a8401b1 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nested_same_var.py.ast.typed.s.result @@ -0,0 +1,9 @@ +1 +2 +3 +1 +2 +3 +1 +2 +3 diff --git a/src/test/data/pa3/sample/stmt_for_list_none.py b/src/test/data/pa3/sample/stmt_for_list_none.py new file mode 100644 index 0000000..fd511fa --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_none.py @@ -0,0 +1,5 @@ +x:int = 0 +z:[int] = None + +for x in z: + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_list_none.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list_none.py.ast.typed new file mode 100644 index 0000000..00acc08 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_none.py.ast.typed @@ -0,0 +1,127 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 6, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 14 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 7 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 2, 3, 2, 7 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 2, 4, 2, 6 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 2, 11, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 4, 1, 6, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 4, 10, 4, 10 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 5, 5, 5, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 5, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 5, 11, 5, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list_none.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list_none.py.ast.typed.s.result new file mode 100644 index 0000000..ae52477 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_none.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Operation on None +Exited with error code 4 diff --git a/src/test/data/pa3/sample/stmt_for_list_nonlocal.py b/src/test/data/pa3/sample/stmt_for_list_nonlocal.py new file mode 100644 index 0000000..e9b54a2 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nonlocal.py @@ -0,0 +1,15 @@ +x:int = 0 +def crunch(zz:[[int]]) -> object: + z:[int] = None + global x + def make_z() -> object: + nonlocal z + for z in zz: + pass # Set z to last element in zz + + make_z() + for x in z: + pass # Set x to last element in z + +crunch([[1,2],[2,3],[4,5],[6,7]]) +print(x) diff --git a/src/test/data/pa3/sample/stmt_for_list_nonlocal.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list_nonlocal.py.ast.typed new file mode 100644 index 0000000..2c686f8 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nonlocal.py.ast.typed @@ -0,0 +1,408 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 15, 10 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "FuncDef", + "location" : [ 2, 1, 14, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 10 ], + "name" : "crunch" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 2, 12, 2, 21 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 12, 2, 13 ], + "name" : "zz" + }, + "type" : { + "kind" : "ListType", + "location" : [ 2, 15, 2, 21 ], + "elementType" : { + "kind" : "ListType", + "location" : [ 2, 16, 2, 20 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 2, 17, 2, 19 ], + "className" : "int" + } + } + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 2, 27, 2, 32 ], + "className" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 3, 5, 3, 18 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 5, 3, 11 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 5 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 3, 7, 3, 11 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 3, 8, 3, 10 ], + "className" : "int" + } + } + }, + "value" : { + "kind" : "NoneLiteral", + "location" : [ 3, 15, 3, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + } + }, { + "kind" : "GlobalDecl", + "location" : [ 4, 5, 4, 12 ], + "variable" : { + "kind" : "Identifier", + "location" : [ 4, 12, 4, 12 ], + "name" : "x" + } + }, { + "kind" : "FuncDef", + "location" : [ 5, 5, 10, 4 ], + "name" : { + "kind" : "Identifier", + "location" : [ 5, 9, 5, 14 ], + "name" : "make_z" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 5, 21, 5, 26 ], + "className" : "object" + }, + "declarations" : [ { + "kind" : "NonLocalDecl", + "location" : [ 6, 9, 6, 18 ], + "variable" : { + "kind" : "Identifier", + "location" : [ 6, 18, 6, 18 ], + "name" : "z" + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 7, 9, 10, 4 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 13, 7, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 7, 18, 7, 19 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + } + }, + "name" : "zz" + }, + "body" : [ ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 10, 5, 10, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 10, 5, 10, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 10, 5, 10, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "name" : "make_z" + }, + "args" : [ ] + } + }, { + "kind" : "ForStmt", + "location" : [ 11, 5, 14, 0 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 11, 9, 11, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 11, 14, 11, 14 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 33 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 33 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 6 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + } + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "name" : "crunch" + }, + "args" : [ { + "kind" : "ListExpr", + "location" : [ 14, 8, 14, 32 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + } + }, + "elements" : [ { + "kind" : "ListExpr", + "location" : [ 14, 9, 14, 13 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 14, 10, 14, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + }, { + "kind" : "IntegerLiteral", + "location" : [ 14, 12, 14, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } ] + }, { + "kind" : "ListExpr", + "location" : [ 14, 15, 14, 19 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 14, 16, 14, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + }, { + "kind" : "IntegerLiteral", + "location" : [ 14, 18, 14, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + }, { + "kind" : "ListExpr", + "location" : [ 14, 21, 14, 25 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 14, 22, 14, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 4 + }, { + "kind" : "IntegerLiteral", + "location" : [ 14, 24, 14, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 5 + } ] + }, { + "kind" : "ListExpr", + "location" : [ 14, 27, 14, 31 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 14, 28, 14, 28 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 6 + }, { + "kind" : "IntegerLiteral", + "location" : [ 14, 30, 14, 30 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 7 + } ] + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 15, 1, 15, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 15, 1, 15, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 15, 7, 15, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list_nonlocal.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list_nonlocal.py.ast.typed.s.result new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_nonlocal.py.ast.typed.s.result @@ -0,0 +1 @@ +7 diff --git a/src/test/data/pa3/sample/stmt_for_list_return.py b/src/test/data/pa3/sample/stmt_for_list_return.py new file mode 100644 index 0000000..35716dd --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_return.py @@ -0,0 +1,8 @@ +def print_list(z:[int]) -> object: + x:int = 0 + for x in z: + print(x) + if x >= 30: + return + +print_list([10,20,30,40]) diff --git a/src/test/data/pa3/sample/stmt_for_list_return.py.ast.typed b/src/test/data/pa3/sample/stmt_for_list_return.py.ast.typed new file mode 100644 index 0000000..4fca85f --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_return.py.ast.typed @@ -0,0 +1,241 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 8, 26 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 1, 1, 8, 0 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 5, 1, 14 ], + "name" : "print_list" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 1, 16, 1, 22 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 16, 1, 16 ], + "name" : "z" + }, + "type" : { + "kind" : "ListType", + "location" : [ 1, 18, 1, 22 ], + "elementType" : { + "kind" : "ClassType", + "location" : [ 1, 19, 1, 21 ], + "className" : "int" + } + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 1, 28, 1, 33 ], + "className" : "object" + }, + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 2, 5, 2, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 5, 2, 9 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 5 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 7, 2, 9 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 13, 2, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 3, 5, 8, 0 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 9, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 3, 14, 3, 14 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 4, 9, 4, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 9, 4, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 4, 15, 4, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + }, { + "kind" : "IfStmt", + "location" : [ 5, 9, 8, 0 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 5, 12, 5, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 5, 12, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : ">=", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 5, 17, 5, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 30 + } + }, + "thenBody" : [ { + "kind" : "ReturnStmt", + "location" : [ 6, 13, 6, 18 ], + "value" : null + } ], + "elseBody" : [ ] + } ] + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 1, 8, 25 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 1, 8, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 1, 8, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "object" + } + }, + "name" : "print_list" + }, + "args" : [ { + "kind" : "ListExpr", + "location" : [ 8, 12, 8, 24 ], + "inferredType" : { + "kind" : "ListValueType", + "elementType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "elements" : [ { + "kind" : "IntegerLiteral", + "location" : [ 8, 13, 8, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 10 + }, { + "kind" : "IntegerLiteral", + "location" : [ 8, 16, 8, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 20 + }, { + "kind" : "IntegerLiteral", + "location" : [ 8, 19, 8, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 30 + }, { + "kind" : "IntegerLiteral", + "location" : [ 8, 22, 8, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 40 + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_list_return.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_list_return.py.ast.typed.s.result new file mode 100644 index 0000000..300ed6f --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_list_return.py.ast.typed.s.result @@ -0,0 +1,3 @@ +10 +20 +30 diff --git a/src/test/data/pa3/sample/stmt_for_str.py b/src/test/data/pa3/sample/stmt_for_str.py new file mode 100644 index 0000000..c3ab74f --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str.py @@ -0,0 +1,5 @@ +x:str = "" +z:str = "abc" + +for x in z: + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_str.py.ast.typed b/src/test/data/pa3/sample/stmt_for_str.py.ast.typed new file mode 100644 index 0000000..4b0e583 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str.py.ast.typed @@ -0,0 +1,121 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 6, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "abc" + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 4, 1, 6, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 4, 10, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 5, 5, 5, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 5, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 5, 11, 5, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + } ] + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_str.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_str.py.ast.typed.s.result new file mode 100644 index 0000000..de98044 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str.py.ast.typed.s.result @@ -0,0 +1,3 @@ +a +b +c diff --git a/src/test/data/pa3/sample/stmt_for_str_empty.py b/src/test/data/pa3/sample/stmt_for_str_empty.py new file mode 100644 index 0000000..9dc60e7 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_empty.py @@ -0,0 +1,8 @@ +x:str = "" +y:str = "123" +z:str = "abc" + +for x in z: + print(x) + for x in "": + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_str_empty.py.ast.typed b/src/test/data/pa3/sample/stmt_for_str_empty.py.ast.typed new file mode 100644 index 0000000..9be591f --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_empty.py.ast.typed @@ -0,0 +1,205 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 9, 2 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "123" + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 3, 3, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 3, 9, 3, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "abc" + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 5, 1, 9, 2 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 5, 10, 5, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 6, 5, 6, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 5, 6, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 5, 6, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 6, 11, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + } ] + } + }, { + "kind" : "ForStmt", + "location" : [ 7, 5, 9, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "StringLiteral", + "location" : [ 7, 14, 7, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 9, 8, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 9, 8, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 8, 15, 8, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + } ] + } + } ] + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_str_empty.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_str_empty.py.ast.typed.s.result new file mode 100644 index 0000000..de98044 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_empty.py.ast.typed.s.result @@ -0,0 +1,3 @@ +a +b +c diff --git a/src/test/data/pa3/sample/stmt_for_str_eval.py b/src/test/data/pa3/sample/stmt_for_str_eval.py new file mode 100644 index 0000000..69c2ea9 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_eval.py @@ -0,0 +1,6 @@ +x:str = "" +z:str = "abc" + +for x in z: + z = "doesn't matter" + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_str_eval.py.ast.typed b/src/test/data/pa3/sample/stmt_for_str_eval.py.ast.typed new file mode 100644 index 0000000..1e64270 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_eval.py.ast.typed @@ -0,0 +1,142 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 7, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "abc" + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 4, 1, 7, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 4, 10, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "z" + }, + "body" : [ { + "kind" : "AssignStmt", + "location" : [ 5, 5, 5, 24 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "z" + } ], + "value" : { + "kind" : "StringLiteral", + "location" : [ 5, 9, 5, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "doesn't matter" + } + }, { + "kind" : "ExprStmt", + "location" : [ 6, 5, 6, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 5, 6, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 5, 6, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 6, 11, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + } ] + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_str_eval.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_str_eval.py.ast.typed.s.result new file mode 100644 index 0000000..de98044 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_eval.py.ast.typed.s.result @@ -0,0 +1,3 @@ +a +b +c diff --git a/src/test/data/pa3/sample/stmt_for_str_nested.py b/src/test/data/pa3/sample/stmt_for_str_nested.py new file mode 100644 index 0000000..81f0f46 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_nested.py @@ -0,0 +1,8 @@ +x:str = "" +y:str = "123" +z:str = "abc" + +for x in z: + print(x) + for x in y: + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_str_nested.py.ast.typed b/src/test/data/pa3/sample/stmt_for_str_nested.py.ast.typed new file mode 100644 index 0000000..5260c3b --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_nested.py.ast.typed @@ -0,0 +1,205 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 9, 2 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "123" + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "z" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 3, 3, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 3, 9, 3, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "abc" + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 5, 1, 9, 2 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 5, 10, 5, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "z" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 6, 5, 6, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 5, 6, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 5, 6, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 6, 11, 6, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + } ] + } + }, { + "kind" : "ForStmt", + "location" : [ 7, 5, 9, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 9, 7, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 7, 14, 7, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "y" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 8, 9, 8, 16 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 9, 8, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 8, 15, 8, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + } ] + } + } ] + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_str_nested.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_str_nested.py.ast.typed.s.result new file mode 100644 index 0000000..c2cb64d --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_nested.py.ast.typed.s.result @@ -0,0 +1,12 @@ +a +1 +2 +3 +b +1 +2 +3 +c +1 +2 +3 diff --git a/src/test/data/pa3/sample/stmt_for_str_same_var.py b/src/test/data/pa3/sample/stmt_for_str_same_var.py new file mode 100644 index 0000000..438c74e --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_same_var.py @@ -0,0 +1,4 @@ +x:str = "xXx" + +for x in x: + print(x) diff --git a/src/test/data/pa3/sample/stmt_for_str_same_var.py.ast.typed b/src/test/data/pa3/sample/stmt_for_str_same_var.py.ast.typed new file mode 100644 index 0000000..e3870ec --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_same_var.py.ast.typed @@ -0,0 +1,95 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 5, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "xXx" + } + } ], + "statements" : [ { + "kind" : "ForStmt", + "location" : [ 3, 1, 5, 1 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "iterable" : { + "kind" : "Identifier", + "location" : [ 3, 10, 3, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 4, 5, 4, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 5, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 4, 11, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + } ] + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_for_str_same_var.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_for_str_same_var.py.ast.typed.s.result new file mode 100644 index 0000000..723425f --- /dev/null +++ b/src/test/data/pa3/sample/stmt_for_str_same_var.py.ast.typed.s.result @@ -0,0 +1,3 @@ +x +X +x diff --git a/src/test/data/pa3/sample/stmt_if.py b/src/test/data/pa3/sample/stmt_if.py new file mode 100644 index 0000000..61bc605 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_if.py @@ -0,0 +1,7 @@ +if False: + print("No") +elif True: + if True: + print("Yes") +else: + pass diff --git a/src/test/data/pa3/sample/stmt_if.py.ast.typed b/src/test/data/pa3/sample/stmt_if.py.ast.typed new file mode 100644 index 0000000..0b67124 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_if.py.ast.typed @@ -0,0 +1,125 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 8, 1 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "IfStmt", + "location" : [ 1, 1, 8, 1 ], + "condition" : { + "kind" : "BooleanLiteral", + "location" : [ 1, 4, 1, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : false + }, + "thenBody" : [ { + "kind" : "ExprStmt", + "location" : [ 2, 5, 2, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 2, 5, 2, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 2, 5, 2, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 2, 11, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "No" + } ] + } + } ], + "elseBody" : [ { + "kind" : "IfStmt", + "location" : [ 3, 1, 8, 1 ], + "condition" : { + "kind" : "BooleanLiteral", + "location" : [ 3, 6, 3, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "thenBody" : [ { + "kind" : "IfStmt", + "location" : [ 4, 5, 6, 0 ], + "condition" : { + "kind" : "BooleanLiteral", + "location" : [ 4, 8, 4, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "thenBody" : [ { + "kind" : "ExprStmt", + "location" : [ 5, 9, 5, 20 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 5, 9, 5, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 5, 9, 5, 13 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 5, 15, 5, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Yes" + } ] + } + } ], + "elseBody" : [ ] + } ], + "elseBody" : [ ] + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_if.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_if.py.ast.typed.s.result new file mode 100644 index 0000000..dcd7a5d --- /dev/null +++ b/src/test/data/pa3/sample/stmt_if.py.ast.typed.s.result @@ -0,0 +1 @@ +Yes diff --git a/src/test/data/pa3/sample/stmt_return_early.py b/src/test/data/pa3/sample/stmt_return_early.py new file mode 100644 index 0000000..267eab7 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_return_early.py @@ -0,0 +1,6 @@ +def f() -> int: + while True: + return 1 + return 0 + +print(f()) diff --git a/src/test/data/pa3/sample/stmt_return_early.py.ast.typed b/src/test/data/pa3/sample/stmt_return_early.py.ast.typed new file mode 100644 index 0000000..4568349 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_return_early.py.ast.typed @@ -0,0 +1,113 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 6, 11 ], + "declarations" : [ { + "kind" : "FuncDef", + "location" : [ 1, 1, 4, 13 ], + "name" : { + "kind" : "Identifier", + "location" : [ 1, 5, 1, 5 ], + "name" : "f" + }, + "params" : [ ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 1, 12, 1, 14 ], + "className" : "int" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "WhileStmt", + "location" : [ 2, 5, 4, 4 ], + "condition" : { + "kind" : "BooleanLiteral", + "location" : [ 2, 11, 2, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "value" : true + }, + "body" : [ { + "kind" : "ReturnStmt", + "location" : [ 3, 9, 3, 16 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 16, 3, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + }, { + "kind" : "ReturnStmt", + "location" : [ 4, 5, 4, 12 ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 12, 4, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 6, 1, 6, 10 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 6, 1, 6, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 1, 6, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 6, 7, 6, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 6, 7, 6, 7 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "f" + }, + "args" : [ ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_return_early.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_return_early.py.ast.typed.s.result new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/src/test/data/pa3/sample/stmt_return_early.py.ast.typed.s.result @@ -0,0 +1 @@ +1 diff --git a/src/test/data/pa3/sample/stmt_while.py b/src/test/data/pa3/sample/stmt_while.py new file mode 100644 index 0000000..acb4d7a --- /dev/null +++ b/src/test/data/pa3/sample/stmt_while.py @@ -0,0 +1,4 @@ +x:int = 1 +while x < 10: + print(x) + x = x + 1 diff --git a/src/test/data/pa3/sample/stmt_while.py.ast.typed b/src/test/data/pa3/sample/stmt_while.py.ast.typed new file mode 100644 index 0000000..3802a75 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_while.py.ast.typed @@ -0,0 +1,143 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 5, 1 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "statements" : [ { + "kind" : "WhileStmt", + "location" : [ 2, 1, 5, 1 ], + "condition" : { + "kind" : "BinaryExpr", + "location" : [ 2, 7, 2, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 2, 7, 2, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "<", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 11, 2, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 10 + } + }, + "body" : [ { + "kind" : "ExprStmt", + "location" : [ 3, 5, 3, 12 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 3, 5, 3, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 3, 11, 3, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 4, 5, 4, 13 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 4, 9, 4, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 4, 9, 4, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, + "operator" : "+", + "right" : { + "kind" : "IntegerLiteral", + "location" : [ 4, 13, 4, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } + } ] + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/stmt_while.py.ast.typed.s.result b/src/test/data/pa3/sample/stmt_while.py.ast.typed.s.result new file mode 100644 index 0000000..0719398 --- /dev/null +++ b/src/test/data/pa3/sample/stmt_while.py.ast.typed.s.result @@ -0,0 +1,9 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 diff --git a/src/test/data/pa3/sample/str_cat.py b/src/test/data/pa3/sample/str_cat.py new file mode 100644 index 0000000..f28db5e --- /dev/null +++ b/src/test/data/pa3/sample/str_cat.py @@ -0,0 +1,17 @@ +a:str = "Hello" +b:str = "World" +c:str = "ChocoPy" + +def cat2(a:str, b:str) -> str: + return a + b + +def cat3(a:str, b:str, c:str) -> str: + return a + b + c + +print(cat2(a, b)) +print(cat2("", c)) +print(cat3(a, " ", c)) +print(len(a)) +print(len(cat2(a,a))) +print(len(cat2("",""))) + diff --git a/src/test/data/pa3/sample/str_cat.py.ast.typed b/src/test/data/pa3/sample/str_cat.py.ast.typed new file mode 100644 index 0000000..1db5a86 --- /dev/null +++ b/src/test/data/pa3/sample/str_cat.py.ast.typed @@ -0,0 +1,738 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 16, 24 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 15 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Hello" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 15 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "World" + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "c" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 3, 3, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 3, 9, 3, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "ChocoPy" + } + }, { + "kind" : "FuncDef", + "location" : [ 5, 1, 6, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 8 ], + "name" : "cat2" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 5, 10, 5, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 10, 5, 10 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 12, 5, 14 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 5, 17, 5, 21 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 17, 5, 17 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 19, 5, 21 ], + "className" : "str" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 5, 27, 5, 29 ], + "className" : "str" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 6, 5, 6, 16 ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 6, 12, 6, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 6, 12, 6, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 6, 16, 6, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 8, 1, 9, 21 ], + "name" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 8 ], + "name" : "cat3" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 8, 10, 8, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 10, 8, 10 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 12, 8, 14 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 8, 17, 8, 21 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 17, 8, 17 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 19, 8, 21 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 8, 24, 8, 28 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 24, 8, 24 ], + "name" : "c" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 26, 8, 28 ], + "className" : "str" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 8, 34, 8, 36 ], + "className" : "str" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 9, 5, 9, 20 ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 9, 12, 9, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 9, 12, 9, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 9, 12, 9, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 9, 16, 9, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 9, 20, 9, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + } + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 1, 11, 17 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 1, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 11, 7, 11, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 7, 11, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat2" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 11, 12, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 11, 15, 11, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 12, 1, 12, 18 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 12, 1, 12, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 1, 12, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 12, 7, 12, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 7, 12, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat2" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 12, 12, 12, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + }, { + "kind" : "Identifier", + "location" : [ 12, 16, 12, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 13, 1, 13, 22 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 13, 1, 13, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 13, 7, 13, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 7, 13, 10 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat3" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 13, 12, 13, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, { + "kind" : "StringLiteral", + "location" : [ 13, 15, 13, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : " " + }, { + "kind" : "Identifier", + "location" : [ 13, 20, 13, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 13 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 14, 7, 14, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 14, 11, 14, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 15, 1, 15, 21 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 15, 1, 15, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 15, 7, 15, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 7, 15, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 15, 11, 15, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 11, 15, 14 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat2" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 15, 16, 15, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 15, 18, 15, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 16, 1, 16, 23 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 16, 1, 16, 23 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 16, 7, 16, 22 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 16, 11, 16, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 11, 16, 14 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat2" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 16, 16, 16, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + }, { + "kind" : "StringLiteral", + "location" : [ 16, 19, 16, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } ] + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/str_cat.py.ast.typed.s.result b/src/test/data/pa3/sample/str_cat.py.ast.typed.s.result new file mode 100644 index 0000000..b2e262a --- /dev/null +++ b/src/test/data/pa3/sample/str_cat.py.ast.typed.s.result @@ -0,0 +1,6 @@ +HelloWorld +ChocoPy +Hello ChocoPy +5 +10 +0 diff --git a/src/test/data/pa3/sample/str_cat_2.py b/src/test/data/pa3/sample/str_cat_2.py new file mode 100644 index 0000000..f8367c0 --- /dev/null +++ b/src/test/data/pa3/sample/str_cat_2.py @@ -0,0 +1,19 @@ +a:str = "no" +b:str = "o" +c:str = "" +d:str = "" +e:str = "" + +def cat2(a:str, b:str) -> str: + return a + b + +def cat3(a:str, b:str, c:str) -> str: + return a + b + c + +c = cat2(b, a) +d = cat2(a, a) +e = cat3(a, b, cat2(b, b)) + +print(c) +print(d) +print(e) diff --git a/src/test/data/pa3/sample/str_cat_2.py.ast.typed b/src/test/data/pa3/sample/str_cat_2.py.ast.typed new file mode 100644 index 0000000..543fa96 --- /dev/null +++ b/src/test/data/pa3/sample/str_cat_2.py.ast.typed @@ -0,0 +1,638 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 19, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 12 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "no" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 11 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "o" + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "c" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 3, 3, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 3, 9, 3, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 4, 1, 4, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 1, 4, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "name" : "d" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 3, 4, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 4, 9, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 5, 1, 5, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 5, 1, 5, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 1, 5, 1 ], + "name" : "e" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 3, 5, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 5, 9, 5, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "FuncDef", + "location" : [ 7, 1, 8, 17 ], + "name" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 8 ], + "name" : "cat2" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 7, 10, 7, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 10, 7, 10 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 12, 7, 14 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 7, 17, 7, 21 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 7, 17, 7, 17 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 7, 19, 7, 21 ], + "className" : "str" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 7, 27, 7, 29 ], + "className" : "str" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 8, 5, 8, 16 ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 8, 12, 8, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 8, 12, 8, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 8, 16, 8, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 10, 1, 11, 21 ], + "name" : { + "kind" : "Identifier", + "location" : [ 10, 5, 10, 8 ], + "name" : "cat3" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 10, 10, 10, 14 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 10, 10, 10 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 12, 10, 14 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 10, 17, 10, 21 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 17, 10, 17 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 19, 10, 21 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 10, 24, 10, 28 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 10, 24, 10, 24 ], + "name" : "c" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 10, 26, 10, 28 ], + "className" : "str" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 10, 34, 10, 36 ], + "className" : "str" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 11, 5, 11, 20 ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 11, 12, 11, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "left" : { + "kind" : "BinaryExpr", + "location" : [ 11, 12, 11, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 11, 12, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 11, 16, 11, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } + }, + "operator" : "+", + "right" : { + "kind" : "Identifier", + "location" : [ 11, 20, 11, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + } + } + } ] + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 13, 1, 13, 14 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 13, 5, 13, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 5, 13, 8 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat2" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 13, 10, 13, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + }, { + "kind" : "Identifier", + "location" : [ 13, 13, 13, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 14, 1, 14, 14 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "d" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 14, 5, 14, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 5, 14, 8 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat2" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 14, 10, 14, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 14, 13, 14, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 15, 1, 15, 26 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "e" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 15, 5, 15, 26 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 5, 15, 8 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat3" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 15, 10, 15, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 15, 13, 15, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + }, { + "kind" : "CallExpr", + "location" : [ 15, 16, 15, 25 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 16, 15, 19 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "cat2" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 15, 21, 15, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + }, { + "kind" : "Identifier", + "location" : [ 15, 24, 15, 24 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 17, 1, 17, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 17, 1, 17, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 17, 1, 17, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 17, 7, 17, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 18, 1, 18, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 18, 1, 18, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 18, 1, 18, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 18, 7, 18, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "d" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 19, 1, 19, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 19, 1, 19, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 19, 1, 19, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 19, 7, 19, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "e" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/str_cat_2.py.ast.typed.s.result b/src/test/data/pa3/sample/str_cat_2.py.ast.typed.s.result new file mode 100644 index 0000000..2f6ff88 --- /dev/null +++ b/src/test/data/pa3/sample/str_cat_2.py.ast.typed.s.result @@ -0,0 +1,3 @@ +ono +nono +noooo diff --git a/src/test/data/pa3/sample/str_cmp.py b/src/test/data/pa3/sample/str_cmp.py new file mode 100644 index 0000000..9258cd9 --- /dev/null +++ b/src/test/data/pa3/sample/str_cmp.py @@ -0,0 +1,17 @@ +a:str = "Hello" +b:str = "World" +c:str = "ChocoPy" + +def eq(a:str, b:str) -> bool: + return a == b + +def neq(a:str, b:str) -> bool: + return a != b + +print(eq(a,a)) +print(eq(a,b)) +print(neq(a,b)) +print(neq(b,b)) +print(eq(c,a)) +print(neq(c,b)) + diff --git a/src/test/data/pa3/sample/str_cmp.py.ast.typed b/src/test/data/pa3/sample/str_cmp.py.ast.typed new file mode 100644 index 0000000..b185ac1 --- /dev/null +++ b/src/test/data/pa3/sample/str_cmp.py.ast.typed @@ -0,0 +1,659 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 16, 16 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 15 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "Hello" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 15 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "World" + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 17 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "c" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 3, 3, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 3, 9, 3, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "ChocoPy" + } + }, { + "kind" : "FuncDef", + "location" : [ 5, 1, 6, 18 ], + "name" : { + "kind" : "Identifier", + "location" : [ 5, 5, 5, 6 ], + "name" : "eq" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 5, 8, 5, 12 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 8, 5, 8 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 10, 5, 12 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 5, 15, 5, 19 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 5, 15, 5, 15 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 5, 17, 5, 19 ], + "className" : "str" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 5, 25, 5, 28 ], + "className" : "bool" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 6, 5, 6, 17 ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 6, 12, 6, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 6, 12, 6, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, + "operator" : "==", + "right" : { + "kind" : "Identifier", + "location" : [ 6, 17, 6, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } + } + } ] + }, { + "kind" : "FuncDef", + "location" : [ 8, 1, 9, 18 ], + "name" : { + "kind" : "Identifier", + "location" : [ 8, 5, 8, 7 ], + "name" : "neq" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 8, 9, 8, 13 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 9, 8, 9 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 11, 8, 13 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 8, 16, 8, 20 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 8, 16, 8, 16 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 8, 18, 8, 20 ], + "className" : "str" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 8, 26, 8, 29 ], + "className" : "bool" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 9, 5, 9, 17 ], + "value" : { + "kind" : "BinaryExpr", + "location" : [ 9, 12, 9, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "left" : { + "kind" : "Identifier", + "location" : [ 9, 12, 9, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, + "operator" : "!=", + "right" : { + "kind" : "Identifier", + "location" : [ 9, 17, 9, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } + } + } ] + } ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 11, 1, 11, 14 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 11, 1, 11, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 11, 7, 11, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 7, 11, 8 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "eq" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 11, 10, 11, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 11, 12, 11, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 12, 1, 12, 14 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 12, 1, 12, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 1, 12, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 12, 7, 12, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 7, 12, 8 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "eq" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 12, 10, 12, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 12, 12, 12, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 13, 1, 13, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 13, 1, 13, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 13, 7, 13, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 7, 13, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "neq" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 13, 11, 13, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + }, { + "kind" : "Identifier", + "location" : [ 13, 13, 13, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 14, 7, 14, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "neq" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 14, 11, 14, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + }, { + "kind" : "Identifier", + "location" : [ 14, 13, 14, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 15, 1, 15, 14 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 15, 1, 15, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 1, 15, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 15, 7, 15, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 15, 7, 15, 8 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "eq" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 15, 10, 15, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + }, { + "kind" : "Identifier", + "location" : [ 15, 12, 15, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 16, 1, 16, 15 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 16, 1, 16, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 1, 16, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 16, 7, 16, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "bool" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 16, 7, 16, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "str" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "bool" + } + }, + "name" : "neq" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 16, 11, 16, 11 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + }, { + "kind" : "Identifier", + "location" : [ 16, 13, 16, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/str_cmp.py.ast.typed.s.result b/src/test/data/pa3/sample/str_cmp.py.ast.typed.s.result new file mode 100644 index 0000000..72232fd --- /dev/null +++ b/src/test/data/pa3/sample/str_cmp.py.ast.typed.s.result @@ -0,0 +1,6 @@ +True +False +True +False +False +True diff --git a/src/test/data/pa3/sample/str_get_element.py b/src/test/data/pa3/sample/str_get_element.py new file mode 100644 index 0000000..8681a05 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element.py @@ -0,0 +1,14 @@ +x:str = "abc" +a:str = "" +b:str = "" +c:str = "" + +def str_get(s:str, i:int) -> str: + return s[i] + +a = str_get(x, 0) +b = str_get(x, 1) +c = str_get(x, 2) +print(a) +print(b) +print(c) diff --git a/src/test/data/pa3/sample/str_get_element.py.ast.typed b/src/test/data/pa3/sample/str_get_element.py.ast.typed new file mode 100644 index 0000000..ff9c449 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element.py.ast.typed @@ -0,0 +1,462 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 14, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "abc" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 3, 1, 3, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 3, 1, 3, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "name" : "b" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 3, 3, 3, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 3, 9, 3, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 4, 1, 4, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 4, 1, 4, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 1 ], + "name" : "c" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 3, 4, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 4, 9, 4, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "FuncDef", + "location" : [ 6, 1, 7, 16 ], + "name" : { + "kind" : "Identifier", + "location" : [ 6, 5, 6, 11 ], + "name" : "str_get" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 6, 13, 6, 17 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 6, 13, 6, 13 ], + "name" : "s" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 6, 15, 6, 17 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 6, 20, 6, 24 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 6, 20, 6, 20 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 6, 22, 6, 24 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 6, 30, 6, 32 ], + "className" : "str" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 7, 5, 7, 15 ], + "value" : { + "kind" : "IndexExpr", + "location" : [ 7, 12, 7, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 7, 12, 7, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "s" + }, + "index" : { + "kind" : "Identifier", + "location" : [ 7, 14, 7, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } + } + } ] + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 9, 1, 9, 17 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 9, 1, 9, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 9, 5, 9, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 9, 5, 9, 11 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "str_get" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 9, 13, 9, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, { + "kind" : "IntegerLiteral", + "location" : [ 9, 16, 9, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 10, 1, 10, 17 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 10, 1, 10, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 10, 5, 10, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 10, 5, 10, 11 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "str_get" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 10, 13, 10, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, { + "kind" : "IntegerLiteral", + "location" : [ 10, 16, 10, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } ] + } + }, { + "kind" : "AssignStmt", + "location" : [ 11, 1, 11, 17 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 11, 1, 11, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 11, 5, 11, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 11, 5, 11, 11 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "str_get" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 11, 13, 11, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, { + "kind" : "IntegerLiteral", + "location" : [ 11, 16, 11, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 2 + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 12, 1, 12, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 12, 1, 12, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 12, 1, 12, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 12, 7, 12, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 13, 1, 13, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 13, 1, 13, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 13, 1, 13, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 13, 7, 13, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "b" + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 14, 1, 14, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 14, 1, 14, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 14, 1, 14, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 14, 7, 14, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "c" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/str_get_element.py.ast.typed.s.result b/src/test/data/pa3/sample/str_get_element.py.ast.typed.s.result new file mode 100644 index 0000000..de98044 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element.py.ast.typed.s.result @@ -0,0 +1,3 @@ +a +b +c diff --git a/src/test/data/pa3/sample/str_get_element_oob_1.py b/src/test/data/pa3/sample/str_get_element_oob_1.py new file mode 100644 index 0000000..b6613d1 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_1.py @@ -0,0 +1,8 @@ +x:str = "abc" +a:str = "" + +def str_get(s:str, i:int) -> str: + return s[i] + +a = str_get(x, -1) +print(a) diff --git a/src/test/data/pa3/sample/str_get_element_oob_1.py.ast.typed b/src/test/data/pa3/sample/str_get_element_oob_1.py.ast.typed new file mode 100644 index 0000000..4ce2733 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_1.py.ast.typed @@ -0,0 +1,235 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 8, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "abc" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 1, 5, 16 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 11 ], + "name" : "str_get" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 13, 4, 17 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 13 ], + "name" : "s" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 15, 4, 17 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 4, 20, 4, 24 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 20, 4, 20 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 22, 4, 24 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 30, 4, 32 ], + "className" : "str" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 5, 5, 5, 15 ], + "value" : { + "kind" : "IndexExpr", + "location" : [ 5, 12, 5, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 5, 12, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "s" + }, + "index" : { + "kind" : "Identifier", + "location" : [ 5, 14, 5, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } + } + } ] + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 1, 7, 18 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 7, 5, 7, 18 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 11 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "str_get" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 7, 13, 7, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, { + "kind" : "UnaryExpr", + "location" : [ 7, 16, 7, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "operator" : "-", + "operand" : { + "kind" : "IntegerLiteral", + "location" : [ 7, 17, 7, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 8, 1, 8, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 1, 8, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 1, 8, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 8, 7, 8, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/str_get_element_oob_1.py.ast.typed.s.result b/src/test/data/pa3/sample/str_get_element_oob_1.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_1.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/str_get_element_oob_2.py b/src/test/data/pa3/sample/str_get_element_oob_2.py new file mode 100644 index 0000000..4c4e0e0 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_2.py @@ -0,0 +1,8 @@ +x:str = "abc" +a:str = "" + +def str_get(s:str, i:int) -> str: + return s[i] + +a = str_get(x, 3) +print(a) diff --git a/src/test/data/pa3/sample/str_get_element_oob_2.py.ast.typed b/src/test/data/pa3/sample/str_get_element_oob_2.py.ast.typed new file mode 100644 index 0000000..3a10e59 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_2.py.ast.typed @@ -0,0 +1,226 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 8, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 13 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "abc" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 1, 5, 16 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 11 ], + "name" : "str_get" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 13, 4, 17 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 13 ], + "name" : "s" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 15, 4, 17 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 4, 20, 4, 24 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 20, 4, 20 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 22, 4, 24 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 30, 4, 32 ], + "className" : "str" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 5, 5, 5, 15 ], + "value" : { + "kind" : "IndexExpr", + "location" : [ 5, 12, 5, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 5, 12, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "s" + }, + "index" : { + "kind" : "Identifier", + "location" : [ 5, 14, 5, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } + } + } ] + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 1, 7, 17 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 7, 5, 7, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 11 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "str_get" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 7, 13, 7, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, { + "kind" : "IntegerLiteral", + "location" : [ 7, 16, 7, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 3 + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 8, 1, 8, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 1, 8, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 1, 8, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 8, 7, 8, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/str_get_element_oob_2.py.ast.typed.s.result b/src/test/data/pa3/sample/str_get_element_oob_2.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_2.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/str_get_element_oob_3.py b/src/test/data/pa3/sample/str_get_element_oob_3.py new file mode 100644 index 0000000..28e545a --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_3.py @@ -0,0 +1,8 @@ +x:str = "" +a:str = "" + +def str_get(s:str, i:int) -> str: + return s[i] + +a = str_get(x, 0) +print(a) diff --git a/src/test/data/pa3/sample/str_get_element_oob_3.py.ast.typed b/src/test/data/pa3/sample/str_get_element_oob_3.py.ast.typed new file mode 100644 index 0000000..bac1f18 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_3.py.ast.typed @@ -0,0 +1,226 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 8, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 1, 9, 1, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 10 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "a" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 5 ], + "className" : "str" + } + }, + "value" : { + "kind" : "StringLiteral", + "location" : [ 2, 9, 2, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "" + } + }, { + "kind" : "FuncDef", + "location" : [ 4, 1, 5, 16 ], + "name" : { + "kind" : "Identifier", + "location" : [ 4, 5, 4, 11 ], + "name" : "str_get" + }, + "params" : [ { + "kind" : "TypedVar", + "location" : [ 4, 13, 4, 17 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 13, 4, 13 ], + "name" : "s" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 15, 4, 17 ], + "className" : "str" + } + }, { + "kind" : "TypedVar", + "location" : [ 4, 20, 4, 24 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 4, 20, 4, 20 ], + "name" : "i" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 4, 22, 4, 24 ], + "className" : "int" + } + } ], + "returnType" : { + "kind" : "ClassType", + "location" : [ 4, 30, 4, 32 ], + "className" : "str" + }, + "declarations" : [ ], + "statements" : [ { + "kind" : "ReturnStmt", + "location" : [ 5, 5, 5, 15 ], + "value" : { + "kind" : "IndexExpr", + "location" : [ 5, 12, 5, 15 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "list" : { + "kind" : "Identifier", + "location" : [ 5, 12, 5, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "s" + }, + "index" : { + "kind" : "Identifier", + "location" : [ 5, 14, 5, 14 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "i" + } + } + } ] + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 7, 1, 7, 17 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 7, 1, 7, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ], + "value" : { + "kind" : "CallExpr", + "location" : [ 7, 5, 7, 17 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 7, 5, 7, 11 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "str" + }, { + "kind" : "ClassValueType", + "className" : "int" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "str" + } + }, + "name" : "str_get" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 7, 13, 7, 13 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "x" + }, { + "kind" : "IntegerLiteral", + "location" : [ 7, 16, 7, 16 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } ] + } + }, { + "kind" : "ExprStmt", + "location" : [ 8, 1, 8, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 8, 1, 8, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 8, 1, 8, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 8, 7, 8, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "name" : "a" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/str_get_element_oob_3.py.ast.typed.s.result b/src/test/data/pa3/sample/str_get_element_oob_3.py.ast.typed.s.result new file mode 100644 index 0000000..144d019 --- /dev/null +++ b/src/test/data/pa3/sample/str_get_element_oob_3.py.ast.typed.s.result @@ -0,0 +1,2 @@ +Index out of bounds +Exited with error code 3 diff --git a/src/test/data/pa3/sample/str_len.py b/src/test/data/pa3/sample/str_len.py new file mode 100644 index 0000000..829f00b --- /dev/null +++ b/src/test/data/pa3/sample/str_len.py @@ -0,0 +1 @@ +print(len("ChocoPy")) diff --git a/src/test/data/pa3/sample/str_len.py.ast.typed b/src/test/data/pa3/sample/str_len.py.ast.typed new file mode 100644 index 0000000..d76359c --- /dev/null +++ b/src/test/data/pa3/sample/str_len.py.ast.typed @@ -0,0 +1,71 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 1, 22 ], + "declarations" : [ ], + "statements" : [ { + "kind" : "ExprStmt", + "location" : [ 1, 1, 1, 21 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 1, 1, 1, 21 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "CallExpr", + "location" : [ 1, 7, 1, 20 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 1, 7, 1, 9 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "int" + } + }, + "name" : "len" + }, + "args" : [ { + "kind" : "StringLiteral", + "location" : [ 1, 11, 1, 19 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "str" + }, + "value" : "ChocoPy" + } ] + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/str_len.py.ast.typed.s.result b/src/test/data/pa3/sample/str_len.py.ast.typed.s.result new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/src/test/data/pa3/sample/str_len.py.ast.typed.s.result @@ -0,0 +1 @@ +7 diff --git a/src/test/data/pa3/sample/var_assign.py b/src/test/data/pa3/sample/var_assign.py new file mode 100644 index 0000000..c56b7ca --- /dev/null +++ b/src/test/data/pa3/sample/var_assign.py @@ -0,0 +1,4 @@ +x:int = 0 +y:object = 1 +x = y = 42 +print(x) diff --git a/src/test/data/pa3/sample/var_assign.py.ast.typed b/src/test/data/pa3/sample/var_assign.py.ast.typed new file mode 100644 index 0000000..83fb4c4 --- /dev/null +++ b/src/test/data/pa3/sample/var_assign.py.ast.typed @@ -0,0 +1,128 @@ +{ + "kind" : "Program", + "location" : [ 1, 1, 4, 9 ], + "declarations" : [ { + "kind" : "VarDef", + "location" : [ 1, 1, 1, 9 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 1, 1, 1, 5 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 1, 1, 1, 1 ], + "name" : "x" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 1, 3, 1, 5 ], + "className" : "int" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 1, 9, 1, 9 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 0 + } + }, { + "kind" : "VarDef", + "location" : [ 2, 1, 2, 12 ], + "var" : { + "kind" : "TypedVar", + "location" : [ 2, 1, 2, 8 ], + "identifier" : { + "kind" : "Identifier", + "location" : [ 2, 1, 2, 1 ], + "name" : "y" + }, + "type" : { + "kind" : "ClassType", + "location" : [ 2, 3, 2, 8 ], + "className" : "object" + } + }, + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 2, 12, 2, 12 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 1 + } + } ], + "statements" : [ { + "kind" : "AssignStmt", + "location" : [ 3, 1, 3, 10 ], + "targets" : [ { + "kind" : "Identifier", + "location" : [ 3, 1, 3, 1 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + }, { + "kind" : "Identifier", + "location" : [ 3, 5, 3, 5 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "object" + }, + "name" : "y" + } ], + "value" : { + "kind" : "IntegerLiteral", + "location" : [ 3, 9, 3, 10 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "value" : 42 + } + }, { + "kind" : "ExprStmt", + "location" : [ 4, 1, 4, 8 ], + "expr" : { + "kind" : "CallExpr", + "location" : [ 4, 1, 4, 8 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "<None>" + }, + "function" : { + "kind" : "Identifier", + "location" : [ 4, 1, 4, 5 ], + "inferredType" : { + "kind" : "FuncType", + "parameters" : [ { + "kind" : "ClassValueType", + "className" : "object" + } ], + "returnType" : { + "kind" : "ClassValueType", + "className" : "<None>" + } + }, + "name" : "print" + }, + "args" : [ { + "kind" : "Identifier", + "location" : [ 4, 7, 4, 7 ], + "inferredType" : { + "kind" : "ClassValueType", + "className" : "int" + }, + "name" : "x" + } ] + } + } ], + "errors" : { + "errors" : [ ], + "kind" : "Errors", + "location" : [ 0, 0, 0, 0 ] + } +} \ No newline at end of file diff --git a/src/test/data/pa3/sample/var_assign.py.ast.typed.s.result b/src/test/data/pa3/sample/var_assign.py.ast.typed.s.result new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/src/test/data/pa3/sample/var_assign.py.ast.typed.s.result @@ -0,0 +1 @@ +42 -- GitLab