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