From 381de344888015fe9e62ec4806433d69bc66703e Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Mon, 6 Nov 2023 20:59:28 +0100
Subject: [PATCH] SCRIPT: Script implementation + Update vivy rust lib

Vivy:
- Use upx to compress executable if possible
- Rename libvvs to libvivy as it is only inteded to be embeded into Vivy
  and not into the vvs runtime
- Compose every crate into the vvs_cli to parse, lower and set
  options/subtitle files

Script:
- Update VVS files
- Parse VVS files
- Base JIT initialization
- Use full_moon for the scripting things, we use a base of Lua for VVS

Misc:
- Correct samples + clippy + update
- Fix README
- Update example files for scripts
- Remove not really needed fonts from the repo and from being bundled into vvcc
- Fix qrc file + move the aux table out of the ass crate

Codegen/JIT crates:
- vvs_runtime: only the JIT runtime thingy, re-exports the types module
  of the vvs_runtime_types crate
- vvs_runtime_types: only the types that will be used in the generated
  code, usefull for the vvs_runtime crate and the vvs_codegen crate
  because we need to know the layout of the types to generate the code
- vvs_codegen: transform the Vivy Script AST into a LLVM module
---
 .gitignore                                    |    3 +-
 CMakeLists.txt                                |   88 +-
 README.md                                     |   42 +-
 TOFIX.md                                      |   10 +-
 rsc/VivyRessources.qrc                        |    3 -
 rsc/fonts/NotoSans-Bold.ttf                   |  Bin 398652 -> 0 bytes
 rsc/fonts/NotoSans-BoldItalic.ttf             |  Bin 285736 -> 0 bytes
 rsc/fonts/NotoSans-Italic.ttf                 |  Bin 274624 -> 0 bytes
 src/Rust/Cargo.lock                           | 1154 +++-
 src/Rust/Cargo.toml                           |  121 +-
 src/Rust/README.md                            |   57 -
 src/Rust/VVLib.h                              |  187 +
 src/Rust/VVLib.hh                             |  123 +
 src/Rust/benches/date.lua                     |  730 +++
 src/Rust/benches/date.rs                      |   21 +
 src/Rust/benches/t.lua                        | 1135 ++++
 src/Rust/benches/t.rs                         |   21 +
 src/Rust/rustfmt.toml                         |   10 +-
 src/Rust/vvs_ass/Cargo.toml                   |   18 +-
 src/Rust/vvs_ass/src/colors.rs                |    6 +
 src/Rust/vvs_ass/src/definitions.rs           |    8 +-
 src/Rust/vvs_ass/src/drawing.rs               |   40 +-
 src/Rust/vvs_ass/src/elements/aux_table.rs    |    3 +
 src/Rust/vvs_ass/src/elements/line.rs         |   86 +-
 src/Rust/vvs_ass/src/elements/mod.rs          |   28 +-
 src/Rust/vvs_ass/src/elements/syllabe.rs      |   83 +-
 src/Rust/vvs_ass/src/lib.rs                   |   16 +-
 src/Rust/vvs_ass/src/position.rs              |    3 +
 src/Rust/vvs_ass/src/reader/ass.rs            |  133 +-
 src/Rust/vvs_ass/src/reader/json.rs           |    6 +-
 src/Rust/vvs_ass/src/reader/mod.rs            |   12 +-
 src/Rust/vvs_ass/src/styles.rs                |   23 +-
 src/Rust/vvs_ass/src/tests.rs                 |   42 +-
 src/Rust/vvs_ass/src/types.rs                 |    6 +
 src/Rust/vvs_ass/src/values.rs                |  200 -
 src/Rust/vvs_cli/Cargo.toml                   |   35 +-
 src/Rust/vvs_cli/build.rs                     |    3 +
 src/Rust/vvs_cli/src/args.rs                  |   56 +-
 src/Rust/vvs_cli/src/config.rs                |    6 +-
 src/Rust/vvs_cli/src/main.rs                  |  123 +-
 src/Rust/vvs_cli/src/parser.rs                |   10 +-
 src/Rust/vvs_codegen/Cargo.toml               |   23 +
 src/Rust/vvs_codegen/build.rs                 |    3 +
 src/Rust/vvs_codegen/src/context.rs           |  105 +
 src/Rust/vvs_codegen/src/graph.rs             |  103 +
 src/Rust/vvs_codegen/src/lib.rs               |   29 +
 src/Rust/vvs_codegen/src/lowerer/calls.rs     |  108 +
 src/Rust/vvs_codegen/src/lowerer/cast.rs      |  329 +
 src/Rust/vvs_codegen/src/lowerer/constant.rs  |   59 +
 src/Rust/vvs_codegen/src/lowerer/drops.rs     |  109 +
 .../vvs_codegen/src/lowerer/expression.rs     |  347 +
 src/Rust/vvs_codegen/src/lowerer/function.rs  |   55 +
 .../vvs_codegen/src/lowerer/instruction.rs    |  431 ++
 src/Rust/vvs_codegen/src/lowerer/mod.rs       |  221 +
 src/Rust/vvs_codegen/src/lowerer/types.rs     |   57 +
 src/Rust/vvs_codegen/src/value.rs             |  100 +
 src/Rust/vvs_font/Cargo.toml                  |   13 +-
 src/Rust/vvs_font/build.rs                    |   11 +-
 src/Rust/vvs_font/src/font.rs                 |    2 +
 src/Rust/vvs_font/src/rect.rs                 |   11 +-
 src/Rust/vvs_lang/Cargo.toml                  |   24 +-
 src/Rust/vvs_lang/VVL.g4                      |  177 -
 src/Rust/vvs_lang/VVS.g4                      |  117 -
 src/Rust/vvs_lang/samples/retime.vvl          |   28 -
 src/Rust/vvs_lang/samples/test.vvs            |   24 -
 src/Rust/vvs_lang/src/ast/constant.rs         |  134 +
 src/Rust/vvs_lang/src/ast/expression.rs       |  441 ++
 src/Rust/vvs_lang/src/ast/extension.rs        |   11 +
 src/Rust/vvs_lang/src/ast/function.rs         |   36 +
 src/Rust/vvs_lang/src/ast/identifier.rs       |   57 +
 src/Rust/vvs_lang/src/ast/import.rs           |   77 +
 src/Rust/vvs_lang/src/ast/instruction.rs      |  187 +
 src/Rust/vvs_lang/src/ast/maybe_const_expr.rs |   26 +
 src/Rust/vvs_lang/src/ast/mod.rs              |   61 +-
 src/Rust/vvs_lang/src/ast/module.rs           |  253 +-
 src/Rust/vvs_lang/src/ast/options.rs          |   64 +
 src/Rust/vvs_lang/src/ast/pattern.rs          |   39 +
 src/Rust/vvs_lang/src/ast/program.rs          |  152 +-
 src/Rust/vvs_lang/src/ast/span.rs             |   24 +-
 src/Rust/vvs_lang/src/ast/string.rs           |   35 +-
 src/Rust/vvs_lang/src/ast/tree.rs             |  266 -
 src/Rust/vvs_lang/src/ast/type_context.rs     |  180 +
 src/Rust/vvs_lang/src/ast/typed.rs            |   17 +
 src/Rust/vvs_lang/src/ast/types.rs            |  226 +
 src/Rust/vvs_lang/src/ast/variable.rs         |  119 +
 src/Rust/vvs_lang/src/ast/variant.rs          |  192 +
 src/Rust/vvs_lang/src/ast/visibility.rs       |   77 +
 src/Rust/vvs_lang/src/lib.rs                  |    4 +-
 src/Rust/vvs_lang/src/parser/error.rs         |  124 -
 src/Rust/vvs_lang/src/parser/mod.rs           |  110 -
 src/Rust/vvs_lang/src/parser/string.rs        |   99 -
 src/Rust/vvs_lang/src/parser/types.rs         |    5 -
 src/Rust/vvs_lang/src/parser/vvl.rs           |    9 -
 src/Rust/vvs_lang/src/parser/vvl/expr.rs      |  237 -
 src/Rust/vvs_lang/src/parser/vvl/inst.rs      |   76 -
 src/Rust/vvs_lang/src/parser/vvl/tabl.rs      |   56 -
 src/Rust/vvs_lang/src/parser/vvl/tupl.rs      |   24 -
 src/Rust/vvs_lang/src/parser/vvs.rs           |   16 -
 src/Rust/vvs_lib/Cargo.toml                   |   22 +
 src/Rust/vvs_lib/build.rs                     |   24 +
 src/Rust/vvs_lib/src/ass_elements.rs          |  191 +
 src/Rust/vvs_lib/src/ass_style.rs             |   13 +
 src/Rust/vvs_lib/src/aux_table.rs             |   10 +
 src/Rust/vvs_lib/src/lib.rs                   |   49 +
 src/Rust/vvs_lib/src/vivy.rs                  |   31 +
 src/Rust/vvs_lib/test/sample.vivy             |   10 +
 src/Rust/vvs_llvm/Cargo.toml                  |   19 +
 src/Rust/vvs_llvm/src/init.rs                 |   37 +
 src/Rust/vvs_llvm/src/iter.rs                 |  102 +
 src/Rust/vvs_llvm/src/lib.rs                  |   80 +
 src/Rust/vvs_parser/Cargo.toml                |   39 +
 src/Rust/vvs_parser/LICENSE.md                |  347 +
 src/Rust/vvs_parser/README.md                 |   10 +
 src/Rust/vvs_parser/samples/options.ini       |    8 +
 src/Rust/vvs_parser/samples/retime.vvs        |   29 +
 src/Rust/vvs_parser/samples/tag.vvs           |   21 +
 src/Rust/vvs_parser/samples/test.vvs          |   20 +
 src/Rust/vvs_parser/src/ast/mod.rs            | 3117 +++++++++
 src/Rust/vvs_parser/src/ast/options.rs        |  108 +
 src/Rust/vvs_parser/src/ast/parsers/mod.rs    | 2172 +++++++
 .../src/ast/parsers/structs/ast_result.rs     |  117 +
 .../vvs_parser/src/ast/parsers/structs/mod.rs |  148 +
 .../parsers/structs/option_table_result.rs    |   56 +
 .../src/ast/parsers/structs/result.rs         |   57 +
 src/Rust/vvs_parser/src/ast/parsers/util.rs   |   16 +
 src/Rust/vvs_parser/src/ast/punctuated.rs     |  487 ++
 src/Rust/vvs_parser/src/ast/span.rs           |   55 +
 .../vvs_parser/src/ast/update_positions.rs    |   87 +
 src/Rust/vvs_parser/src/ast/visitors.rs       |  526 ++
 src/Rust/vvs_parser/src/error.rs              |   59 +
 src/Rust/vvs_parser/src/lib.rs                |   57 +
 src/Rust/vvs_parser/src/node.rs               |  264 +
 src/Rust/vvs_parser/src/private.rs            |   23 +
 src/Rust/vvs_parser/src/short_string.rs       |  118 +
 .../cases/fail/parser/assignment-1/ast.snap   |   71 +
 .../parser/assignment-1/ast_to_string.snap    |    8 +
 .../parser/assignment-1/error_display.snap    |   13 +
 .../fail/parser/assignment-1/errors.snap      |   20 +
 .../cases/fail/parser/assignment-1/source.lua |    1 +
 .../fail/parser/assignment-1/tokens.snap      |   50 +
 .../cases/fail/parser/assignment-2/ast.snap   |   82 +
 .../parser/assignment-2/ast_to_string.snap    |    8 +
 .../parser/assignment-2/error_display.snap    |   19 +
 .../fail/parser/assignment-2/errors.snap      |   34 +
 .../cases/fail/parser/assignment-2/source.lua |    1 +
 .../fail/parser/assignment-2/tokens.snap      |   72 +
 .../cases/fail/parser/assignment-3/ast.snap   |   23 +
 .../parser/assignment-3/ast_to_string.snap    |    8 +
 .../parser/assignment-3/error_display.snap    |   13 +
 .../fail/parser/assignment-3/errors.snap      |   20 +
 .../cases/fail/parser/assignment-3/source.lua |    1 +
 .../fail/parser/assignment-3/tokens.snap      |   72 +
 .../tests/cases/fail/parser/bin-op-1/ast.snap |   81 +
 .../fail/parser/bin-op-1/ast_to_string.snap   |    8 +
 .../fail/parser/bin-op-1/error_display.snap   |   13 +
 .../cases/fail/parser/bin-op-1/errors.snap    |   20 +
 .../cases/fail/parser/bin-op-1/source.lua     |    1 +
 .../cases/fail/parser/bin-op-1/tokens.snap    |   72 +
 .../tests/cases/fail/parser/bin-op-2/ast.snap |   81 +
 .../fail/parser/bin-op-2/ast_to_string.snap   |    8 +
 .../fail/parser/bin-op-2/error_display.snap   |   19 +
 .../cases/fail/parser/bin-op-2/errors.snap    |   34 +
 .../cases/fail/parser/bin-op-2/source.lua     |    1 +
 .../cases/fail/parser/bin-op-2/tokens.snap    |   94 +
 .../tests/cases/fail/parser/call-1/ast.snap   |   77 +
 .../fail/parser/call-1/ast_to_string.snap     |    8 +
 .../fail/parser/call-1/error_display.snap     |   13 +
 .../cases/fail/parser/call-1/errors.snap      |   20 +
 .../tests/cases/fail/parser/call-1/source.lua |    1 +
 .../cases/fail/parser/call-1/tokens.snap      |   39 +
 .../tests/cases/fail/parser/call-2/ast.snap   |   94 +
 .../fail/parser/call-2/ast_to_string.snap     |    8 +
 .../fail/parser/call-2/error_display.snap     |   13 +
 .../cases/fail/parser/call-2/errors.snap      |   20 +
 .../tests/cases/fail/parser/call-2/source.lua |    1 +
 .../cases/fail/parser/call-2/tokens.snap      |   51 +
 .../tests/cases/fail/parser/call-3/ast.snap   |  136 +
 .../fail/parser/call-3/ast_to_string.snap     |    8 +
 .../fail/parser/call-3/error_display.snap     |   13 +
 .../cases/fail/parser/call-3/errors.snap      |   20 +
 .../tests/cases/fail/parser/call-3/source.lua |    1 +
 .../cases/fail/parser/call-3/tokens.snap      |   85 +
 .../tests/cases/fail/parser/call-4/ast.snap   |   77 +
 .../fail/parser/call-4/ast_to_string.snap     |    8 +
 .../fail/parser/call-4/error_display.snap     |   19 +
 .../cases/fail/parser/call-4/errors.snap      |   34 +
 .../tests/cases/fail/parser/call-4/source.lua |    1 +
 .../cases/fail/parser/call-4/tokens.snap      |   61 +
 .../src/tests/cases/fail/parser/do-1/ast.snap |  133 +
 .../cases/fail/parser/do-1/ast_to_string.snap |    8 +
 .../cases/fail/parser/do-1/error_display.snap |   13 +
 .../tests/cases/fail/parser/do-1/errors.snap  |   26 +
 .../tests/cases/fail/parser/do-1/source.lua   |    2 +
 .../tests/cases/fail/parser/do-1/tokens.snap  |   83 +
 .../src/tests/cases/fail/parser/do-2/ast.snap |   68 +
 .../cases/fail/parser/do-2/ast_to_string.snap |    8 +
 .../cases/fail/parser/do-2/error_display.snap |   19 +
 .../tests/cases/fail/parser/do-2/errors.snap  |   41 +
 .../tests/cases/fail/parser/do-2/source.lua   |    1 +
 .../tests/cases/fail/parser/do-2/tokens.snap  |   72 +
 .../cases/fail/parser/function-1/ast.snap     |   23 +
 .../fail/parser/function-1/ast_to_string.snap |    8 +
 .../fail/parser/function-1/error_display.snap |   13 +
 .../cases/fail/parser/function-1/errors.snap  |   19 +
 .../cases/fail/parser/function-1/source.lua   |    1 +
 .../cases/fail/parser/function-1/tokens.snap  |   28 +
 .../cases/fail/parser/function-2/ast.snap     |   23 +
 .../fail/parser/function-2/ast_to_string.snap |    8 +
 .../fail/parser/function-2/error_display.snap |   19 +
 .../cases/fail/parser/function-2/errors.snap  |   34 +
 .../cases/fail/parser/function-2/source.lua   |    1 +
 .../cases/fail/parser/function-2/tokens.snap  |   50 +
 .../cases/fail/parser/function-3/ast.snap     |   23 +
 .../fail/parser/function-3/ast_to_string.snap |    8 +
 .../fail/parser/function-3/error_display.snap |   25 +
 .../cases/fail/parser/function-3/errors.snap  |   48 +
 .../cases/fail/parser/function-3/source.lua   |    1 +
 .../cases/fail/parser/function-3/tokens.snap  |   72 +
 .../cases/fail/parser/function-4/ast.snap     |  120 +
 .../fail/parser/function-4/ast_to_string.snap |    8 +
 .../fail/parser/function-4/error_display.snap |   13 +
 .../cases/fail/parser/function-4/errors.snap  |   19 +
 .../cases/fail/parser/function-4/source.lua   |    1 +
 .../cases/fail/parser/function-4/tokens.snap  |   61 +
 .../cases/fail/parser/function-5/ast.snap     |   23 +
 .../fail/parser/function-5/ast_to_string.snap |    8 +
 .../fail/parser/function-5/error_display.snap |   31 +
 .../cases/fail/parser/function-5/errors.snap  |   62 +
 .../cases/fail/parser/function-5/source.lua   |    1 +
 .../cases/fail/parser/function-5/tokens.snap  |   94 +
 .../cases/fail/parser/function-6/ast.snap     |  120 +
 .../fail/parser/function-6/ast_to_string.snap |    8 +
 .../fail/parser/function-6/error_display.snap |   13 +
 .../cases/fail/parser/function-6/errors.snap  |   26 +
 .../cases/fail/parser/function-6/source.lua   |    1 +
 .../cases/fail/parser/function-6/tokens.snap  |   72 +
 .../cases/fail/parser/function-7/ast.snap     |  136 +
 .../fail/parser/function-7/ast_to_string.snap |    8 +
 .../fail/parser/function-7/error_display.snap |   31 +
 .../cases/fail/parser/function-7/errors.snap  |   62 +
 .../cases/fail/parser/function-7/source.lua   |    2 +
 .../cases/fail/parser/function-7/tokens.snap  |  138 +
 .../cases/fail/parser/function-8/ast.snap     |   23 +
 .../fail/parser/function-8/ast_to_string.snap |    8 +
 .../fail/parser/function-8/error_display.snap |   31 +
 .../cases/fail/parser/function-8/errors.snap  |   62 +
 .../cases/fail/parser/function-8/source.lua   |    1 +
 .../cases/fail/parser/function-8/tokens.snap  |  116 +
 .../cases/fail/parser/generic-for-1/ast.snap  |   23 +
 .../parser/generic-for-1/ast_to_string.snap   |    8 +
 .../parser/generic-for-1/error_display.snap   |   13 +
 .../fail/parser/generic-for-1/errors.snap     |   20 +
 .../fail/parser/generic-for-1/source.lua      |    1 +
 .../fail/parser/generic-for-1/tokens.snap     |   72 +
 .../cases/fail/parser/generic-for-2/ast.snap  |  210 +
 .../parser/generic-for-2/ast_to_string.snap   |    8 +
 .../parser/generic-for-2/error_display.snap   |   13 +
 .../fail/parser/generic-for-2/errors.snap     |   19 +
 .../fail/parser/generic-for-2/source.lua      |    1 +
 .../fail/parser/generic-for-2/tokens.snap     |  127 +
 .../cases/fail/parser/generic-for-3/ast.snap  |  221 +
 .../parser/generic-for-3/ast_to_string.snap   |    8 +
 .../parser/generic-for-3/error_display.snap   |   13 +
 .../fail/parser/generic-for-3/errors.snap     |   26 +
 .../fail/parser/generic-for-3/source.lua      |    1 +
 .../fail/parser/generic-for-3/tokens.snap     |  149 +
 .../cases/fail/parser/generic-for-4/ast.snap  |  150 +
 .../parser/generic-for-4/ast_to_string.snap   |    8 +
 .../parser/generic-for-4/error_display.snap   |   31 +
 .../fail/parser/generic-for-4/errors.snap     |   62 +
 .../fail/parser/generic-for-4/source.lua      |    1 +
 .../fail/parser/generic-for-4/tokens.snap     |  204 +
 .../src/tests/cases/fail/parser/if-1/ast.snap |  114 +
 .../cases/fail/parser/if-1/ast_to_string.snap |    8 +
 .../cases/fail/parser/if-1/error_display.snap |   13 +
 .../tests/cases/fail/parser/if-1/errors.snap  |   19 +
 .../tests/cases/fail/parser/if-1/source.lua   |    1 +
 .../tests/cases/fail/parser/if-1/tokens.snap  |   72 +
 .../src/tests/cases/fail/parser/if-2/ast.snap |  216 +
 .../cases/fail/parser/if-2/ast_to_string.snap |    8 +
 .../cases/fail/parser/if-2/error_display.snap |   13 +
 .../tests/cases/fail/parser/if-2/errors.snap  |   19 +
 .../tests/cases/fail/parser/if-2/source.lua   |    3 +
 .../tests/cases/fail/parser/if-2/tokens.snap  |  149 +
 .../src/tests/cases/fail/parser/if-3/ast.snap |   23 +
 .../cases/fail/parser/if-3/ast_to_string.snap |    8 +
 .../cases/fail/parser/if-3/error_display.snap |   25 +
 .../tests/cases/fail/parser/if-3/errors.snap  |   48 +
 .../tests/cases/fail/parser/if-3/source.lua   |    1 +
 .../tests/cases/fail/parser/if-3/tokens.snap  |   94 +
 .../src/tests/cases/fail/parser/if-4/ast.snap |  196 +
 .../cases/fail/parser/if-4/ast_to_string.snap |    8 +
 .../cases/fail/parser/if-4/error_display.snap |   13 +
 .../tests/cases/fail/parser/if-4/errors.snap  |   19 +
 .../tests/cases/fail/parser/if-4/source.lua   |    2 +
 .../tests/cases/fail/parser/if-4/tokens.snap  |  138 +
 .../src/tests/cases/fail/parser/if-5/ast.snap |  379 ++
 .../cases/fail/parser/if-5/ast_to_string.snap |    8 +
 .../cases/fail/parser/if-5/error_display.snap |   31 +
 .../tests/cases/fail/parser/if-5/errors.snap  |   62 +
 .../tests/cases/fail/parser/if-5/source.lua   |    7 +
 .../tests/cases/fail/parser/if-5/tokens.snap  |  347 +
 .../src/tests/cases/fail/parser/if-6/ast.snap |  227 +
 .../cases/fail/parser/if-6/ast_to_string.snap |    8 +
 .../cases/fail/parser/if-6/error_display.snap |   19 +
 .../tests/cases/fail/parser/if-6/errors.snap  |   34 +
 .../tests/cases/fail/parser/if-6/source.lua   |    4 +
 .../tests/cases/fail/parser/if-6/tokens.snap  |  193 +
 .../src/tests/cases/fail/parser/if-7/ast.snap |  170 +
 .../cases/fail/parser/if-7/ast_to_string.snap |    8 +
 .../cases/fail/parser/if-7/error_display.snap |   13 +
 .../tests/cases/fail/parser/if-7/errors.snap  |   19 +
 .../tests/cases/fail/parser/if-7/source.lua   |    2 +
 .../tests/cases/fail/parser/if-7/tokens.snap  |  116 +
 .../tests/cases/fail/parser/index-1/ast.snap  |   23 +
 .../fail/parser/index-1/ast_to_string.snap    |    8 +
 .../fail/parser/index-1/error_display.snap    |   19 +
 .../cases/fail/parser/index-1/errors.snap     |   39 +
 .../cases/fail/parser/index-1/source.lua      |    1 +
 .../cases/fail/parser/index-1/tokens.snap     |   50 +
 .../tests/cases/fail/parser/index-2/ast.snap  |   23 +
 .../fail/parser/index-2/ast_to_string.snap    |    8 +
 .../fail/parser/index-2/error_display.snap    |   19 +
 .../cases/fail/parser/index-2/errors.snap     |   33 +
 .../cases/fail/parser/index-2/source.lua      |    1 +
 .../cases/fail/parser/index-2/tokens.snap     |   39 +
 .../tests/cases/fail/parser/index-3/ast.snap  |   23 +
 .../fail/parser/index-3/ast_to_string.snap    |    8 +
 .../fail/parser/index-3/error_display.snap    |   25 +
 .../cases/fail/parser/index-3/errors.snap     |   48 +
 .../cases/fail/parser/index-3/source.lua      |    1 +
 .../cases/fail/parser/index-3/tokens.snap     |   94 +
 .../tests/cases/fail/parser/index-4/ast.snap  |  124 +
 .../fail/parser/index-4/ast_to_string.snap    |    8 +
 .../fail/parser/index-4/error_display.snap    |   19 +
 .../cases/fail/parser/index-4/errors.snap     |   34 +
 .../cases/fail/parser/index-4/source.lua      |    1 +
 .../cases/fail/parser/index-4/tokens.snap     |  127 +
 .../tests/cases/fail/parser/index-5/ast.snap  |   71 +
 .../fail/parser/index-5/ast_to_string.snap    |    8 +
 .../fail/parser/index-5/error_display.snap    |   19 +
 .../cases/fail/parser/index-5/errors.snap     |   34 +
 .../cases/fail/parser/index-5/source.lua      |    1 +
 .../cases/fail/parser/index-5/tokens.snap     |   72 +
 .../cases/fail/parser/last-stmt-1/ast.snap    |  292 +
 .../parser/last-stmt-1/ast_to_string.snap     |    8 +
 .../parser/last-stmt-1/error_display.snap     |   19 +
 .../cases/fail/parser/last-stmt-1/errors.snap |   41 +
 .../cases/fail/parser/last-stmt-1/source.lua  |    4 +
 .../cases/fail/parser/last-stmt-1/tokens.snap |  237 +
 .../fail/parser/local-assignment-1/ast.snap   |   82 +
 .../local-assignment-1/ast_to_string.snap     |    8 +
 .../local-assignment-1/error_display.snap     |   13 +
 .../parser/local-assignment-1/errors.snap     |   19 +
 .../fail/parser/local-assignment-1/source.lua |    1 +
 .../parser/local-assignment-1/tokens.snap     |   72 +
 .../fail/parser/local-assignment-2/ast.snap   |   96 +
 .../local-assignment-2/ast_to_string.snap     |    8 +
 .../local-assignment-2/error_display.snap     |   13 +
 .../parser/local-assignment-2/errors.snap     |   20 +
 .../fail/parser/local-assignment-2/source.lua |    1 +
 .../parser/local-assignment-2/tokens.snap     |   72 +
 .../fail/parser/local-assignment-3/ast.snap   |  123 +
 .../local-assignment-3/ast_to_string.snap     |    8 +
 .../local-assignment-3/error_display.snap     |   13 +
 .../parser/local-assignment-3/errors.snap     |   20 +
 .../fail/parser/local-assignment-3/source.lua |    1 +
 .../parser/local-assignment-3/tokens.snap     |  105 +
 .../fail/parser/local-assignment-4/ast.snap   |   23 +
 .../local-assignment-4/ast_to_string.snap     |    8 +
 .../local-assignment-4/error_display.snap     |   19 +
 .../parser/local-assignment-4/errors.snap     |   34 +
 .../fail/parser/local-assignment-4/source.lua |    1 +
 .../parser/local-assignment-4/tokens.snap     |   50 +
 .../fail/parser/local-assignment-5/ast.snap   |  107 +
 .../local-assignment-5/ast_to_string.snap     |    8 +
 .../local-assignment-5/error_display.snap     |   19 +
 .../parser/local-assignment-5/errors.snap     |   34 +
 .../fail/parser/local-assignment-5/source.lua |    1 +
 .../parser/local-assignment-5/tokens.snap     |   94 +
 .../fail/parser/local-assignment-6/ast.snap   |  218 +
 .../local-assignment-6/ast_to_string.snap     |    8 +
 .../local-assignment-6/error_display.snap     |   13 +
 .../parser/local-assignment-6/errors.snap     |   20 +
 .../fail/parser/local-assignment-6/source.lua |    2 +
 .../parser/local-assignment-6/tokens.snap     |  171 +
 .../fail/parser/local-function-1/ast.snap     |   23 +
 .../local-function-1/ast_to_string.snap       |    8 +
 .../local-function-1/error_display.snap       |   13 +
 .../fail/parser/local-function-1/errors.snap  |   19 +
 .../fail/parser/local-function-1/source.lua   |    1 +
 .../fail/parser/local-function-1/tokens.snap  |   50 +
 .../fail/parser/local-function-2/ast.snap     |   23 +
 .../local-function-2/ast_to_string.snap       |    8 +
 .../local-function-2/error_display.snap       |   13 +
 .../fail/parser/local-function-2/errors.snap  |   20 +
 .../fail/parser/local-function-2/source.lua   |    1 +
 .../fail/parser/local-function-2/tokens.snap  |   72 +
 .../fail/parser/local-function-3/ast.snap     |  142 +
 .../local-function-3/ast_to_string.snap       |    8 +
 .../local-function-3/error_display.snap       |   13 +
 .../fail/parser/local-function-3/errors.snap  |   19 +
 .../fail/parser/local-function-3/source.lua   |    1 +
 .../fail/parser/local-function-3/tokens.snap  |   83 +
 .../fail/parser/local-function-4/ast.snap     |  218 +
 .../local-function-4/ast_to_string.snap       |    8 +
 .../local-function-4/error_display.snap       |   13 +
 .../fail/parser/local-function-4/errors.snap  |   26 +
 .../fail/parser/local-function-4/source.lua   |    2 +
 .../fail/parser/local-function-4/tokens.snap  |  149 +
 .../fail/parser/local-function-5/ast.snap     |   99 +
 .../local-function-5/ast_to_string.snap       |    8 +
 .../local-function-5/error_display.snap       |   25 +
 .../fail/parser/local-function-5/errors.snap  |   48 +
 .../fail/parser/local-function-5/source.lua   |    3 +
 .../fail/parser/local-function-5/tokens.snap  |  171 +
 .../fail/parser/local-function-6/ast.snap     |  142 +
 .../local-function-6/ast_to_string.snap       |    8 +
 .../local-function-6/error_display.snap       |   19 +
 .../fail/parser/local-function-6/errors.snap  |   34 +
 .../fail/parser/local-function-6/source.lua   |    2 +
 .../fail/parser/local-function-6/tokens.snap  |  149 +
 .../fail/parser/local-function-7/ast.snap     |  356 ++
 .../local-function-7/ast_to_string.snap       |    8 +
 .../local-function-7/error_display.snap       |   13 +
 .../fail/parser/local-function-7/errors.snap  |   20 +
 .../fail/parser/local-function-7/source.lua   |    3 +
 .../fail/parser/local-function-7/tokens.snap  |  281 +
 .../cases/fail/parser/method-call-1/ast.snap  |   71 +
 .../parser/method-call-1/ast_to_string.snap   |    8 +
 .../parser/method-call-1/error_display.snap   |   13 +
 .../fail/parser/method-call-1/errors.snap     |   20 +
 .../fail/parser/method-call-1/source.lua      |    1 +
 .../fail/parser/method-call-1/tokens.snap     |   61 +
 .../cases/fail/parser/method-call-2/ast.snap  |  139 +
 .../parser/method-call-2/ast_to_string.snap   |    8 +
 .../parser/method-call-2/error_display.snap   |   13 +
 .../fail/parser/method-call-2/errors.snap     |   20 +
 .../fail/parser/method-call-2/source.lua      |    1 +
 .../fail/parser/method-call-2/tokens.snap     |   72 +
 .../cases/fail/parser/method-call-3/ast.snap  |  139 +
 .../parser/method-call-3/ast_to_string.snap   |    8 +
 .../parser/method-call-3/error_display.snap   |   19 +
 .../fail/parser/method-call-3/errors.snap     |   34 +
 .../fail/parser/method-call-3/source.lua      |    1 +
 .../fail/parser/method-call-3/tokens.snap     |  105 +
 .../cases/fail/parser/numeric-for-1/ast.snap  |   23 +
 .../parser/numeric-for-1/ast_to_string.snap   |    8 +
 .../parser/numeric-for-1/error_display.snap   |   13 +
 .../fail/parser/numeric-for-1/errors.snap     |   19 +
 .../fail/parser/numeric-for-1/source.lua      |    1 +
 .../fail/parser/numeric-for-1/tokens.snap     |   50 +
 .../cases/fail/parser/numeric-for-2/ast.snap  |   23 +
 .../parser/numeric-for-2/ast_to_string.snap   |    8 +
 .../parser/numeric-for-2/error_display.snap   |   13 +
 .../fail/parser/numeric-for-2/errors.snap     |   20 +
 .../fail/parser/numeric-for-2/source.lua      |    1 +
 .../fail/parser/numeric-for-2/tokens.snap     |   72 +
 .../cases/fail/parser/numeric-for-3/ast.snap  |   23 +
 .../parser/numeric-for-3/ast_to_string.snap   |    8 +
 .../parser/numeric-for-3/error_display.snap   |   13 +
 .../fail/parser/numeric-for-3/errors.snap     |   19 +
 .../fail/parser/numeric-for-3/source.lua      |    1 +
 .../fail/parser/numeric-for-3/tokens.snap     |   94 +
 .../cases/fail/parser/numeric-for-4/ast.snap  |  206 +
 .../parser/numeric-for-4/ast_to_string.snap   |    8 +
 .../parser/numeric-for-4/error_display.snap   |   13 +
 .../fail/parser/numeric-for-4/errors.snap     |   26 +
 .../fail/parser/numeric-for-4/source.lua      |    1 +
 .../fail/parser/numeric-for-4/tokens.snap     |  149 +
 .../cases/fail/parser/numeric-for-5/ast.snap  |   68 +
 .../parser/numeric-for-5/ast_to_string.snap   |    8 +
 .../parser/numeric-for-5/error_display.snap   |   25 +
 .../fail/parser/numeric-for-5/errors.snap     |   48 +
 .../fail/parser/numeric-for-5/source.lua      |    1 +
 .../fail/parser/numeric-for-5/tokens.snap     |  171 +
 .../fail/parser/paren-expression-1/ast.snap   |   54 +
 .../paren-expression-1/ast_to_string.snap     |    8 +
 .../paren-expression-1/error_display.snap     |   13 +
 .../parser/paren-expression-1/errors.snap     |   20 +
 .../fail/parser/paren-expression-1/source.lua |    1 +
 .../parser/paren-expression-1/tokens.snap     |   50 +
 .../fail/parser/paren-expression-2/ast.snap   |  143 +
 .../paren-expression-2/ast_to_string.snap     |    8 +
 .../paren-expression-2/error_display.snap     |   13 +
 .../parser/paren-expression-2/errors.snap     |   20 +
 .../fail/parser/paren-expression-2/source.lua |    1 +
 .../parser/paren-expression-2/tokens.snap     |   94 +
 .../fail/parser/paren-expression-3/ast.snap   |  143 +
 .../paren-expression-3/ast_to_string.snap     |    8 +
 .../paren-expression-3/error_display.snap     |   19 +
 .../parser/paren-expression-3/errors.snap     |   34 +
 .../fail/parser/paren-expression-3/source.lua |    1 +
 .../parser/paren-expression-3/tokens.snap     |  105 +
 .../fail/parser/paren-expression-4/ast.snap   |   54 +
 .../paren-expression-4/ast_to_string.snap     |    8 +
 .../paren-expression-4/error_display.snap     |   19 +
 .../parser/paren-expression-4/errors.snap     |   34 +
 .../fail/parser/paren-expression-4/source.lua |    1 +
 .../parser/paren-expression-4/tokens.snap     |   61 +
 .../fail/parser/paren-expression-5/ast.snap   |   54 +
 .../paren-expression-5/ast_to_string.snap     |    8 +
 .../paren-expression-5/error_display.snap     |   19 +
 .../parser/paren-expression-5/errors.snap     |   34 +
 .../fail/parser/paren-expression-5/source.lua |    1 +
 .../parser/paren-expression-5/tokens.snap     |   72 +
 .../cases/fail/parser/repeat-until-1/ast.snap |   79 +
 .../parser/repeat-until-1/ast_to_string.snap  |    8 +
 .../parser/repeat-until-1/error_display.snap  |   13 +
 .../fail/parser/repeat-until-1/errors.snap    |   19 +
 .../fail/parser/repeat-until-1/source.lua     |    1 +
 .../fail/parser/repeat-until-1/tokens.snap    |   28 +
 .../cases/fail/parser/repeat-until-2/ast.snap |  144 +
 .../parser/repeat-until-2/ast_to_string.snap  |    8 +
 .../parser/repeat-until-2/error_display.snap  |   13 +
 .../fail/parser/repeat-until-2/errors.snap    |   19 +
 .../fail/parser/repeat-until-2/source.lua     |    2 +
 .../fail/parser/repeat-until-2/tokens.snap    |   83 +
 .../cases/fail/parser/repeat-until-3/ast.snap |  155 +
 .../parser/repeat-until-3/ast_to_string.snap  |    8 +
 .../parser/repeat-until-3/error_display.snap  |   13 +
 .../fail/parser/repeat-until-3/errors.snap    |   20 +
 .../fail/parser/repeat-until-3/source.lua     |    3 +
 .../fail/parser/repeat-until-3/tokens.snap    |  105 +
 .../cases/fail/parser/repeat-until-4/ast.snap |  155 +
 .../parser/repeat-until-4/ast_to_string.snap  |    8 +
 .../parser/repeat-until-4/error_display.snap  |   19 +
 .../fail/parser/repeat-until-4/errors.snap    |   34 +
 .../fail/parser/repeat-until-4/source.lua     |    3 +
 .../fail/parser/repeat-until-4/tokens.snap    |  127 +
 .../tests/cases/fail/parser/table-1/ast.snap  |   88 +
 .../fail/parser/table-1/ast_to_string.snap    |    8 +
 .../fail/parser/table-1/error_display.snap    |   13 +
 .../cases/fail/parser/table-1/errors.snap     |   20 +
 .../cases/fail/parser/table-1/source.lua      |    1 +
 .../cases/fail/parser/table-1/tokens.snap     |   50 +
 .../tests/cases/fail/parser/table-2/ast.snap  |  194 +
 .../fail/parser/table-2/ast_to_string.snap    |    8 +
 .../fail/parser/table-2/error_display.snap    |   13 +
 .../cases/fail/parser/table-2/errors.snap     |   20 +
 .../cases/fail/parser/table-2/source.lua      |    2 +
 .../cases/fail/parser/table-2/tokens.snap     |  138 +
 .../tests/cases/fail/parser/table-3/ast.snap  |   99 +
 .../fail/parser/table-3/ast_to_string.snap    |    8 +
 .../fail/parser/table-3/error_display.snap    |   13 +
 .../cases/fail/parser/table-3/errors.snap     |   20 +
 .../cases/fail/parser/table-3/source.lua      |    2 +
 .../cases/fail/parser/table-3/tokens.snap     |  105 +
 .../tests/cases/fail/parser/table-4/ast.snap  |   99 +
 .../fail/parser/table-4/ast_to_string.snap    |    8 +
 .../fail/parser/table-4/error_display.snap    |   19 +
 .../cases/fail/parser/table-4/errors.snap     |   34 +
 .../cases/fail/parser/table-4/source.lua      |    1 +
 .../cases/fail/parser/table-4/tokens.snap     |   94 +
 .../tests/cases/fail/parser/table-5/ast.snap  |   99 +
 .../fail/parser/table-5/ast_to_string.snap    |    8 +
 .../fail/parser/table-5/error_display.snap    |   19 +
 .../cases/fail/parser/table-5/errors.snap     |   34 +
 .../cases/fail/parser/table-5/source.lua      |    3 +
 .../cases/fail/parser/table-5/tokens.snap     |  160 +
 .../tests/cases/fail/parser/table-6/ast.snap  |   99 +
 .../fail/parser/table-6/ast_to_string.snap    |    8 +
 .../fail/parser/table-6/error_display.snap    |   19 +
 .../cases/fail/parser/table-6/errors.snap     |   34 +
 .../cases/fail/parser/table-6/source.lua      |    3 +
 .../cases/fail/parser/table-6/tokens.snap     |  160 +
 .../tests/cases/fail/parser/table-7/ast.snap  |   99 +
 .../fail/parser/table-7/ast_to_string.snap    |    8 +
 .../fail/parser/table-7/error_display.snap    |   19 +
 .../cases/fail/parser/table-7/errors.snap     |   34 +
 .../cases/fail/parser/table-7/source.lua      |    3 +
 .../cases/fail/parser/table-7/tokens.snap     |  182 +
 .../tests/cases/fail/parser/table-8/ast.snap  |   99 +
 .../fail/parser/table-8/ast_to_string.snap    |    8 +
 .../fail/parser/table-8/error_display.snap    |   19 +
 .../cases/fail/parser/table-8/errors.snap     |   34 +
 .../cases/fail/parser/table-8/source.lua      |    3 +
 .../cases/fail/parser/table-8/tokens.snap     |  171 +
 .../tests/cases/fail/parser/table-9/ast.snap  |  152 +
 .../fail/parser/table-9/ast_to_string.snap    |    8 +
 .../fail/parser/table-9/error_display.snap    |   19 +
 .../cases/fail/parser/table-9/errors.snap     |   41 +
 .../cases/fail/parser/table-9/source.lua      |    3 +
 .../cases/fail/parser/table-9/tokens.snap     |  270 +
 .../tests/cases/fail/parser/un-op-1/ast.snap  |   54 +
 .../fail/parser/un-op-1/ast_to_string.snap    |    8 +
 .../fail/parser/un-op-1/error_display.snap    |   13 +
 .../cases/fail/parser/un-op-1/errors.snap     |   20 +
 .../cases/fail/parser/un-op-1/source.lua      |    1 +
 .../cases/fail/parser/un-op-1/tokens.snap     |   50 +
 .../tests/cases/fail/parser/un-op-2/ast.snap  |   54 +
 .../fail/parser/un-op-2/ast_to_string.snap    |    8 +
 .../fail/parser/un-op-2/error_display.snap    |   19 +
 .../cases/fail/parser/un-op-2/errors.snap     |   34 +
 .../cases/fail/parser/un-op-2/source.lua      |    1 +
 .../cases/fail/parser/un-op-2/tokens.snap     |   72 +
 .../tests/cases/fail/parser/while-1/ast.snap  |   23 +
 .../fail/parser/while-1/ast_to_string.snap    |    8 +
 .../fail/parser/while-1/error_display.snap    |   13 +
 .../cases/fail/parser/while-1/errors.snap     |   20 +
 .../cases/fail/parser/while-1/source.lua      |    1 +
 .../cases/fail/parser/while-1/tokens.snap     |   28 +
 .../tests/cases/fail/parser/while-2/ast.snap  |   68 +
 .../fail/parser/while-2/ast_to_string.snap    |    8 +
 .../fail/parser/while-2/error_display.snap    |   19 +
 .../cases/fail/parser/while-2/errors.snap     |   34 +
 .../cases/fail/parser/while-2/source.lua      |    1 +
 .../cases/fail/parser/while-2/tokens.snap     |   94 +
 .../tests/cases/fail/parser/while-3/ast.snap  |  186 +
 .../fail/parser/while-3/ast_to_string.snap    |    8 +
 .../fail/parser/while-3/error_display.snap    |   13 +
 .../cases/fail/parser/while-3/errors.snap     |   26 +
 .../cases/fail/parser/while-3/source.lua      |    2 +
 .../cases/fail/parser/while-3/tokens.snap     |  127 +
 .../tests/cases/fail/parser/while-4/ast.snap  |  219 +
 .../fail/parser/while-4/ast_to_string.snap    |    8 +
 .../fail/parser/while-4/error_display.snap    |   19 +
 .../cases/fail/parser/while-4/errors.snap     |   34 +
 .../cases/fail/parser/while-4/source.lua      |    3 +
 .../cases/fail/parser/while-4/tokens.snap     |  127 +
 .../fail/tokenizer/bad-numbers-1/ast.snap     |   98 +
 .../bad-numbers-1/ast_to_string.snap          |    8 +
 .../bad-numbers-1/error_display.snap          |   13 +
 .../fail/tokenizer/bad-numbers-1/errors.snap  |   16 +
 .../fail/tokenizer/bad-numbers-1/source.lua   |    1 +
 .../bad-numbers-1/tokens_result.snap          |   81 +
 .../tokenizer/unclosed-comment-1/ast.snap     |   35 +
 .../unclosed-comment-1/ast_to_string.snap     |    8 +
 .../unclosed-comment-1/error_display.snap     |   13 +
 .../tokenizer/unclosed-comment-1/errors.snap  |   16 +
 .../tokenizer/unclosed-comment-1/source.lua   |    1 +
 .../unclosed-comment-1/tokens_result.snap     |   38 +
 .../fail/tokenizer/unclosed-string-1/ast.snap |  124 +
 .../unclosed-string-1/ast_to_string.snap      |    8 +
 .../unclosed-string-1/error_display.snap      |   13 +
 .../tokenizer/unclosed-string-1/errors.snap   |   16 +
 .../tokenizer/unclosed-string-1/source.lua    |    1 +
 .../unclosed-string-1/tokens_result.snap      |  104 +
 .../fail/tokenizer/unclosed-string-2/ast.snap |  124 +
 .../unclosed-string-2/ast_to_string.snap      |    8 +
 .../unclosed-string-2/error_display.snap      |   13 +
 .../tokenizer/unclosed-string-2/errors.snap   |   16 +
 .../tokenizer/unclosed-string-2/source.lua    |    1 +
 .../unclosed-string-2/tokens_result.snap      |  104 +
 .../fail/tokenizer/unclosed-string-3/ast.snap |  122 +
 .../unclosed-string-3/ast_to_string.snap      |    8 +
 .../unclosed-string-3/error_display.snap      |   15 +
 .../tokenizer/unclosed-string-3/errors.snap   |   16 +
 .../tokenizer/unclosed-string-3/source.lua    |    2 +
 .../unclosed-string-3/tokens_result.snap      |  102 +
 .../fail/tokenizer/unclosed-string-4/ast.snap |  134 +
 .../unclosed-string-4/ast_to_string.snap      |    8 +
 .../unclosed-string-4/error_display.snap      |   21 +
 .../tokenizer/unclosed-string-4/errors.snap   |   30 +
 .../tokenizer/unclosed-string-4/source.lua    |    2 +
 .../unclosed-string-4/tokens_result.snap      |  126 +
 .../tokenizer/unexpected-character/ast.snap   |  107 +
 .../unexpected-character/ast_to_string.snap   |    8 +
 .../unexpected-character/error_display.snap   |   19 +
 .../unexpected-character/errors.snap          |   30 +
 .../tokenizer/unexpected-character/source.lua |    1 +
 .../unexpected-character/tokens_result.snap   |   93 +
 .../tokenizer/wrong-place-shebang/ast.snap    |  129 +
 .../wrong-place-shebang/ast_to_string.snap    |    8 +
 .../wrong-place-shebang/error_display.snap    |   61 +
 .../tokenizer/wrong-place-shebang/errors.snap |  128 +
 .../tokenizer/wrong-place-shebang/source.lua  |    4 +
 .../wrong-place-shebang/tokens_result.snap    |  226 +
 .../cases/pass/anonymous-functions-1/ast.snap |  271 +
 .../pass/anonymous-functions-1/source.lua     |    3 +
 .../pass/anonymous-functions-1/tokens.snap    |  215 +
 .../cases/pass/anonymous-functions-2/ast.snap |  232 +
 .../pass/anonymous-functions-2/source.lua     |    3 +
 .../pass/anonymous-functions-2/tokens.snap    |  172 +
 .../cases/pass/anonymous-functions-3/ast.snap |  184 +
 .../pass/anonymous-functions-3/source.lua     |    1 +
 .../pass/anonymous-functions-3/tokens.snap    |  149 +
 .../cases/pass/anonymous-functions-4/ast.snap |  266 +
 .../pass/anonymous-functions-4/source.lua     |    1 +
 .../pass/anonymous-functions-4/tokens.snap    |  215 +
 .../tests/cases/pass/assignment-1/ast.snap    |   83 +
 .../tests/cases/pass/assignment-1/source.lua  |    1 +
 .../tests/cases/pass/assignment-1/tokens.snap |   72 +
 .../tests/cases/pass/assignment-2/ast.snap    |  165 +
 .../tests/cases/pass/assignment-2/source.lua  |    1 +
 .../tests/cases/pass/assignment-2/tokens.snap |  138 +
 .../tests/cases/pass/assignment-3/ast.snap    |  829 +++
 .../tests/cases/pass/assignment-3/source.lua  |    2 +
 .../tests/cases/pass/assignment-3/tokens.snap |  611 ++
 .../tests/cases/pass/assignment-4/ast.snap    |  180 +
 .../tests/cases/pass/assignment-4/source.lua  |    2 +
 .../tests/cases/pass/assignment-4/tokens.snap |  149 +
 .../tests/cases/pass/assignment-5/ast.snap    |  338 +
 .../tests/cases/pass/assignment-5/source.lua  |    1 +
 .../tests/cases/pass/assignment-5/tokens.snap |  250 +
 .../src/tests/cases/pass/binops/ast.snap      | 1840 ++++++
 .../src/tests/cases/pass/binops/source.lua    |    8 +
 .../src/tests/cases/pass/binops/tokens.snap   | 1425 +++++
 .../cases/pass/body-with-spaces/ast.snap      |   62 +
 .../cases/pass/body-with-spaces/source.lua    |    3 +
 .../cases/pass/body-with-spaces/tokens.snap   |   59 +
 .../src/tests/cases/pass/call-1/ast.snap      |  265 +
 .../src/tests/cases/pass/call-1/source.lua    |    3 +
 .../src/tests/cases/pass/call-1/tokens.snap   |  193 +
 .../src/tests/cases/pass/call-2/ast.snap      |  224 +
 .../src/tests/cases/pass/call-2/source.lua    |    2 +
 .../src/tests/cases/pass/call-2/tokens.snap   |  162 +
 .../src/tests/cases/pass/do/ast.snap          |  129 +
 .../src/tests/cases/pass/do/source.lua        |    3 +
 .../src/tests/cases/pass/do/tokens.snap       |  105 +
 .../src/tests/cases/pass/empty/ast.snap       |    8 +
 .../src/tests/cases/pass/empty/source.lua     |    0
 .../src/tests/cases/pass/empty/tokens.snap    |   17 +
 .../src/tests/cases/pass/exponents/ast.snap   |  330 +
 .../src/tests/cases/pass/exponents/source.lua |    3 +
 .../tests/cases/pass/exponents/tokens.snap    |  270 +
 .../cases/pass/fractional-numbers/ast.snap    |  563 ++
 .../cases/pass/fractional-numbers/source.lua  |    5 +
 .../cases/pass/fractional-numbers/tokens.snap |  457 ++
 .../pass/function-declaration-1/ast.snap      |  192 +
 .../pass/function-declaration-1/source.lua    |    3 +
 .../pass/function-declaration-1/tokens.snap   |  149 +
 .../pass/function-declaration-2/ast.snap      |  173 +
 .../pass/function-declaration-2/source.lua    |    1 +
 .../pass/function-declaration-2/tokens.snap   |  138 +
 .../cases/pass/function-shortcuts/ast.snap    |  224 +
 .../cases/pass/function-shortcuts/source.lua  |    2 +
 .../cases/pass/function-shortcuts/tokens.snap |  183 +
 .../cases/pass/generic-for-loop-1/ast.snap    |  392 ++
 .../cases/pass/generic-for-loop-1/source.lua  |    3 +
 .../cases/pass/generic-for-loop-1/tokens.snap |  303 +
 .../cases/pass/generic-for-loop-2/ast.snap    |  380 ++
 .../cases/pass/generic-for-loop-2/source.lua  |    3 +
 .../cases/pass/generic-for-loop-2/tokens.snap |  303 +
 .../cases/pass/goto-as-identifier/ast.snap    |  133 +
 .../cases/pass/goto-as-identifier/source.lua  |    2 +
 .../cases/pass/goto-as-identifier/tokens.snap |  105 +
 .../src/tests/cases/pass/gt-lt/ast.snap       |  684 ++
 .../src/tests/cases/pass/gt-lt/source.lua     |    5 +
 .../src/tests/cases/pass/gt-lt/tokens.snap    |  501 ++
 .../src/tests/cases/pass/if-1/ast.snap        |  186 +
 .../src/tests/cases/pass/if-1/source.lua      |    3 +
 .../src/tests/cases/pass/if-1/tokens.snap     |  149 +
 .../src/tests/cases/pass/if-2/ast.snap        |  288 +
 .../src/tests/cases/pass/if-2/source.lua      |    5 +
 .../src/tests/cases/pass/if-2/tokens.snap     |  226 +
 .../src/tests/cases/pass/if-3/ast.snap        |  344 +
 .../src/tests/cases/pass/if-3/source.lua      |    5 +
 .../src/tests/cases/pass/if-3/tokens.snap     |  270 +
 .../src/tests/cases/pass/if-4/ast.snap        |  446 ++
 .../src/tests/cases/pass/if-4/source.lua      |    7 +
 .../src/tests/cases/pass/if-4/tokens.snap     |  347 +
 .../src/tests/cases/pass/index-1/ast.snap     |  176 +
 .../src/tests/cases/pass/index-1/source.lua   |    1 +
 .../src/tests/cases/pass/index-1/tokens.snap  |  138 +
 .../src/tests/cases/pass/index-2/ast.snap     |  196 +
 .../src/tests/cases/pass/index-2/source.lua   |    1 +
 .../src/tests/cases/pass/index-2/tokens.snap  |  150 +
 .../cases/pass/local-assignment-1/ast.snap    |   56 +
 .../cases/pass/local-assignment-1/source.lua  |    1 +
 .../cases/pass/local-assignment-1/tokens.snap |   50 +
 .../cases/pass/local-assignment-2/ast.snap    |  108 +
 .../cases/pass/local-assignment-2/source.lua  |    1 +
 .../cases/pass/local-assignment-2/tokens.snap |   94 +
 .../cases/pass/local-assignment-3/ast.snap    |  573 ++
 .../cases/pass/local-assignment-3/source.lua  |    3 +
 .../cases/pass/local-assignment-3/tokens.snap |  468 ++
 .../cases/pass/local-assignment-4/ast.snap    |   96 +
 .../cases/pass/local-assignment-4/source.lua  |    1 +
 .../cases/pass/local-assignment-4/tokens.snap |   83 +
 .../cases/pass/local-assignment-5/ast.snap    |  252 +
 .../cases/pass/local-assignment-5/source.lua  |    3 +
 .../cases/pass/local-assignment-5/tokens.snap |  215 +
 .../cases/pass/local-function-1/ast.snap      |  241 +
 .../cases/pass/local-function-1/source.lua    |    3 +
 .../cases/pass/local-function-1/tokens.snap   |  193 +
 .../cases/pass/local-function-2/ast.snap      |  590 ++
 .../cases/pass/local-function-2/source.lua    |    3 +
 .../cases/pass/local-function-2/tokens.snap   |  468 ++
 .../pass/mixed-indented-comments/ast.snap     |    8 +
 .../pass/mixed-indented-comments/source.lua   |    4 +
 .../pass/mixed-indented-comments/tokens.snap  |   73 +
 .../cases/pass/multi-line-comments-1/ast.snap |    8 +
 .../pass/multi-line-comments-1/source.lua     |    5 +
 .../pass/multi-line-comments-1/tokens.snap    |   29 +
 .../cases/pass/multi-line-comments-2/ast.snap |    8 +
 .../pass/multi-line-comments-2/source.lua     |    4 +
 .../pass/multi-line-comments-2/tokens.snap    |   29 +
 .../cases/pass/multi-line-comments-3/ast.snap |    8 +
 .../pass/multi-line-comments-3/source.lua     |    3 +
 .../pass/multi-line-comments-3/tokens.snap    |   29 +
 .../cases/pass/multi-line-comments-4/ast.snap |    8 +
 .../pass/multi-line-comments-4/source.lua     |    5 +
 .../pass/multi-line-comments-4/tokens.snap    |   29 +
 .../cases/pass/multi-line-comments-5/ast.snap |    8 +
 .../pass/multi-line-comments-5/source.lua     |    6 +
 .../pass/multi-line-comments-5/tokens.snap    |   29 +
 .../cases/pass/multi-line-comments-6/ast.snap |  165 +
 .../pass/multi-line-comments-6/source.lua     |    2 +
 .../pass/multi-line-comments-6/tokens.snap    |  139 +
 .../cases/pass/multi-line-comments-7/ast.snap |    8 +
 .../pass/multi-line-comments-7/source.lua     |    3 +
 .../pass/multi-line-comments-7/tokens.snap    |   73 +
 .../cases/pass/multi-line-comments-8/ast.snap |  143 +
 .../pass/multi-line-comments-8/source.lua     |    2 +
 .../pass/multi-line-comments-8/tokens.snap    |  128 +
 .../cases/pass/multi-line-comments-9/ast.snap |    6 +
 .../pass/multi-line-comments-9/source.lua     |   21 +
 .../pass/multi-line-comments-9/tokens.snap    |   27 +
 .../cases/pass/multi-line-string-1/ast.snap   |  107 +
 .../cases/pass/multi-line-string-1/source.lua |    4 +
 .../pass/multi-line-string-1/tokens.snap      |   93 +
 .../cases/pass/multi-line-string-2/ast.snap   |  108 +
 .../cases/pass/multi-line-string-2/source.lua |    3 +
 .../pass/multi-line-string-2/tokens.snap      |   94 +
 .../cases/pass/multi-line-string-3/ast.snap   |  107 +
 .../cases/pass/multi-line-string-3/source.lua |    6 +
 .../pass/multi-line-string-3/tokens.snap      |   93 +
 .../cases/pass/multi-line-string-4/ast.snap   |   77 +
 .../cases/pass/multi-line-string-4/source.lua |    1 +
 .../pass/multi-line-string-4/tokens.snap      |   60 +
 .../cases/pass/multi-line-string-5/ast.snap   |  230 +
 .../cases/pass/multi-line-string-5/source.lua |    2 +
 .../pass/multi-line-string-5/tokens.snap      |  192 +
 .../cases/pass/multi-line-string-6/ast.snap   |  120 +
 .../cases/pass/multi-line-string-6/source.lua |    2 +
 .../pass/multi-line-string-6/tokens.snap      |  106 +
 .../cases/pass/multi-line-string-7/ast.snap   |  108 +
 .../cases/pass/multi-line-string-7/source.lua |    1 +
 .../pass/multi-line-string-7/tokens.snap      |   94 +
 .../cases/pass/multi-line-string-8/ast.snap   |  108 +
 .../cases/pass/multi-line-string-8/source.lua |    1 +
 .../pass/multi-line-string-8/tokens.snap      |   94 +
 .../cases/pass/negative-numbers/ast.snap      |  595 ++
 .../cases/pass/negative-numbers/source.lua    |    4 +
 .../cases/pass/negative-numbers/tokens.snap   |  444 ++
 .../src/tests/cases/pass/numbers-1/ast.snap   |   94 +
 .../src/tests/cases/pass/numbers-1/source.lua |    1 +
 .../tests/cases/pass/numbers-1/tokens.snap    |   83 +
 .../cases/pass/numeric-for-loop/ast.snap      |  736 +++
 .../cases/pass/numeric-for-loop/source.lua    |    3 +
 .../cases/pass/numeric-for-loop/tokens.snap   |  589 ++
 .../cases/pass/paren-expressions/ast.snap     |  252 +
 .../cases/pass/paren-expressions/source.lua   |    1 +
 .../cases/pass/paren-expressions/tokens.snap  |  204 +
 .../tests/cases/pass/repeat-until/ast.snap    |  157 +
 .../tests/cases/pass/repeat-until/source.lua  |    3 +
 .../tests/cases/pass/repeat-until/tokens.snap |  127 +
 .../tests/cases/pass/return-break/ast.snap    |  346 +
 .../tests/cases/pass/return-break/source.lua  |    9 +
 .../tests/cases/pass/return-break/tokens.snap |  281 +
 .../tests/cases/pass/semicolons-1/ast.snap    |  264 +
 .../tests/cases/pass/semicolons-1/source.lua  |    1 +
 .../tests/cases/pass/semicolons-1/tokens.snap |  215 +
 .../tests/cases/pass/semicolons-2/ast.snap    |  180 +
 .../tests/cases/pass/semicolons-2/source.lua  |    2 +
 .../tests/cases/pass/semicolons-2/tokens.snap |  149 +
 .../src/tests/cases/pass/shebang/ast.snap     |  136 +
 .../src/tests/cases/pass/shebang/source.lua   |    3 +
 .../src/tests/cases/pass/shebang/tokens.snap  |  117 +
 .../cases/pass/single-line-comment-1/ast.snap |    8 +
 .../pass/single-line-comment-1/source.lua     |    2 +
 .../pass/single-line-comment-1/tokens.snap    |   50 +
 .../cases/pass/single-line-comment-2/ast.snap |   84 +
 .../pass/single-line-comment-2/source.lua     |    1 +
 .../pass/single-line-comment-2/tokens.snap    |   72 +
 .../cases/pass/single-line-comment-3/ast.snap |    8 +
 .../pass/single-line-comment-3/source.lua     |    1 +
 .../pass/single-line-comment-3/tokens.snap    |   28 +
 .../cases/pass/single-line-comment-4/ast.snap |    8 +
 .../pass/single-line-comment-4/source.lua     |    4 +
 .../pass/single-line-comment-4/tokens.snap    |  105 +
 .../cases/pass/single-line-comment-5/ast.snap |    7 +
 .../pass/single-line-comment-5/source.lua     |    2 +
 .../pass/single-line-comment-5/tokens.snap    |   49 +
 .../cases/pass/single-line-comment-6/ast.snap |    7 +
 .../pass/single-line-comment-6/source.lua     |    1 +
 .../pass/single-line-comment-6/tokens.snap    |   39 +
 .../cases/pass/single-line-comment-7/ast.snap |  119 +
 .../pass/single-line-comment-7/source.lua     |    3 +
 .../pass/single-line-comment-7/tokens.snap    |  127 +
 .../pass/strings-escape-newline/ast.snap      |   90 +
 .../pass/strings-escape-newline/source.lua    |    2 +
 .../pass/strings-escape-newline/tokens.snap   |   73 +
 .../tests/cases/pass/strings-escape/ast.snap  |  385 ++
 .../cases/pass/strings-escape/source.lua      |    3 +
 .../cases/pass/strings-escape/tokens.snap     |  284 +
 .../src/tests/cases/pass/strings/ast.snap     |  325 +
 .../src/tests/cases/pass/strings/source.lua   |    4 +
 .../src/tests/cases/pass/strings/tokens.snap  |  230 +
 .../cases/pass/table-constructor-1/ast.snap   |  137 +
 .../cases/pass/table-constructor-1/source.lua |    2 +
 .../pass/table-constructor-1/tokens.snap      |  116 +
 .../cases/pass/table-constructor-2/ast.snap   |  227 +
 .../cases/pass/table-constructor-2/source.lua |    1 +
 .../pass/table-constructor-2/tokens.snap      |  182 +
 .../cases/pass/table-constructor-3/ast.snap   |  910 +++
 .../cases/pass/table-constructor-3/source.lua |   11 +
 .../pass/table-constructor-3/tokens.snap      |  754 +++
 .../cases/pass/table-constructor-4/ast.snap   |  312 +
 .../cases/pass/table-constructor-4/source.lua |    3 +
 .../pass/table-constructor-4/tokens.snap      |  248 +
 .../cases/pass/table-constructor-5/ast.snap   |  365 ++
 .../cases/pass/table-constructor-5/source.lua |    4 +
 .../pass/table-constructor-5/tokens.snap      |  292 +
 .../cases/pass/table-constructor-6/ast.snap   |  166 +
 .../cases/pass/table-constructor-6/source.lua |    1 +
 .../pass/table-constructor-6/tokens.snap      |  138 +
 .../cases/pass/table-constructors-7/ast.snap  |  551 ++
 .../pass/table-constructors-7/source.lua      |    5 +
 .../pass/table-constructors-7/tokens.snap     |  449 ++
 .../cases/pass/table-constructors-8/ast.snap  |  373 ++
 .../pass/table-constructors-8/source.lua      |    4 +
 .../pass/table-constructors-8/tokens.snap     |  307 +
 .../tests/cases/pass/trivia-parsing/ast.snap  |  734 +++
 .../cases/pass/trivia-parsing/source.lua      |   11 +
 .../cases/pass/trivia-parsing/tokens.snap     |  611 ++
 .../src/tests/cases/pass/unops/ast.snap       |  667 ++
 .../src/tests/cases/pass/unops/source.lua     |    5 +
 .../src/tests/cases/pass/unops/tokens.snap    |  523 ++
 .../src/tests/cases/pass/utf-8/ast.snap       |  136 +
 .../src/tests/cases/pass/utf-8/source.lua     |    1 +
 .../src/tests/cases/pass/utf-8/tokens.snap    |  106 +
 .../src/tests/cases/pass/while/ast.snap       |  222 +
 .../src/tests/cases/pass/while/source.lua     |    4 +
 .../src/tests/cases/pass/while/tokens.snap    |  182 +
 .../src/tests/comments_around_functions.rs    |   52 +
 src/Rust/vvs_parser/src/tests/common.rs       |   19 +
 src/Rust/vvs_parser/src/tests/derive_node.rs  |   32 +
 src/Rust/vvs_parser/src/tests/fail_cases.rs   |   94 +
 .../lua52_cases/fail/parser/goto-1/ast.snap   |   23 +
 .../fail/parser/goto-1/ast_to_string.snap     |    8 +
 .../fail/parser/goto-1/error_display.snap     |   11 +
 .../fail/parser/goto-1/errors.snap            |   19 +
 .../lua52_cases/fail/parser/goto-1/source.lua |    1 +
 .../fail/parser/goto-1/tokens.snap            |   27 +
 .../lua52_cases/fail/parser/label-1/ast.snap  |   22 +
 .../fail/parser/label-1/ast_to_string.snap    |    7 +
 .../fail/parser/label-1/error_display.snap    |   17 +
 .../fail/parser/label-1/errors.snap           |   33 +
 .../fail/parser/label-1/source.lua            |    1 +
 .../fail/parser/label-1/tokens.snap           |   39 +
 .../lua52_cases/fail/parser/label-2/ast.snap  |   23 +
 .../fail/parser/label-2/ast_to_string.snap    |    8 +
 .../fail/parser/label-2/error_display.snap    |   17 +
 .../fail/parser/label-2/errors.snap           |   34 +
 .../fail/parser/label-2/source.lua            |    1 +
 .../fail/parser/label-2/tokens.snap           |   39 +
 .../pass/not-z-escape-string/ast.snap         |   79 +
 .../pass/not-z-escape-string/source.lua       |    2 +
 .../pass/not-z-escape-string/tokens.snap      |   60 +
 .../tests/lua52_cases/pass/numbers/ast.snap   |  429 ++
 .../tests/lua52_cases/pass/numbers/source.lua |   15 +
 .../lua52_cases/pass/numbers/tokens.snap      |  512 ++
 .../lua52_cases/pass/z-escape-string/ast.snap |   79 +
 .../pass/z-escape-string/source.lua           |    2 +
 .../pass/z-escape-string/tokens.snap          |   60 +
 .../parser/double-greater-than-binop/ast.snap |  156 +
 .../ast_to_string.snap                        |    8 +
 .../double-greater-than-binop/error.snap      |   19 +
 .../error_display.snap                        |   19 +
 .../double-greater-than-binop/errors.snap     |   34 +
 .../double-greater-than-binop/source.lua      |    2 +
 .../double-greater-than-binop/tokens.snap     |  180 +
 .../pass/binary-operators/ast.snap            | 1009 +++
 .../pass/binary-operators/source.lua          |    6 +
 .../pass/binary-operators/tokens.snap         |  808 +++
 .../lua53_cases/pass/unary-operators/ast.snap |  126 +
 .../pass/unary-operators/source.lua           |    1 +
 .../pass/unary-operators/tokens.snap          |  103 +
 .../fail/parser/unclosed-attribute-1/ast.snap |  127 +
 .../unclosed-attribute-1/ast_to_string.snap   |    7 +
 .../parser/unclosed-attribute-1/error.snap    |   19 +
 .../unclosed-attribute-1/error_display.snap   |   12 +
 .../parser/unclosed-attribute-1/errors.snap   |   19 +
 .../parser/unclosed-attribute-1/source.lua    |    1 +
 .../parser/unclosed-attribute-1/tokens.snap   |   82 +
 .../fail/parser/unclosed-attribute-2/ast.snap |  179 +
 .../unclosed-attribute-2/ast_to_string.snap   |    7 +
 .../parser/unclosed-attribute-2/error.snap    |   20 +
 .../unclosed-attribute-2/error_display.snap   |   12 +
 .../parser/unclosed-attribute-2/errors.snap   |   20 +
 .../parser/unclosed-attribute-2/source.lua    |    1 +
 .../parser/unclosed-attribute-2/tokens.snap   |  126 +
 .../lua54_cases/pass/attributes/ast.snap      | 1051 +++
 .../lua54_cases/pass/attributes/source.lua    |    5 +
 .../lua54_cases/pass/attributes/tokens.snap   |  829 +++
 src/Rust/vvs_parser/src/tests/mod.rs          |    8 +
 src/Rust/vvs_parser/src/tests/node.rs         |   38 +
 .../vvs_parser/src/tests/one_line_range.rs    |   26 +
 .../fail/parser/keyword1/error_display.snap   |   10 +
 .../fail/parser/keyword1/errors.snap          |   19 +
 .../fail/parser/keyword1/option_table.snap    |    6 +
 .../fail/parser/keyword1/source.ini           |    2 +
 .../fail/parser/keyword1/tokens.snap          |  125 +
 .../fail/parser/keyword2/error_display.snap   |   16 +
 .../fail/parser/keyword2/errors.snap          |   33 +
 .../fail/parser/keyword2/option_table.snap    |    6 +
 .../fail/parser/keyword2/source.ini           |    2 +
 .../fail/parser/keyword2/tokens.snap          |  125 +
 .../option_cases/pass/complex/options.snap    |   90 +
 .../option_cases/pass/complex/source.ini      |    2 +
 .../option_cases/pass/complex/tokens.snap     |  169 +
 .../option_cases/pass/empty/options.snap      |    6 +
 .../tests/option_cases/pass/empty/source.ini  |    0
 .../tests/option_cases/pass/empty/tokens.snap |   15 +
 .../option_cases/pass/simple/options.snap     |   90 +
 .../tests/option_cases/pass/simple/source.ini |    6 +
 .../option_cases/pass/simple/tokens.snap      |  313 +
 src/Rust/vvs_parser/src/tests/pass_cases.rs   |   87 +
 .../function_return_type_thin_arrow/ast.snap  |  254 +
 .../ast_to_string.snap                        |    6 +
 .../error_display.snap                        |   11 +
 .../errors.snap                               |   19 +
 .../source.lua                                |    3 +
 .../tokens.snap                               |  192 +
 .../parser/named_function_arg_types/ast.snap  |   21 +
 .../ast_to_string.snap                        |    6 +
 .../named_function_arg_types/error.snap       |   19 +
 .../error_display.snap                        |   11 +
 .../named_function_arg_types/errors.snap      |   18 +
 .../named_function_arg_types/source.lua       |    1 +
 .../named_function_arg_types/tokens.snap      |  148 +
 .../roblox_cases/fail/parser/nil_dot/ast.snap |  117 +
 .../fail/parser/nil_dot/ast_to_string.snap    |    6 +
 .../fail/parser/nil_dot/error.snap            |   22 +
 .../fail/parser/nil_dot/error_display.snap    |   35 +
 .../fail/parser/nil_dot/errors.snap           |   75 +
 .../fail/parser/nil_dot/source.lua            |    1 +
 .../fail/parser/nil_dot/tokens.snap           |  161 +
 .../parser/type_table_no_right_brace/ast.snap |  411 ++
 .../ast_to_string.snap                        |    6 +
 .../error_display.snap                        |   11 +
 .../type_table_no_right_brace/errors.snap     |   19 +
 .../type_table_no_right_brace/source.lua      |    3 +
 .../type_table_no_right_brace/tokens.snap     |  312 +
 .../pass/compound_assignment/ast.snap         | 1824 ++++++
 .../pass/compound_assignment/source.lua       |   24 +
 .../pass/compound_assignment/tokens.snap      | 1461 +++++
 .../tests/roblox_cases/pass/continue/ast.snap |  365 ++
 .../roblox_cases/pass/continue/source.lua     |    7 +
 .../roblox_cases/pass/continue/tokens.snap    |  303 +
 .../pass/decimal_seperators/ast.snap          |  663 ++
 .../pass/decimal_seperators/source.lua        |    6 +
 .../pass/decimal_seperators/tokens.snap       |  534 ++
 .../roblox_cases/pass/floor_division/ast.snap |  173 +
 .../pass/floor_division/source.lua            |    1 +
 .../pass/floor_division/tokens.snap           |  147 +
 .../roblox_cases/pass/if_expression/ast.snap  | 3198 ++++++++++
 .../pass/if_expression/source.lua             |   11 +
 .../pass/if_expression/tokens.snap            | 2480 ++++++++
 .../pass/multiline_expressions/ast.snap       | 2231 +++++++
 .../pass/multiline_expressions/source.lua     |   12 +
 .../pass/multiline_expressions/tokens.snap    | 1689 +++++
 .../pass/named_function_arg_types/ast.snap    | 1983 ++++++
 .../pass/named_function_arg_types/source.lua  |   11 +
 .../pass/named_function_arg_types/tokens.snap | 1544 +++++
 .../pass/no_roblox_syntax/ast.snap            | 5623 +++++++++++++++++
 .../pass/no_roblox_syntax/source.lua          |   51 +
 .../pass/no_roblox_syntax/tokens.snap         | 4246 +++++++++++++
 .../tests/roblox_cases/pass/types/ast.snap    | 3823 +++++++++++
 .../tests/roblox_cases/pass/types/source.lua  |   30 +
 .../tests/roblox_cases/pass/types/tokens.snap | 2996 +++++++++
 .../pass/types_chained_optionals/ast.snap     |  655 ++
 .../pass/types_chained_optionals/source.lua   |    5 +
 .../pass/types_chained_optionals/tokens.snap  |  521 ++
 .../roblox_cases/pass/types_loops/ast.snap    |  605 ++
 .../roblox_cases/pass/types_loops/source.lua  |    7 +
 .../roblox_cases/pass/types_loops/tokens.snap |  490 ++
 .../pass/types_nested_array/ast.snap          |  532 ++
 .../pass/types_nested_array/source.lua        |    2 +
 .../pass/types_nested_array/tokens.snap       |  434 ++
 .../pass/types_semicolon_delimeter/ast.snap   |  321 +
 .../pass/types_semicolon_delimeter/source.lua |    4 +
 .../types_semicolon_delimeter/tokens.snap     |  269 +
 .../pass/z-escape-string/ast.snap             |  181 +
 .../pass/z-escape-string/source.lua           |    5 +
 .../pass/z-escape-string/tokens.snap          |  138 +
 src/Rust/vvs_parser/src/tests/visitors.rs     |  164 +
 .../tests/vivy_cases/fail/parser/job/ast.snap |   21 +
 .../fail/parser/job/ast_to_string.snap        |    6 +
 .../fail/parser/job/error_display.snap        |   10 +
 .../vivy_cases/fail/parser/job/errors.snap    |   19 +
 .../vivy_cases/fail/parser/job/source.lua     |    1 +
 .../vivy_cases/fail/parser/job/tokens.snap    |  125 +
 .../fail/parser/main_after_returns/ast.snap   |  169 +
 .../main_after_returns/ast_to_string.snap     |    6 +
 .../main_after_returns/error_display.snap     |   16 +
 .../parser/main_after_returns/errors.snap     |   35 +
 .../fail/parser/main_after_returns/source.lua |    4 +
 .../parser/main_after_returns/tokens.snap     |  327 +
 .../fail/parser/option_decl_1/ast.snap        |   21 +
 .../parser/option_decl_1/ast_to_string.snap   |    6 +
 .../parser/option_decl_1/error_display.snap   |   16 +
 .../fail/parser/option_decl_1/errors.snap     |   32 +
 .../fail/parser/option_decl_1/source.lua      |    1 +
 .../fail/parser/option_decl_1/tokens.snap     |   59 +
 .../fail/parser/option_decl_2/ast.snap        |  107 +
 .../parser/option_decl_2/ast_to_string.snap   |    6 +
 .../parser/option_decl_2/error_display.snap   |   22 +
 .../fail/parser/option_decl_2/errors.snap     |   47 +
 .../fail/parser/option_decl_2/source.lua      |    1 +
 .../fail/parser/option_decl_2/tokens.snap     |  125 +
 .../src/tests/vivy_cases/pass/import/ast.snap |   62 +
 .../tests/vivy_cases/pass/import/source.lua   |    1 +
 .../tests/vivy_cases/pass/import/tokens.snap  |   60 +
 .../src/tests/vivy_cases/pass/job/ast.snap    |  126 +
 .../src/tests/vivy_cases/pass/job/source.lua  |    1 +
 .../src/tests/vivy_cases/pass/job/tokens.snap |  103 +
 .../tests/vivy_cases/pass/job_yield/ast.snap  |  963 +++
 .../vivy_cases/pass/job_yield/source.lua      |    7 +
 .../vivy_cases/pass/job_yield/tokens.snap     |  763 +++
 .../tests/vivy_cases/pass/main_busy/ast.snap  | 1245 ++++
 .../vivy_cases/pass/main_busy/source.lua      |    8 +
 .../vivy_cases/pass/main_busy/tokens.snap     | 1038 +++
 .../tests/vivy_cases/pass/main_empty/ast.snap |  115 +
 .../vivy_cases/pass/main_empty/source.lua     |    2 +
 .../vivy_cases/pass/main_empty/tokens.snap    |  104 +
 .../vivy_cases/pass/main_returns/ast.snap     |  183 +
 .../vivy_cases/pass/main_returns/source.lua   |    3 +
 .../vivy_cases/pass/main_returns/tokens.snap  |  160 +
 .../vivy_cases/pass/option_decl_1/ast.snap    |  160 +
 .../vivy_cases/pass/option_decl_1/source.lua  |    1 +
 .../vivy_cases/pass/option_decl_1/tokens.snap |  136 +
 .../vivy_cases/pass/option_decl_2/ast.snap    |  117 +
 .../vivy_cases/pass/option_decl_2/source.lua  |    1 +
 .../vivy_cases/pass/option_decl_2/tokens.snap |  103 +
 .../vivy_cases/pass/write_multiple/ast.snap   |  274 +
 .../vivy_cases/pass/write_multiple/source.lua |    3 +
 .../pass/write_multiple/tokens.snap           |  238 +
 .../vivy_cases/pass/write_single/ast.snap     |  183 +
 .../vivy_cases/pass/write_single/source.lua   |    3 +
 .../vivy_cases/pass/write_single/tokens.snap  |  160 +
 src/Rust/vvs_parser/src/tokenizer/lexer.rs    |  764 +++
 src/Rust/vvs_parser/src/tokenizer/mod.rs      |    8 +
 src/Rust/vvs_parser/src/tokenizer/structs.rs  |  719 +++
 src/Rust/vvs_parser/src/traits.rs             |   85 +
 src/Rust/vvs_parser/src/util.rs               |  111 +
 src/Rust/vvs_parser/src/visitors.rs           |  227 +
 src/Rust/vvs_parser/src/vivy/error_report.rs  |  126 +
 .../vvs_parser/src/vivy/frontend_pipeline.rs  |  327 +
 src/Rust/vvs_parser/src/vivy/library.rs       |  333 +
 src/Rust/vvs_parser/src/vivy/main_program.rs  |  120 +
 src/Rust/vvs_parser/src/vivy/mod.rs           |   45 +
 src/Rust/vvs_parser/src/vivy/passes/mod.rs    |  141 +
 .../src/vivy/passes/opts_transform.rs         |   49 +
 .../src/vivy/passes/stmt_checker.rs           |  259 +
 .../src/vivy/passes/type_checker.rs           |  551 ++
 .../src/vivy/passes/type_collector.rs         |   11 +
 src/Rust/vvs_parser/src/vivy/search_path.rs   |   51 +
 src/Rust/vvs_parser/src/vivy/symbol_table.rs  |  103 +
 src/Rust/vvs_parser/vivy-script.vim           |   37 +
 src/Rust/vvs_parser_derive/Cargo.toml         |   18 +
 src/Rust/vvs_parser_derive/LICENSE.md         |  347 +
 src/Rust/vvs_parser_derive/src/derive.rs      |  139 +
 src/Rust/vvs_parser_derive/src/lib.rs         |   21 +
 src/Rust/vvs_parser_derive/src/node.rs        |  429 ++
 src/Rust/vvs_parser_derive/src/visit.rs       |  264 +
 src/Rust/vvs_procmacro/Cargo.toml             |   12 +-
 src/Rust/vvs_procmacro/src/enums.rs           |   62 +
 src/Rust/vvs_procmacro/src/lib.rs             |  114 +-
 src/Rust/vvs_procmacro/src/vvrt/gen.rs        |  134 +
 src/Rust/vvs_procmacro/src/vvrt/mod.rs        |   75 +
 src/Rust/vvs_procmacro/src/vvrt/structs.rs    |   69 +
 src/Rust/vvs_runtime/Cargo.toml               |   21 +
 src/Rust/vvs_runtime/build.rs                 |    3 +
 src/Rust/vvs_runtime/src/jit.rs               |  157 +
 src/Rust/vvs_runtime/src/lib.rs               |    6 +
 src/Rust/vvs_runtime/src/workers.rs           |  106 +
 src/Rust/vvs_runtime_types/Cargo.toml         |   26 +
 src/Rust/vvs_runtime_types/build.rs           |    3 +
 src/Rust/vvs_runtime_types/src/lib.rs         |   13 +
 src/Rust/vvs_runtime_types/src/mangle.rs      |  163 +
 src/Rust/vvs_runtime_types/src/pointer.rs     |  140 +
 src/Rust/vvs_runtime_types/src/tests.rs       |  136 +
 src/Rust/vvs_runtime_types/src/types/any.rs   |  318 +
 src/Rust/vvs_runtime_types/src/types/line.rs  |   90 +
 src/Rust/vvs_runtime_types/src/types/mod.rs   |  178 +
 .../vvs_runtime_types/src/types/number.rs     |  116 +
 .../vvs_runtime_types/src/types/sequence.rs   |  107 +
 .../vvs_runtime_types/src/types/string.rs     |  122 +
 .../vvs_runtime_types/src/types/syllabe.rs    |   91 +
 src/Rust/vvs_runtime_types/src/types/table.rs |  171 +
 src/Rust/vvs_runtime_types/src/types/test.rs  |   30 +
 .../vvs_runtime_types/src/types/variant.rs    |  361 ++
 src/Rust/vvs_runtime_types/src/vvll.rs        |  101 +
 src/Rust/vvs_utils/Cargo.toml                 |    9 +-
 src/Rust/vvs_utils/src/angles.rs              |    4 +
 src/Rust/vvs_utils/src/assert.rs              |    2 +-
 src/Rust/vvs_utils/src/conds.rs               |    2 +
 src/Rust/vvs_utils/src/file/lock.rs           |    7 +
 src/Rust/vvs_utils/src/file/temp.rs           |   11 +-
 src/Rust/vvs_utils/src/lib.rs                 |    1 -
 src/Rust/vvs_utils/src/rand.rs                |    6 +-
 src/Rust/vvs_utils/src/xdg/config.rs          |   33 +-
 src/Rust/vvs_utils/src/xdg/folders.rs         |   12 +-
 src/Rust/vvs_utils/src/xdg/mod.rs             |    1 +
 src/Rust/vvs_utils/src/xdg/paths.rs           |   17 +-
 utils/lua/sample-spec.module                  |   54 -
 utils/lua/simple.module                       |   48 -
 utils/samples/hwlock.rs                       |   64 +
 utils/scripts/build-libvivy.bash              |   13 +
 1202 files changed, 145858 insertions(+), 2710 deletions(-)
 delete mode 100644 rsc/fonts/NotoSans-Bold.ttf
 delete mode 100644 rsc/fonts/NotoSans-BoldItalic.ttf
 delete mode 100644 rsc/fonts/NotoSans-Italic.ttf
 delete mode 100644 src/Rust/README.md
 create mode 100644 src/Rust/VVLib.h
 create mode 100644 src/Rust/VVLib.hh
 create mode 100644 src/Rust/benches/date.lua
 create mode 100644 src/Rust/benches/date.rs
 create mode 100644 src/Rust/benches/t.lua
 create mode 100644 src/Rust/benches/t.rs
 create mode 100644 src/Rust/vvs_ass/src/elements/aux_table.rs
 delete mode 100644 src/Rust/vvs_ass/src/values.rs
 create mode 100644 src/Rust/vvs_cli/build.rs
 create mode 100644 src/Rust/vvs_codegen/Cargo.toml
 create mode 100644 src/Rust/vvs_codegen/build.rs
 create mode 100644 src/Rust/vvs_codegen/src/context.rs
 create mode 100644 src/Rust/vvs_codegen/src/graph.rs
 create mode 100644 src/Rust/vvs_codegen/src/lib.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/calls.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/cast.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/constant.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/drops.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/expression.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/function.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/instruction.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/mod.rs
 create mode 100644 src/Rust/vvs_codegen/src/lowerer/types.rs
 create mode 100644 src/Rust/vvs_codegen/src/value.rs
 delete mode 100644 src/Rust/vvs_lang/VVL.g4
 delete mode 100644 src/Rust/vvs_lang/VVS.g4
 delete mode 100644 src/Rust/vvs_lang/samples/retime.vvl
 delete mode 100644 src/Rust/vvs_lang/samples/test.vvs
 create mode 100644 src/Rust/vvs_lang/src/ast/constant.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/expression.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/extension.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/function.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/identifier.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/import.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/instruction.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/maybe_const_expr.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/options.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/pattern.rs
 delete mode 100644 src/Rust/vvs_lang/src/ast/tree.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/type_context.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/typed.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/types.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/variable.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/variant.rs
 create mode 100644 src/Rust/vvs_lang/src/ast/visibility.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/error.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/mod.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/string.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/types.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/vvl.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/vvl/expr.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/vvl/inst.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/vvl/tabl.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/vvl/tupl.rs
 delete mode 100644 src/Rust/vvs_lang/src/parser/vvs.rs
 create mode 100644 src/Rust/vvs_lib/Cargo.toml
 create mode 100644 src/Rust/vvs_lib/build.rs
 create mode 100644 src/Rust/vvs_lib/src/ass_elements.rs
 create mode 100644 src/Rust/vvs_lib/src/ass_style.rs
 create mode 100644 src/Rust/vvs_lib/src/aux_table.rs
 create mode 100644 src/Rust/vvs_lib/src/lib.rs
 create mode 100644 src/Rust/vvs_lib/src/vivy.rs
 create mode 100644 src/Rust/vvs_lib/test/sample.vivy
 create mode 100644 src/Rust/vvs_llvm/Cargo.toml
 create mode 100644 src/Rust/vvs_llvm/src/init.rs
 create mode 100644 src/Rust/vvs_llvm/src/iter.rs
 create mode 100644 src/Rust/vvs_llvm/src/lib.rs
 create mode 100644 src/Rust/vvs_parser/Cargo.toml
 create mode 100644 src/Rust/vvs_parser/LICENSE.md
 create mode 100644 src/Rust/vvs_parser/README.md
 create mode 100644 src/Rust/vvs_parser/samples/options.ini
 create mode 100644 src/Rust/vvs_parser/samples/retime.vvs
 create mode 100644 src/Rust/vvs_parser/samples/tag.vvs
 create mode 100644 src/Rust/vvs_parser/samples/test.vvs
 create mode 100644 src/Rust/vvs_parser/src/ast/mod.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/options.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/parsers/mod.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/parsers/structs/ast_result.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/parsers/structs/mod.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/parsers/structs/option_table_result.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/parsers/structs/result.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/parsers/util.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/punctuated.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/span.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/update_positions.rs
 create mode 100644 src/Rust/vvs_parser/src/ast/visitors.rs
 create mode 100644 src/Rust/vvs_parser/src/error.rs
 create mode 100644 src/Rust/vvs_parser/src/lib.rs
 create mode 100644 src/Rust/vvs_parser/src/node.rs
 create mode 100644 src/Rust/vvs_parser/src/private.rs
 create mode 100644 src/Rust/vvs_parser/src/short_string.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/tokens_result.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/tokens_result.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/tokens_result.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/tokens_result.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/tokens_result.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/tokens_result.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/tokens_result.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/tokens_result.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/binops/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/binops/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/binops/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/call-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/call-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/call-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/call-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/call-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/call-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/do/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/do/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/do/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/empty/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/empty/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/empty/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/exponents/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/exponents/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/exponents/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/if-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/index-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/index-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/index-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/index-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/index-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/index-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/return-break/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/return-break/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/return-break/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/shebang/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/shebang/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/shebang/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/strings/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/unops/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/unops/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/unops/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/utf-8/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/utf-8/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/utf-8/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/while/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/while/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/cases/pass/while/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/comments_around_functions.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/common.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/derive_node.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/fail_cases.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/error.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/error.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/error.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/mod.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/node.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/one_line_range.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/option_table.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/source.ini
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/option_table.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/source.ini
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/complex/options.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/complex/source.ini
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/complex/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/empty/options.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/empty/source.ini
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/empty/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/simple/options.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/simple/source.ini
 create mode 100644 src/Rust/vvs_parser/src/tests/option_cases/pass/simple/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/pass_cases.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/error.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/error.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/visitors.rs
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/ast_to_string.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/error_display.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/errors.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/ast.snap
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/source.lua
 create mode 100644 src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/tokens.snap
 create mode 100644 src/Rust/vvs_parser/src/tokenizer/lexer.rs
 create mode 100644 src/Rust/vvs_parser/src/tokenizer/mod.rs
 create mode 100644 src/Rust/vvs_parser/src/tokenizer/structs.rs
 create mode 100644 src/Rust/vvs_parser/src/traits.rs
 create mode 100644 src/Rust/vvs_parser/src/util.rs
 create mode 100644 src/Rust/vvs_parser/src/visitors.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/error_report.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/frontend_pipeline.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/library.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/main_program.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/mod.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/passes/mod.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/passes/opts_transform.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/passes/stmt_checker.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/passes/type_checker.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/passes/type_collector.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/search_path.rs
 create mode 100644 src/Rust/vvs_parser/src/vivy/symbol_table.rs
 create mode 100644 src/Rust/vvs_parser/vivy-script.vim
 create mode 100644 src/Rust/vvs_parser_derive/Cargo.toml
 create mode 100644 src/Rust/vvs_parser_derive/LICENSE.md
 create mode 100644 src/Rust/vvs_parser_derive/src/derive.rs
 create mode 100644 src/Rust/vvs_parser_derive/src/lib.rs
 create mode 100644 src/Rust/vvs_parser_derive/src/node.rs
 create mode 100644 src/Rust/vvs_parser_derive/src/visit.rs
 create mode 100644 src/Rust/vvs_procmacro/src/enums.rs
 create mode 100644 src/Rust/vvs_procmacro/src/vvrt/gen.rs
 create mode 100644 src/Rust/vvs_procmacro/src/vvrt/mod.rs
 create mode 100644 src/Rust/vvs_procmacro/src/vvrt/structs.rs
 create mode 100644 src/Rust/vvs_runtime/Cargo.toml
 create mode 100644 src/Rust/vvs_runtime/build.rs
 create mode 100644 src/Rust/vvs_runtime/src/jit.rs
 create mode 100644 src/Rust/vvs_runtime/src/lib.rs
 create mode 100644 src/Rust/vvs_runtime/src/workers.rs
 create mode 100644 src/Rust/vvs_runtime_types/Cargo.toml
 create mode 100644 src/Rust/vvs_runtime_types/build.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/lib.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/mangle.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/pointer.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/tests.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/any.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/line.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/mod.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/number.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/sequence.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/string.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/syllabe.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/table.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/test.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/types/variant.rs
 create mode 100644 src/Rust/vvs_runtime_types/src/vvll.rs
 delete mode 100644 utils/lua/sample-spec.module
 delete mode 100644 utils/lua/simple.module
 create mode 100644 utils/samples/hwlock.rs
 create mode 100755 utils/scripts/build-libvivy.bash

diff --git a/.gitignore b/.gitignore
index 7e8ea38a..68ec4729 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,7 +19,6 @@ build.clang/*
 # Local configurations
 .vim/*
 .vscode/*
-
-# CCLS styff
+.idea/
 .ccls*/
 .ccls
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 08e07772..e9493eb8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,45 +11,46 @@ endif()
 message(STATUS "The installation prefix is ${CMAKE_INSTALL_PREFIX}")
 message(STATUS "The build type is ${CMAKE_BUILD_TYPE}")
 
-# Don't forget for specific things
-if(WIN32)
-    message(STATUS "You are building on windows, pay attenion to the dependencies")
-endif()
-if(MSVC OR MSYS OR MINGW)
-    message(STATUS "You are building with a windows compiler")
-elseif(APPLE)
-    message(STATUS "You are building on MacOS X")
-elseif(UNIX AND NOT APPLE)
-    message(STATUS "You are building on Linux, FreeBSD or any other toaster OS")
-else()
-    message(FATAL_ERROR "The OS is not recognized")
-endif()
-
 set(CMAKE_POSITION_INDEPENDENT_CODE ON) # Pass -fPIC
 set(CMAKE_COLOR_MAKEFILE            ON)
 set(CMAKE_COLOR_DIAGNOSTICS         ON)
-set(CMAKE_EXPORT_COMPILE_COMMANDS   ON)
+set(CMAKE_EXPORT_COMPILE_COMMANDS   ON) # Always to that...
 set(THREADS_PREFER_PTHREAD_FLAG     ON) # Pthread ftw
+set(CMAKE_AUTOUIC                   ON)
+set(CMAKE_AUTOMOC                   ON)
+set(CMAKE_AUTORCC                   ON)
+
+# Do the thing with UPX to try to reduce the size of large executables
+option(USE_UPX "Use upx to reduce executable size [OFF,ON,AUTO]" AUTO)
+find_program(UPX upx DOC "Use upx to compress executables, optional")
+if(UPX STREQUAL "UPX-NOTFOUND")
+    if(USE_UPX STREQUAL "ON")
+        message(ERROR "The upx executable was not found (USE_UPX=ON)")
+    else()
+        message(STATUS "The upx executable was not found, don't compress executable (USE_UPX=${USE_UPX})")
+        macro(upx_pack TARGET EXEC)
+        endmacro()
+    endif()
+elseif((USE_UPX STREQUAL "ON") OR (USE_UPX STREQUAL "AUTO"))
+    message(STATUS "The ${UPX} program will be used to compress the built binaries (USE_UPX=${USE_UPX})")
+    macro(upx_pack TARGET EXEC)
+        add_custom_command(TARGET "${TARGET}" POST_BUILD USES_TERMINAL
+            COMMAND ${UPX} -qt "${EXEC}" || ${UPX} --best --lzma "${EXEC}"
+        )
+    endmacro()
+else()
+    message(STATUS "The upx executable was found, but we won't use it (USE_UPX=OFF)")
+    macro(upx_pack TARGET EXEC)
+    endmacro()
+endif()
 
-# For Qt
-set(CMAKE_AUTOUIC ON)
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_AUTORCC ON)
-
-# Find Qt dependencies
-find_package(Qt6 REQUIRED COMPONENTS
-    Widgets
-    OpenGL
-    OpenGLWidgets
-)
-
-# Find others dependencies
-find_library(AVCODEC_LIBRARY    avcodec     4.0 REQUIRED)
-find_library(AVUTIL_LIBRARY     avutil      4.0 REQUIRED)
-find_library(SWRESAMPLE_LIBRARY swresample      REQUIRED)
-find_library(AVFORMAT_LIBRARY   avformat        REQUIRED)
-find_library(MPV_LIBRARY        mpv             REQUIRED)
-find_package(                   OpenMP          REQUIRED)
+# Dependencies
+find_package(Qt6 COMPONENTS Widgets OpenGL OpenGLWidgets REQUIRED)
+find_library(AVCODEC_LIBRARY    avcodec    4.0 REQUIRED)
+find_library(AVUTIL_LIBRARY     avutil     4.0 REQUIRED)
+find_library(SWRESAMPLE_LIBRARY swresample     REQUIRED)
+find_library(AVFORMAT_LIBRARY   avformat       REQUIRED)
+find_library(MPV_LIBRARY        mpv            REQUIRED)
 
 # Grab all files
 file(GLOB_RECURSE Vivy_SRC CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc")
@@ -59,6 +60,18 @@ if(APPLE)
 endif()
 set(PROJECT_SOURCES ${Vivy_SRC} ${Vivy_INC} ${Vivy_APPLE_SRC})
 
+# The Rust lib
+add_custom_target(libvivy
+    COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/utils/scripts/build-libvivy.bash"
+        "${CMAKE_CURRENT_BINARY_DIR}" ${CARGO_RELEASE_BUILD}
+    BYPRODUCTS  vvcc libvivy.a
+    COMMENT     "Rust library to embed into Vivy"
+    USES_TERMINAL
+)
+upx_pack(libvivy "${CMAKE_CURRENT_BINARY_DIR}/vvcc")
+set_property(TARGET libvivy PROPERTY ADDITIONAL_CLEAN_FILES "vvcc;libvivy.a")
+install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/vvcc" DESTINATION bin)
+
 # Add the Vivy executable
 qt_add_executable(Vivy
     MANUAL_FINALIZATION
@@ -66,6 +79,9 @@ qt_add_executable(Vivy
     rsc/VivyRessources.qrc
 )
 qt_set_finalizer_mode(Vivy ENABLE MODES static_plugins)
+add_dependencies(Vivy libvivy)
+upx_pack(Vivy "${CMAKE_CURRENT_BINARY_DIR}/Vivy")
+install(TARGETS Vivy RUNTIME DESTINATION bin)
 
 set(Vivy_PRECOMPILED_INC PRIVATE src/PreCompiledHeaders.hh)
 
@@ -83,7 +99,7 @@ target_link_libraries(Vivy PRIVATE ${AVUTIL_LIBRARY})
 target_link_libraries(Vivy PRIVATE ${SWRESAMPLE_LIBRARY})
 target_link_libraries(Vivy PRIVATE ${AVFORMAT_LIBRARY})
 target_link_libraries(Vivy PRIVATE ${MPV_LIBRARY})
-target_link_libraries(Vivy PRIVATE OpenMP::OpenMP_CXX)
+target_link_libraries(Vivy PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/libvivy.a)
 
 # Headers related things
 target_include_directories(Vivy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
@@ -145,10 +161,12 @@ if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
         -Wno-c++98-compat-pedantic
         -Wno-c++98-c++11-c++14-c++17-compat-pedantic
         -Wno-c++20-compat
+        -Wno-unsafe-buffer-usage
 
         # Different versions of MPV...
         -Wno-switch-enum
 
+        -Wno-unknown-warning-option
         -Wno-reserved-identifier
         -Wno-extra-semi-stmt
         -Wno-redundant-parens
diff --git a/README.md b/README.md
index 4e99f867..ac7fa9ed 100644
--- a/README.md
+++ b/README.md
@@ -2,13 +2,14 @@
 
 ## Prerequisites
 
-- [rust](https://www.rust-lang.org) compiler with version >= 1.70
+- [rust](https://www.rust-lang.org) compiler with version >= 1.77
 - [cmake](https://cmake.org/) at least the version 3.18
 - C++ compiler with [C++17 support](https://en.cppreference.com/w/cpp/17)
 - [mpv](https://mpv.io/) development library
 - [Qt6](https://www.qt.io/) development library: QtCore, QtWidgets, QtOpenGL, QtOpenGLWidgets.
-- The AV libraries: libavutil libavcodec libavformat
+- The AV libraries in e recent version: libavutil libavcodec libavformat
 - [cbindgen](https://github.com/mozilla/cbindgen): `cargo install --force cbindgen`
+- [cargo-insta](https://insta.rs/docs/cli/): `cargo install --force cargo-insta`
 - Some unix utils, the `jq` binary, the `bash` shell.
 
 ## Build
@@ -16,22 +17,41 @@
 Simply use cmake to build in another folder of the source folder:
 
 ```bash
+# Prepare, compile and install
 cmake -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_INSTALL_PREFIX=$HOME/.local -GNinja
 ninja -Cbuild
 ninja -Cbuild install
 ```
 
-To do a debug build, use the debug switch with cmake: `-DCMAKE_BUILD_TYPE=Debug`. Note that the last
-option is here to generate the `compile_commands.json`, you should copy it at the root of the
-project.
+To do a debug build, use the debug switch with cmake: `-DCMAKE_BUILD_TYPE=Debug`.
 
-## Licence
+To only build and use vvcc, you may use the following commands:
+
+```bash
+cd src/Rust
+
+# Build and install, if vvcc is too big, you can use upx
+cargo install --path vvs_cli
 
-The C++ part of this software is licenced under the LGPL v3.0 or latter. The Rust part is under the
-MIT license.
+# Man pages
+mkdir -p $HOME/.local/share/man/man1/
+vvcc --manpage > $HOME/.local/share/man/man1/vvcc.1
 
----
+# Shell completion scripts
+mkdir -p $HOME/.local/share/completion/
+vvcc --shell bash > $HOME/.local/share/bash-completion/completions/vvcc
+vvcc --shell zsh  > $HOME/.local/share/zsh/site-functions/_vvcc
+
+# View the dependencies
+cargo install cargo-depgraph
+cargo depgraph --build-deps --dedup-transitive-deps | dot -Tpdf | zathura -
+```
+
+## Licence
 
-# TODO!
+- The C++ part of this software is licenced under [the LGPL v3.0 or latter](/LICENSE)
+- The Rust part (Vivy Script) is under the [MIT license](/src/Rust/LICENSE.txt)
+- The NotoSans fonts are distributed using the [OFL licence](/rsc/licence/OFL-1.1)
+- Some parts of the Rust folder (vvs_parser, vvs_parser_derive) are under the
+  [MPL-2.0](/src/Rust/full_moon/LICENSE.txt)
 
-- Use the rust things for the ASS instead of the C++ thing.
diff --git a/TOFIX.md b/TOFIX.md
index b98321dd..dd353838 100644
--- a/TOFIX.md
+++ b/TOFIX.md
@@ -1,6 +1,14 @@
+# MISC
+
 - [ ] Save file: do not error on save = name
 - [ ] Load Ass: do not fail on Default style not defined
 - [ ] Save file: add .vivy extension by default
-- [ ] Save/Load file: use the rust thing, also find a way to populate the properties with that thing
 - [ ] Problems with the mouse with video/ass/audio sub-documents
 - [ ] Some videos won't embed with the OpenGL thing...
+
+# Script Specific
+
+- [ ] We can't have recursive types for containers, for example we can't have a table that contains
+      tables, or a sequence that contains sequences. We must enforce that
+- [ ] Enforce variant declaration correctness (ints or floats, maybe only one string that is always
+      that last thing)
diff --git a/rsc/VivyRessources.qrc b/rsc/VivyRessources.qrc
index 8f32cedb..53700b1d 100644
--- a/rsc/VivyRessources.qrc
+++ b/rsc/VivyRessources.qrc
@@ -9,10 +9,7 @@
     <!-- Fonts, FiraCode is OFL-1.1, NotoSans is APACHE-2.0 -->
     <file>fonts/FiraCode-Regular.ttf</file>
     <file>fonts/FiraCode-Bold.ttf</file>
-    <file>fonts/NotoSans-Bold.ttf</file>
-    <file>fonts/NotoSans-Italic.ttf</file>
     <file>fonts/NotoSans-Regular.ttf</file>
-    <file>fonts/NotoSans-BoldItalic.ttf</file>
 
     <!-- Licences -->
     <file>licence/LGPL-V2.0</file>
diff --git a/rsc/fonts/NotoSans-Bold.ttf b/rsc/fonts/NotoSans-Bold.ttf
deleted file mode 100644
index 54ad879b41b5db8b21dca1aa00a2d474697e7bf0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 398652
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%0D8&+zzFe3)01*j%Fd>)3F!}Q&CY<
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
C2XH0;

diff --git a/rsc/fonts/NotoSans-BoldItalic.ttf b/rsc/fonts/NotoSans-BoldItalic.ttf
deleted file mode 100644
index 530a82835d3b0b07d4b56cfae9ebfa5e02a9129e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 285736
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

diff --git a/rsc/fonts/NotoSans-Italic.ttf b/rsc/fonts/NotoSans-Italic.ttf
deleted file mode 100644
index 27ff1ed60a9afc0e6a4d7604abf6d9ad307ef7fd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 274624
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

diff --git a/src/Rust/Cargo.lock b/src/Rust/Cargo.lock
index 438b9cce..724c516d 100644
--- a/src/Rust/Cargo.lock
+++ b/src/Rust/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
 
 [[package]]
 name = "ab_glyph"
-version = "0.2.22"
+version = "0.2.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1061f3ff92c2f65800df1f12fc7b4ff44ee14783104187dd04dfee6f11b0fd2"
+checksum = "79faae4620f45232f599d9bc7b290f88247a0834162c4495ab2f02d60004adfb"
 dependencies = [
  "ab_glyph_rasterizer",
  "owned_ttf_parser",
@@ -20,9 +20,9 @@ checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
 
 [[package]]
 name = "ahash"
-version = "0.8.6"
+version = "0.8.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
 dependencies = [
  "cfg-if",
  "once_cell",
@@ -32,42 +32,118 @@ dependencies = [
 
 [[package]]
 name = "aho-corasick"
-version = "1.1.2"
+version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "allocator-api2"
-version = "0.2.16"
+version = "0.2.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
 
 [[package]]
 name = "anstyle"
-version = "1.0.4"
+version = "1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
 
 [[package]]
 name = "anyhow"
-version = "1.0.75"
+version = "1.0.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi 0.1.19",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 [[package]]
 name = "bitflags"
-version = "2.4.1"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
+
+[[package]]
+name = "bstr"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
 
 [[package]]
 name = "bytecount"
-version = "0.6.7"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
+
+[[package]]
+name = "cast"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "cbindgen"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da6bc11b07529f16944307272d5bd9b22530bc7d05751717c9d416586cedab49"
+dependencies = [
+ "clap 3.2.25",
+ "heck 0.4.1",
+ "indexmap 1.9.3",
+ "log",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_json",
+ "syn 1.0.109",
+ "tempfile",
+ "toml 0.5.11",
+]
+
+[[package]]
+name = "cc"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549"
 
 [[package]]
 name = "cfg-if"
@@ -75,11 +151,53 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "ciborium"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "clap"
+version = "3.2.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123"
+dependencies = [
+ "atty",
+ "bitflags 1.3.2",
+ "clap_lex 0.2.4",
+ "indexmap 1.9.3",
+ "strsim 0.10.0",
+ "termcolor",
+ "textwrap",
+]
+
 [[package]]
 name = "clap"
-version = "4.4.7"
+version = "4.5.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b"
+checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -87,53 +205,203 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.4.7"
+version = "4.5.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663"
+checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99"
 dependencies = [
  "anstyle",
- "clap_lex",
- "strsim",
+ "clap_lex 0.7.2",
+ "strsim 0.11.1",
  "terminal_size",
 ]
 
 [[package]]
 name = "clap_complete"
-version = "4.4.4"
+version = "4.5.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bffe91f06a11b4b9420f62103854e90867812cd5d01557f853c5ee8e791b12ae"
+checksum = "a8670053e87c316345e384ca1f3eba3006fc6355ed8b8a1140d104e109e3df34"
 dependencies = [
- "clap",
+ "clap 4.5.13",
 ]
 
 [[package]]
 name = "clap_derive"
-version = "4.4.7"
+version = "4.5.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
+checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0"
 dependencies = [
- "heck",
+ "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.72",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.6.0"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
 
 [[package]]
 name = "clap_mangen"
-version = "0.2.15"
+version = "0.2.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3be86020147691e1d2ef58f75346a3d4d94807bfc473e377d52f09f0f7d77f7"
+checksum = "f17415fd4dfbea46e3274fcd8d368284519b358654772afb700dc2e8d2b24eeb"
 dependencies = [
- "clap",
+ "clap 4.5.13",
  "roff",
 ]
 
+[[package]]
+name = "codespan"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3362992a0d9f1dd7c3d0e89e0ab2bb540b7a95fea8cd798090e758fda2899b5e"
+dependencies = [
+ "codespan-reporting",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
+name = "console"
+version = "0.15.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "convert_case"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "criterion"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
+dependencies = [
+ "anes",
+ "cast",
+ "ciborium",
+ "clap 4.5.13",
+ "criterion-plot",
+ "is-terminal",
+ "itertools",
+ "num-traits",
+ "once_cell",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
+
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+
+[[package]]
+name = "derive_more"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
+dependencies = [
+ "derive_more-impl",
+]
+
+[[package]]
+name = "derive_more-impl"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.72",
+ "unicode-xid",
+]
+
+[[package]]
+name = "either"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
 [[package]]
 name = "equivalent"
 version = "1.0.1"
@@ -142,19 +410,54 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
 name = "errno"
-version = "0.3.5"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
 dependencies = [
  "libc",
- "windows-sys",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
+
+[[package]]
+name = "globset"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "log",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "half"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888"
+dependencies = [
+ "cfg-if",
+ "crunchy",
 ]
 
 [[package]]
 name = "hashbrown"
-version = "0.14.2"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
 dependencies = [
  "ahash",
  "allocator-api2",
@@ -166,105 +469,260 @@ version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
 
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+
 [[package]]
 name = "indexmap"
-version = "2.0.2"
+version = "1.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0"
 dependencies = [
  "equivalent",
- "hashbrown",
+ "hashbrown 0.14.5",
 ]
 
+[[package]]
+name = "insta"
+version = "1.39.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "810ae6042d48e2c9e9215043563a58a80b877bc863228a74cf10c49d4620a6f5"
+dependencies = [
+ "console",
+ "globset",
+ "lazy_static",
+ "linked-hash-map",
+ "serde",
+ "similar",
+ "walkdir",
+]
+
+[[package]]
+name = "is-terminal"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
+dependencies = [
+ "hermit-abi 0.3.9",
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+
+[[package]]
+name = "js-sys"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
 [[package]]
 name = "libc"
-version = "0.2.149"
+version = "0.2.155"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
+
+[[package]]
+name = "linked-hash-map"
+version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.10"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+
+[[package]]
+name = "llvm-sys"
+version = "181.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d255b36907416971229095a8465c0b69f5f1c6fb8421b6dcdbb64eb47e1be90"
+dependencies = [
+ "anyhow",
+ "cc",
+ "lazy_static",
+ "libc",
+ "regex-lite",
+ "semver",
+]
 
 [[package]]
 name = "log"
-version = "0.4.20"
+version = "0.4.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
 
 [[package]]
 name = "memchr"
-version = "2.6.4"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
-name = "minimal-lexical"
-version = "0.2.1"
+name = "oorandom"
+version = "11.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9"
 
 [[package]]
-name = "nom"
-version = "7.1.3"
+name = "os_str_bytes"
+version = "6.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1"
+
+[[package]]
+name = "owned_ttf_parser"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "490d3a563d3122bf7c911a59b0add9389e5ec0f5f0c3ac6b91ff235a0e6a7f90"
 dependencies = [
- "memchr",
- "minimal-lexical",
+ "ttf-parser",
 ]
 
 [[package]]
-name = "nom_locate"
-version = "4.2.0"
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
+[[package]]
+name = "plotters"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3"
+checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3"
 dependencies = [
- "bytecount",
- "memchr",
- "nom",
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
 ]
 
 [[package]]
-name = "once_cell"
-version = "1.18.0"
+name = "plotters-backend"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7"
 
 [[package]]
-name = "owned_ttf_parser"
-version = "0.19.0"
+name = "plotters-svg"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4"
+checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705"
 dependencies = [
- "ttf-parser",
+ "plotters-backend",
 ]
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.69"
+version = "1.0.86"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.33"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
  "proc-macro2",
 ]
 
+[[package]]
+name = "rayon"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-utils",
+]
+
 [[package]]
 name = "regex"
-version = "1.10.2"
+version = "1.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -274,65 +732,120 @@ dependencies = [
 
 [[package]]
 name = "regex-automata"
-version = "0.4.3"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
 dependencies = [
  "aho-corasick",
  "memchr",
  "regex-syntax",
 ]
 
+[[package]]
+name = "regex-lite"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
+
 [[package]]
 name = "regex-syntax"
-version = "0.8.2"
+version = "0.8.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
 
 [[package]]
 name = "roff"
-version = "0.2.1"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316"
+checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3"
 
 [[package]]
 name = "rustix"
-version = "0.38.21"
+version = "0.38.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
+checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
 dependencies = [
- "bitflags",
+ "bitflags 2.6.0",
  "errno",
  "libc",
  "linux-raw-sys",
- "windows-sys",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
 ]
 
+[[package]]
+name = "semver"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
+
 [[package]]
 name = "serde"
-version = "1.0.190"
+version = "1.0.205"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7"
+checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.190"
+version = "1.0.205"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3"
+checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.72",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.122"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da"
+dependencies = [
+ "indexmap 2.3.0",
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
 ]
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.4"
+version = "0.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "similar"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e"
+
+[[package]]
+name = "smol_str"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80"
+checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead"
 dependencies = [
  "serde",
 ]
@@ -343,17 +856,56 @@ version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
 
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
 [[package]]
 name = "syn"
-version = "2.0.38"
+version = "2.0.72"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af"
 dependencies = [
  "proc-macro2",
  "quote",
  "unicode-ident",
 ]
 
+[[package]]
+name = "tempfile"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "once_cell",
+ "rustix",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
+dependencies = [
+ "winapi-util",
+]
+
 [[package]]
 name = "terminal_size"
 version = "0.3.0"
@@ -361,34 +913,59 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
 dependencies = [
  "rustix",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
+[[package]]
+name = "textwrap"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9"
+
 [[package]]
 name = "thiserror"
-version = "1.0.50"
+version = "1.0.63"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
+checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.50"
+version = "1.0.63"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
+checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.72",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
 ]
 
 [[package]]
 name = "toml"
-version = "0.8.5"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml"
+version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3efaf127c78d5339cc547cce4e4d973bd5e4f56e949a06d091c082ebeef2f800"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
 dependencies = [
  "serde",
  "serde_spanned",
@@ -398,20 +975,20 @@ dependencies = [
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.5"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.20.5"
+version = "0.22.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "782bf6c2ddf761c1e7855405e8975472acf76f7f36d0d4328bd3b7a2fae12a85"
+checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
 dependencies = [
- "indexmap",
+ "indexmap 2.3.0",
  "serde",
  "serde_spanned",
  "toml_datetime",
@@ -420,9 +997,9 @@ dependencies = [
 
 [[package]]
 name = "ttf-parser"
-version = "0.19.2"
+version = "0.24.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49d64318d8311fc2668e48b63969f4343e0a85c4a109aa8460d6672e364b8bd1"
+checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a"
 
 [[package]]
 name = "unicode-ident"
@@ -432,15 +1009,27 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
 
 [[package]]
 name = "unicode-segmentation"
-version = "1.10.1"
+version = "1.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
 
 [[package]]
 name = "version_check"
-version = "0.9.4"
+version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
 
 [[package]]
 name = "vvs_ass"
@@ -461,14 +1050,34 @@ name = "vvs_cli"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "clap",
+ "clap 4.5.13",
  "clap_complete",
  "clap_mangen",
  "log",
  "serde",
  "thiserror",
- "toml",
+ "toml 0.8.19",
+ "vvs_ass",
+ "vvs_codegen",
  "vvs_font",
+ "vvs_llvm",
+ "vvs_parser",
+ "vvs_runtime",
+ "vvs_utils",
+]
+
+[[package]]
+name = "vvs_codegen"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "hashbrown 0.14.5",
+ "log",
+ "serde",
+ "serde_json",
+ "vvs_lang",
+ "vvs_llvm",
+ "vvs_runtime_types",
  "vvs_utils",
 ]
 
@@ -487,41 +1096,250 @@ name = "vvs_lang"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "hashbrown",
+ "derive_more",
+ "hashbrown 0.14.5",
  "log",
- "nom",
- "nom_locate",
+ "paste",
  "regex",
  "serde",
  "thiserror",
+ "toml 0.8.19",
+ "vvs_parser",
  "vvs_utils",
 ]
 
+[[package]]
+name = "vvs_lib"
+version = "0.5.0"
+dependencies = [
+ "cbindgen",
+ "hashbrown 0.14.5",
+ "log",
+ "serde",
+ "serde_json",
+ "vvs_ass",
+]
+
+[[package]]
+name = "vvs_llvm"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "llvm-sys",
+ "log",
+]
+
+[[package]]
+name = "vvs_parser"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "bytecount",
+ "cfg-if",
+ "codespan",
+ "codespan-reporting",
+ "criterion",
+ "derive_more",
+ "hashbrown 0.14.5",
+ "insta",
+ "log",
+ "paste",
+ "serde",
+ "smol_str",
+ "termcolor",
+ "vvs_parser_derive",
+]
+
+[[package]]
+name = "vvs_parser_derive"
+version = "0.5.0"
+dependencies = [
+ "indexmap 2.3.0",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
 [[package]]
 name = "vvs_procmacro"
 version = "0.5.0"
 dependencies = [
+ "anyhow",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.72",
+]
+
+[[package]]
+name = "vvs_runtime"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "log",
+ "serde",
+ "serde_json",
+ "vvs_llvm",
+ "vvs_runtime_types",
+ "vvs_utils",
+]
+
+[[package]]
+name = "vvs_runtime_types"
+version = "0.5.0"
+dependencies = [
+ "anyhow",
+ "hashbrown 0.14.5",
+ "log",
+ "serde",
+ "serde_json",
+ "unicode-segmentation",
+ "vvs_ass",
+ "vvs_lang",
+ "vvs_llvm",
+ "vvs_procmacro",
+ "vvs_utils",
 ]
 
 [[package]]
 name = "vvs_utils"
 version = "0.5.0"
 dependencies = [
+ "anyhow",
  "log",
  "serde",
  "thiserror",
 ]
 
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.72",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.72",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
+
+[[package]]
+name = "web-sys"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
 [[package]]
 name = "windows-sys"
 version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
 dependencies = [
- "windows-targets",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -530,13 +1348,29 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
 dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
 ]
 
 [[package]]
@@ -545,67 +1379,115 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
 [[package]]
 name = "windows_i686_gnu"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
 [[package]]
 name = "windows_i686_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
-version = "0.5.17"
+version = "0.6.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c"
+checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "zerocopy"
-version = "0.7.15"
+version = "0.7.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81ba595b9f2772fbee2312de30eeb80ec773b4cb2f1e8098db024afadda6c06f"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
 dependencies = [
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.15"
+version = "0.7.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "772666c41fb6dceaf520b564b962d738a8e1a83b41bd48945f50837aed78bb1d"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.72",
 ]
diff --git a/src/Rust/Cargo.toml b/src/Rust/Cargo.toml
index aeba7e5a..840c7a05 100644
--- a/src/Rust/Cargo.toml
+++ b/src/Rust/Cargo.toml
@@ -1,54 +1,105 @@
 [workspace]
 resolver = "2"
-members = [
-    "vvs_cli",
-    "vvs_ass",
-    "vvs_font",
-    "vvs_lang",
-    "vvs_utils",
-    "vvs_procmacro",
-]
+members = ["vvs_*"]
+
 
 [workspace.package]
 version = "0.5.0"
-authors = ["Maël MARTIN"]
-description = "The V5 of the Vivy Script utility to manipulate in an easy way ASS files"
-edition = "2021"
-license = "MIT"
+authors = [
+    "Maëlle Martin <maelle.martin@proton.me>",
+    "Kampfkarren <kampfkarren@gmail.com>",
+]
+description  = "The V5 of the Vivy Script utility to manipulate in an easy way ASS files"
+edition      = "2021"
+license      = "MIT"
+rust-version = "1.76"
+
+
+[profile.release]
+debug         = false
+opt-level     = 3
+panic         = "abort"
+strip         = true
+codegen-units = 1
+lto           = true
+
+
+[profile.dev]
+debug     = true
+opt-level = "s"
+
 
 [workspace.dependencies]
+# Local dependencies
+vvs_parser_derive = { path = "vvs_parser_derive" }
+vvs_parser        = { path = "vvs_parser"        }
+vvs_procmacro     = { path = "vvs_procmacro"     }
+vvs_utils         = { path = "vvs_utils"         }
+vvs_font          = { path = "vvs_font"          }
+vvs_ass           = { path = "vvs_ass"           }
+vvs_lang          = { path = "vvs_lang"          }
+vvs_runtime       = { path = "vvs_runtime"       }
+vvs_codegen       = { path = "vvs_codegen"       }
+vvs_llvm          = { path = "vvs_llvm"          }
+vvs_runtime_types = { path = "vvs_runtime_types" }
+
 # Utils
-thiserror = "1"
-anyhow = "1"
-paste = "1"
-log = "0.4"
-bitflags = { version = "2", default-features = false }
-unicode-segmentation = "1"
-hashbrown = "0.14"
+bytecount   = "*"
+cfg-if      = "*"
+paste       = "*"
+indexmap    = "*"
+thiserror   = "*"
+anyhow      = "*"
+log         = "*"
+hashbrown   = "*"
+cbindgen    = "*"
+termcolor   = "*"
+derive_more = { version = "*", features = ["full"] }
+smol_str    = { version = "*", features = ["serde"] }
+bitflags    = { version = "*", default-features = false }
 
 # Parsing
-regex = { version = "1", default-features = false, features = ["std"] }
-nom = { version = "7", default-features = false, features = ["std"] }
-nom_locate = { version = "4", default-features = false, features = ["std"] }
+unicode-segmentation = "*"
+regex = { version = "*", default-features = false, features = ["std"] }
 
 # SerDe
-toml = { version = "0.8", default-features = false, features = [
+serde_json = { version = "*", default-features = false, features = [
+    "std",
+    "preserve_order",
+] }
+serde = { version = "*", default-features = false, features = [
+    "std",
+    "rc",
+    "derive",
+] }
+toml = { version = "*", default-features = false, features = [
     "parse",
     "display",
 ] }
-serde = { version = "1", default-features = false, features = [
+
+# ProcMacros
+quote       = "*"
+proc-macro2 = "*"
+
+# FONTS
+ttf-parser = { version = "*" }
+ab_glyph   = { version = "*" }
+
+# CLI
+clap_mangen   = "*" # Could be replace by something crafter by hand…
+clap_complete = "*"
+clap = { version = "*", default-features = false, features = [
+    "usage",
+    "help",
     "std",
+    "suggestions",
+    "error-context",
     "derive",
+    "wrap_help",
 ] }
 
-[profile.release]
-strip = true
-debug = false
-lto = true
-opt-level = "z"
-codegen-units = 1
-panic = "abort"
-
-[profile.dev]
-debug = true
-opt-level = "s"
+# FOR FULL-MOON TESTS
+codespan           = "*"
+codespan-reporting = "*"
+criterion          = "*"
+insta = { version = "*", features = ["glob", "yaml"] }
diff --git a/src/Rust/README.md b/src/Rust/README.md
deleted file mode 100644
index 3337f0bd..00000000
--- a/src/Rust/README.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Vivy Script
-The V4 of the Vivy Script utility to manipulate in an easy way ASS files.
-
-# How to build and install
-Like any rust project, simply run:
-
-    cargo build --release
-    cargo install --path vvs_cli
-    vvcc --help
-
-If you want to test it, from the root of the project you may replace any call
-to `vvcc` by `cargo run --bin vvcc --`.
-
-# Misc
-## Manpage
-To get the `vvcc` manpage, just run:
-
-    vvcc --manpage | man -l -
-
-To install it, you may run the following commands:
-
-    mkdir -p $HOME/.local/share/man/man1/
-    vvcc --manpage > $HOME/.local/share/man/man1/vvcc.1
-    man vvcc
-
-## Shell completion
-To get the completion scripts to source you can use the following commands. You
-can then source those files to get the completion working with your shell.
-
-    mkdir -p $HOME/.local/share/completion/
-    vvcc --shell bash > $HOME/.local/share/bash-completion/completions/vvcc
-    vvcc --shell zsh  > $HOME/.local/share/zsh/site-functions/_vvcc
-
-To get the completion working with the system, you can use the following commands:
-
-    vvcc --shell bash > /usr/local/share/bash-completion/completions/vvcc
-    vvcc --shell zsh  > /usr/local/share/zsh/site-functions/_vvcc
-
-To visualize the dependency graph of VivyScript, use the command:
-
-    cargo install cargo-depgraph
-    cargo depgraph --build-deps --dedup-transitive-deps | dot -Tpdf | zathura -
-
-## To test the project
-The unit-tests can be ran on the project by running `cargo test`. The
-integration tests and the unit-tests can be run together by using pcvs in the
-[tests](tests) folder:
-
-    pip install pcvs        -- Install PCVS
-    (cd tests && pcvs run)  -- Run in the correct folder
-
-You can also install PCVS by cloning the project and running `pip install .`
-from its root.
-
-# Licence
-- The VVS project is under the MIT licence
-- The NotoSans fonts are distributed using the [OFL licence](vvs_font/fonts/NotoSans-LICENCE-OFL.txt)
diff --git a/src/Rust/VVLib.h b/src/Rust/VVLib.h
new file mode 100644
index 00000000..7dcc900c
--- /dev/null
+++ b/src/Rust/VVLib.h
@@ -0,0 +1,187 @@
+/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */
+
+#pragma once
+
+/* Generated with cbindgen:0.26.0 */
+
+#include <inttypes.h>
+
+#ifdef __cplusplus
+namespace VVLib {
+namespace C {
+#endif // __cplusplus
+
+/**
+ * Wraps the container that holds all the content of the ASS file / Vivy file.
+ */
+typedef struct ASSContainer ASSContainer;
+
+/**
+ * Wraps a line in an ASS file.
+ */
+typedef struct ASSLine ASSLine;
+
+/**
+ * Type used to describe an ASS style.
+ */
+typedef struct ASSStyle ASSStyle;
+
+/**
+ * Wraps syllabes, contained in lines in ASS files.
+ */
+typedef struct ASSSyllabe ASSSyllabe;
+
+/**
+ * Represents a string slice, the user may not modify this slice, never! Note that the string is
+ * not null terminated and may contains null bytes in it, use the len attribute to get the length
+ * of this string and convert it to your linking.
+ *
+ * # Safety
+ * Note that you must always put unicode inside a string slice!
+ */
+typedef struct StringSlice
+{
+    uintptr_t len;
+    const char *str;
+} StringSlice;
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+/**
+ * Get the number of lines in the container.
+ */
+int32_t ASSContainerGetLinesCount(const struct ASSContainer *this_);
+
+/**
+ * Get the number of syllabes in the line.
+ */
+int32_t ASSLineGetSyllabesCount(const struct ASSLine *this_);
+
+/**
+ * Get a line by its number in the container.
+ */
+struct ASSLine *ASSContainerGetLineAt(struct ASSContainer *this_, int32_t idx);
+
+/**
+ * Get a syllabe in a line by its index.
+ */
+struct ASSSyllabe *ASSLineGetSyllabeAt(struct ASSLine *this_, int32_t idx);
+
+/**
+ * Tells whever a line is commented or not.
+ */
+bool ASSLineIsCommented(const struct ASSLine *this_);
+
+/**
+ * Gets the style of the line, or 'Default' if it was not found/specified.
+ */
+struct StringSlice ASSLineGetStyle(const struct ASSLine *this_);
+
+/**
+ * Get the content of a syllabe.
+ */
+struct StringSlice ASSSyllabeGetContent(const struct ASSSyllabe *this_);
+
+/**
+ * Get the duration of a syllabe.
+ */
+int32_t ASSSyllabeGetDuration(const struct ASSSyllabe *this_);
+
+/**
+ * Get the start of a syllabe.
+ */
+int32_t ASSSyllabeGetStartTime(const struct ASSSyllabe *this_);
+
+/**
+ * Get the end time of a syllabe.
+ */
+int32_t ASSSyllabeGetFiniTime(const struct ASSSyllabe *this_);
+
+/**
+ * Set the duration of a syllabe.
+ */
+void ASSSyllabeSetDuration(struct ASSSyllabe *this_, int32_t duration);
+
+/**
+ * Set the start of a syllabe.
+ */
+void ASSSyllabeSetStartTime(struct ASSSyllabe *this_, int32_t time);
+
+/**
+ * Set the end of a syllabe.
+ */
+void ASSSyllabeSetFiniTime(struct ASSSyllabe *this_, int32_t time);
+
+/**
+ * Load the ASS from a file, returns nullptr if an error was encountred.
+ */
+struct ASSContainer *ASSContainerFromFile(char *path);
+
+/**
+ * Get a style out of the container by its name.
+ */
+struct ASSStyle *ASSContainerGetStyleByName(struct ASSContainer *this_, struct StringSlice name);
+
+/**
+ * Get the name of a style by its position.
+ */
+struct StringSlice ASSContainerGetStyleNameAt(const struct ASSContainer *this_, int32_t idx);
+
+/**
+ * Get the number of styles in the container.
+ */
+int32_t ASSContainerGetStylesCount(const struct ASSContainer *this_);
+
+/**
+ * Set the start time of the line.
+ */
+void ASSLineSetStartTime(struct ASSLine *this_, int32_t time);
+
+/**
+ * Set the end time of a line.
+ */
+void ASSLineSetFiniTime(struct ASSLine *this_, int32_t time);
+
+/**
+ * Get the duration of a line.
+ */
+int32_t ASSLineGetDuration(const struct ASSLine *this_);
+
+/**
+ * Set the duration of a line.
+ */
+void ASSLineSetDuration(struct ASSLine *this_, int32_t duration);
+
+/**
+ * Get the start time of a line.
+ */
+int32_t ASSLineGetStartTime(const struct ASSLine *this_);
+
+/**
+ * Get the end time of a line.
+ */
+int32_t ASSLineGetFiniTime(const struct ASSLine *this_);
+
+/**
+ * Drop the container. It is file to pass a null pointer to this function.
+ */
+void ASSContainerDrop(struct ASSContainer *this_);
+
+/**
+ * Get the name of the style.
+ *
+ * # Safety
+ * It is up to the user to ensure that the style is not dropped before the returned pointer.
+ */
+struct StringSlice ASSStyleGetName(const struct ASSStyle *this_);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif // __cplusplus
+
+#ifdef __cplusplus
+} // namespace C
+} // namespace VVLib
+#endif // __cplusplus
diff --git a/src/Rust/VVLib.hh b/src/Rust/VVLib.hh
new file mode 100644
index 00000000..93ab3c44
--- /dev/null
+++ b/src/Rust/VVLib.hh
@@ -0,0 +1,123 @@
+/// This file was hand-written to wrap the generated C ABI into a C++ wrapper.
+
+#include "VVLib.h"
+
+#include <algorithm>
+#include <string>
+#include <string_view>
+
+namespace VVLib
+{
+class ASSContainer;
+class ASSLine;
+class ASSSyllabe;
+
+/// ASSSyllabe modelize each syllabe of each line in the ASS file.
+class ASSSyllabe {
+    C::ASSSyllabe *const self;
+    friend ASSLine;
+
+    ASSSyllabe(C::ASSSyllabe *const zelf) noexcept
+        : self(zelf)
+    {
+    }
+
+public:
+    const std::string_view content() const noexcept
+    {
+        const C::StringSlice slice = C::ASSSyllabeGetContent(self);
+        return std::string_view(slice.str, slice.len);
+    }
+    char operator[](int i) noexcept { return content()[static_cast<size_t>(i)]; }
+    char operator[](int i) const noexcept { return content()[static_cast<size_t>(i)]; }
+
+    void set_duration(int dur) noexcept { C::ASSSyllabeSetDuration(self, dur); }
+    void set_start(int start) noexcept { C::ASSSyllabeSetStartTime(self, start); }
+    void set_fini(int fini) noexcept { C::ASSSyllabeSetFiniTime(self, fini); }
+    int duration() const noexcept { return C::ASSSyllabeGetDuration(self); }
+    int start() const noexcept { return C::ASSSyllabeGetStartTime(self); }
+    int fini() const noexcept { return C::ASSSyllabeGetFiniTime(self); }
+};
+
+/// ASSLine modelize each line of an ASS file.
+class ASSLine {
+    C::ASSLine *const self;
+    friend ASSContainer;
+
+    ASSLine(C::ASSLine *const zelf) noexcept
+        : self(zelf)
+    {
+    }
+
+public:
+    int syllabes_count() const noexcept { return C::ASSLineGetSyllabesCount(self); }
+    ASSSyllabe operator[](int i) noexcept { return syllabe_at(i); }
+    const ASSSyllabe operator[](int i) const noexcept { return syllabe_at(i); }
+    const ASSSyllabe syllabe_at(int i) const noexcept
+    {
+        return const_cast<ASSLine *>(this)->syllabe_at(i);
+    }
+    ASSSyllabe syllabe_at(int i) noexcept
+    {
+        return ASSSyllabe(C::ASSLineGetSyllabeAt(self, std::clamp(i, 0, this->syllabes_count())));
+    }
+
+    bool is_commented() const noexcept { return C::ASSLineIsCommented(self); }
+    const std::string_view style() const
+    {
+        const C::StringSlice slice = C::ASSLineGetStyle(self);
+        return std::string_view(slice.str, slice.len);
+    }
+
+    void set_start(int start) noexcept { C::ASSLineSetStartTime(self, start); }
+    void set_fini(int fini) noexcept { C::ASSLineSetFiniTime(self, fini); }
+    void set_duration(int dur) noexcept { C::ASSLineSetDuration(self, dur); }
+    int start() const noexcept { return C::ASSLineGetStartTime(self); }
+    int fini() const noexcept { return C::ASSLineGetFiniTime(self); }
+    int duration() const noexcept { return C::ASSLineGetDuration(self); }
+};
+
+/// The container wraps everything around an ASS file.
+class ASSContainer {
+    C::ASSContainer *const self;
+
+    ASSContainer(const char *path) noexcept
+        : self(C::ASSContainerFromFile(const_cast<char *>(path)))
+    {
+    }
+
+public:
+    ~ASSContainer() noexcept { C::ASSContainerDrop(self); }
+
+    static ASSContainer from_file(const char *path) noexcept { return ASSContainer(path); }
+    static ASSContainer from_file(std::string path) noexcept { return from_file(path.c_str()); }
+    static ASSContainer from_file(std::string_view path) noexcept
+    {
+        return from_file(std::string(path));
+    }
+
+    int styles_count() const noexcept { return C::ASSContainerGetStylesCount(self); }
+    C::ASSStyle *style(std::string_view name) const noexcept
+    {
+        C::StringSlice style{ .len = name.length(), .str = name.data() };
+        return C::ASSContainerGetStyleByName(self, style);
+    }
+    std::string_view style(int idx) const noexcept
+    {
+        const C::StringSlice slice = C::ASSContainerGetStyleNameAt(self, idx);
+        return std::string_view(slice.str, slice.len);
+    }
+
+    int lines_count() const noexcept { return C::ASSContainerGetLinesCount(self); }
+    ASSLine operator[](int i) noexcept { return line_at(i); }
+    const ASSLine operator[](int i) const noexcept { return line_at(i); }
+    const ASSLine line_at(int i) const noexcept
+    {
+        return const_cast<ASSContainer *>(this)->line_at(i);
+    }
+    ASSLine line_at(int i) noexcept
+    {
+        return ASSLine(C::ASSContainerGetLineAt(self, std::clamp(i, 0, this->lines_count())));
+    }
+};
+}
diff --git a/src/Rust/benches/date.lua b/src/Rust/benches/date.lua
new file mode 100644
index 00000000..f8f6bcec
--- /dev/null
+++ b/src/Rust/benches/date.lua
@@ -0,0 +1,730 @@
+---------------------------------------------------------------------------------------
+-- Module for date and time calculations
+--
+-- Version 2.1.1
+-- Copyright (C) 2006, by Jas Latrix (jastejada@yahoo.com)
+-- Copyright (C) 2013-2014, by Thijs Schreijer
+-- Licensed under MIT, http://opensource.org/licenses/MIT
+
+--[[ CONSTANTS ]]--
+local HOURPERDAY  = 24
+local MINPERHOUR  = 60
+local MINPERDAY    = 1440  -- 24*60
+local SECPERMIN   = 60
+local SECPERHOUR  = 3600  -- 60*60
+local SECPERDAY   = 86400 -- 24*60*60
+local TICKSPERSEC = 1000000
+local TICKSPERDAY = 86400000000
+local TICKSPERHOUR = 3600000000
+local TICKSPERMIN = 60000000
+local DAYNUM_MAX =  365242500 -- Sat Jan 01 1000000 00:00:00
+local DAYNUM_MIN = -365242500 -- Mon Jan 01 1000000 BCE 00:00:00
+local DAYNUM_DEF =  0 -- Mon Jan 01 0001 00:00:00
+local _;
+--[[ LOCAL ARE FASTER ]]--
+local type     = type
+local pairs    = pairs
+local error    = error
+local assert   = assert
+local tonumber = tonumber
+local tostring = tostring
+local string   = string
+local math     = math
+local os       = os
+local unpack   = unpack or table.unpack
+local setmetatable = setmetatable
+local getmetatable = getmetatable
+--[[ EXTRA FUNCTIONS ]]--
+local fmt  = string.format
+local lwr  = string.lower
+local rep  = string.rep
+local len  = string.len  -- luacheck: ignore
+local sub  = string.sub
+local gsub = string.gsub
+local gmatch = string.gmatch or string.gfind
+local find = string.find
+local ostime = os.time
+local osdate = os.date
+local floor = math.floor
+local ceil  = math.ceil
+local abs   = math.abs
+-- removes the decimal part of a number
+local function fix(n) n = tonumber(n) return n and ((n > 0 and floor or ceil)(n)) end
+-- returns the modulo n % d;
+local function mod(n,d) return n - d*floor(n/d) end
+-- is `str` in string list `tbl`, `ml` is the minimun len
+local function inlist(str, tbl, ml, tn)
+  local sl = len(str)
+  if sl < (ml or 0) then return nil end
+  str = lwr(str)
+  for k, v in pairs(tbl) do
+	if str == lwr(sub(v, 1, sl)) then
+	  if tn then tn[0] = k end
+	  return k
+	end
+  end
+end
+local function fnil() end
+--[[ DATE FUNCTIONS ]]--
+local DATE_EPOCH -- to be set later
+local sl_weekdays = {
+  [0]="Sunday",[1]="Monday",[2]="Tuesday",[3]="Wednesday",[4]="Thursday",[5]="Friday",[6]="Saturday",
+  [7]="Sun",[8]="Mon",[9]="Tue",[10]="Wed",[11]="Thu",[12]="Fri",[13]="Sat",
+}
+local sl_meridian = {[-1]="AM", [1]="PM"}
+local sl_months = {
+  [00]="January", [01]="February", [02]="March",
+  [03]="April",   [04]="May",      [05]="June",
+  [06]="July",    [07]="August",   [08]="September",
+  [09]="October", [10]="November", [11]="December",
+  [12]="Jan", [13]="Feb", [14]="Mar",
+  [15]="Apr", [16]="May", [17]="Jun",
+  [18]="Jul", [19]="Aug", [20]="Sep",
+  [21]="Oct", [22]="Nov", [23]="Dec",
+}
+-- added the '.2'  to avoid collision, use `fix` to remove
+local sl_timezone = {
+  [000]="utc",    [0.2]="gmt",
+  [300]="est",    [240]="edt",
+  [360]="cst",  [300.2]="cdt",
+  [420]="mst",  [360.2]="mdt",
+  [480]="pst",  [420.2]="pdt",
+}
+-- set the day fraction resolution
+local function setticks(t)
+  TICKSPERSEC = t;
+  TICKSPERDAY = SECPERDAY*TICKSPERSEC
+  TICKSPERHOUR= SECPERHOUR*TICKSPERSEC
+  TICKSPERMIN = SECPERMIN*TICKSPERSEC
+end
+-- is year y leap year?
+local function isleapyear(y) -- y must be int!
+  return (mod(y, 4) == 0 and (mod(y, 100) ~= 0 or mod(y, 400) == 0))
+end
+-- day since year 0
+local function dayfromyear(y) -- y must be int!
+  return 365*y + floor(y/4) - floor(y/100) + floor(y/400)
+end
+-- day number from date, month is zero base
+local function makedaynum(y, m, d)
+  local mm = mod(mod(m,12) + 10, 12)
+  return dayfromyear(y + floor(m/12) - floor(mm/10)) + floor((mm*306 + 5)/10) + d - 307
+  --local yy = y + floor(m/12) - floor(mm/10)
+  --return dayfromyear(yy) + floor((mm*306 + 5)/10) + (d - 1)
+end
+-- date from day number, month is zero base
+local function breakdaynum(g)
+  local g = g + 306
+  local y = floor((10000*g + 14780)/3652425)
+  local d = g - dayfromyear(y)
+  if d < 0 then y = y - 1; d = g - dayfromyear(y) end
+  local mi = floor((100*d + 52)/3060)
+  return (floor((mi + 2)/12) + y), mod(mi + 2,12), (d - floor((mi*306 + 5)/10) + 1)
+end
+--[[ for floats or int32 Lua Number data type
+local function breakdaynum2(g)
+  local g, n = g + 306;
+  local n400 = floor(g/DI400Y);n = mod(g,DI400Y);
+  local n100 = floor(n/DI100Y);n = mod(n,DI100Y);
+  local n004 = floor(n/DI4Y);   n = mod(n,DI4Y);
+  local n001 = floor(n/365);   n = mod(n,365);
+  local y = (n400*400) + (n100*100) + (n004*4) + n001  - ((n001 == 4 or n100 == 4) and 1 or 0)
+  local d = g - dayfromyear(y)
+  local mi = floor((100*d + 52)/3060)
+  return (floor((mi + 2)/12) + y), mod(mi + 2,12), (d - floor((mi*306 + 5)/10) + 1)
+end
+]]
+-- day fraction from time
+local function makedayfrc(h,r,s,t)
+  return ((h*60 + r)*60 + s)*TICKSPERSEC + t
+end
+-- time from day fraction
+local function breakdayfrc(df)
+  return
+	mod(floor(df/TICKSPERHOUR),HOURPERDAY),
+	mod(floor(df/TICKSPERMIN ),MINPERHOUR),
+	mod(floor(df/TICKSPERSEC ),SECPERMIN),
+	mod(df,TICKSPERSEC)
+end
+-- weekday sunday = 0, monday = 1 ...
+local function weekday(dn) return mod(dn + 1, 7) end
+-- yearday 0 based ...
+local function yearday(dn)
+   return dn - dayfromyear((breakdaynum(dn))-1)
+end
+-- parse v as a month
+local function getmontharg(v)
+  local m = tonumber(v);
+  return (m and fix(m - 1)) or inlist(tostring(v) or "", sl_months, 2)
+end
+-- get daynum of isoweek one of year y
+local function isow1(y)
+  local f = makedaynum(y, 0, 4) -- get the date for the 4-Jan of year `y`
+  local d = weekday(f)
+  d = d == 0 and 7 or d -- get the ISO day number, 1 == Monday, 7 == Sunday
+  return f + (1 - d)
+end
+local function isowy(dn)
+  local w1;
+  local y = (breakdaynum(dn))
+  if dn >= makedaynum(y, 11, 29) then
+	w1 = isow1(y + 1);
+	if dn < w1 then
+	  w1 = isow1(y);
+	else
+		y = y + 1;
+	end
+  else
+	w1 = isow1(y);
+	if dn < w1 then
+	  w1 = isow1(y-1)
+	  y = y - 1
+	end
+  end
+  return floor((dn-w1)/7)+1, y
+end
+local function isoy(dn)
+  local y = (breakdaynum(dn))
+  return y + (((dn >= makedaynum(y, 11, 29)) and (dn >= isow1(y + 1))) and 1 or (dn < isow1(y) and -1 or 0))
+end
+local function makedaynum_isoywd(y,w,d)
+  return isow1(y) + 7*w + d - 8 -- simplified: isow1(y) + ((w-1)*7) + (d-1)
+end
+--[[ THE DATE MODULE ]]--
+local fmtstr  = "%x %X";
+--#if not DATE_OBJECT_AFX then
+local date = {}
+setmetatable(date, date)
+-- Version:  VMMMRRRR; V-Major, M-Minor, R-Revision;  e.g. 5.45.321 == 50450321
+date.version = 20010001 -- 2.1.1
+--#end -- not DATE_OBJECT_AFX
+--[[ THE DATE OBJECT ]]--
+local dobj = {}
+dobj.__index = dobj
+dobj.__metatable = dobj
+-- shout invalid arg
+local function date_error_arg() return error("invalid argument(s)",0) end
+-- create new date object
+local function date_new(dn, df)
+  return setmetatable({daynum=dn, dayfrc=df}, dobj)
+end
+
+--#if not NO_LOCAL_TIME_SUPPORT then
+-- magic year table
+local date_epoch, yt;
+local function getequivyear(y)
+  assert(not yt)
+  yt = {}
+  local de = date_epoch:copy()
+  local dw, dy
+  for _ = 0, 3000 do
+	de:setyear(de:getyear() + 1, 1, 1)
+	dy = de:getyear()
+	dw = de:getweekday() * (isleapyear(dy) and  -1 or 1)
+	if not yt[dw] then yt[dw] = dy end  --print(de)
+	if yt[1] and yt[2] and yt[3] and yt[4] and yt[5] and yt[6] and yt[7] and yt[-1] and yt[-2] and yt[-3] and yt[-4] and yt[-5] and yt[-6] and yt[-7] then
+	  getequivyear = function(y)  return yt[ (weekday(makedaynum(y, 0, 1)) + 1) * (isleapyear(y) and  -1 or 1) ]  end
+	  return getequivyear(y)
+	end
+  end
+end
+-- TimeValue from date and time
+local function totv(y,m,d,h,r,s)
+  return (makedaynum(y, m, d) - DATE_EPOCH) * SECPERDAY  + ((h*60 + r)*60 + s)
+end
+-- TimeValue from TimeTable
+local function tmtotv(tm)
+  return tm and totv(tm.year, tm.month - 1, tm.day, tm.hour, tm.min, tm.sec)
+end
+-- Returns the bias in seconds of utc time daynum and dayfrc
+local function getbiasutc2(self)
+  local y,m,d = breakdaynum(self.daynum)
+  local h,r,s = breakdayfrc(self.dayfrc)
+  local tvu = totv(y,m,d,h,r,s) -- get the utc TimeValue of date and time
+  local tml = osdate("*t", tvu) -- get the local TimeTable of tvu
+  if (not tml) or (tml.year > (y+1) or tml.year < (y-1)) then -- failed try the magic
+	y = getequivyear(y)
+	tvu = totv(y,m,d,h,r,s)
+	tml = osdate("*t", tvu)
+  end
+  local tvl = tmtotv(tml)
+  if tvu and tvl then
+	return tvu - tvl, tvu, tvl
+  else
+	return error("failed to get bias from utc time")
+  end
+end
+-- Returns the bias in seconds of local time daynum and dayfrc
+local function getbiasloc2(daynum, dayfrc)
+  local tvu
+  -- extract date and time
+  local y,m,d = breakdaynum(daynum)
+  local h,r,s = breakdayfrc(dayfrc)
+  -- get equivalent TimeTable
+  local tml = {year=y, month=m+1, day=d, hour=h, min=r, sec=s}
+  -- get equivalent TimeValue
+  local tvl = tmtotv(tml)
+
+  local function chkutc()
+	tml.isdst =  nil; local tvug = ostime(tml) if tvug and (tvl == tmtotv(osdate("*t", tvug))) then tvu = tvug return end
+	tml.isdst = true; local tvud = ostime(tml) if tvud and (tvl == tmtotv(osdate("*t", tvud))) then tvu = tvud return end
+	tvu = tvud or tvug
+  end
+  chkutc()
+  if not tvu then
+	tml.year = getequivyear(y)
+	tvl = tmtotv(tml)
+	chkutc()
+  end
+  return ((tvu and tvl) and (tvu - tvl)) or error("failed to get bias from local time"), tvu, tvl
+end
+--#end -- not NO_LOCAL_TIME_SUPPORT
+
+--#if not DATE_OBJECT_AFX then
+-- the date parser
+local strwalker = {} -- ^Lua regular expression is not as powerful as Perl$
+strwalker.__index = strwalker
+local function newstrwalker(s)return setmetatable({s=s, i=1, e=1, c=len(s)}, strwalker) end
+function strwalker:aimchr() return "\n" .. self.s .. "\n" .. rep(".",self.e-1) .. "^" end
+function strwalker:finish() return self.i > self.c  end
+function strwalker:back()  self.i = self.e return self  end
+function strwalker:restart() self.i, self.e = 1, 1 return self end
+function strwalker:match(s)  return (find(self.s, s, self.i)) end
+function strwalker:__call(s, f)-- print("strwalker:__call "..s..self:aimchr())
+  local is, ie; is, ie, self[1], self[2], self[3], self[4], self[5] = find(self.s, s, self.i)
+  if is then self.e, self.i = self.i, 1+ie; if f then f(unpack(self)) end return self end
+end
+ local function date_parse(str)
+  local y,m,d, h,r,s,  z,  w,u, j,  e,  x,c,  dn,df
+  local sw = newstrwalker(gsub(gsub(str, "(%b())", ""),"^(%s*)","")) -- remove comment, trim leading space
+  --local function error_out() print(y,m,d,h,r,s) end
+  local function error_dup(q) --[[error_out()]] error("duplicate value: " .. (q or "") .. sw:aimchr()) end
+  local function error_syn(q) --[[error_out()]] error("syntax error: " .. (q or "") .. sw:aimchr()) end
+  local function error_inv(q) --[[error_out()]] error("invalid date: " .. (q or "") .. sw:aimchr()) end
+  local function sety(q) y = y and error_dup() or tonumber(q); end
+  local function setm(q) m = (m or w or j) and error_dup(m or w or j) or tonumber(q) end
+  local function setd(q) d = d and error_dup() or tonumber(q) end
+  local function seth(q) h = h and error_dup() or tonumber(q) end
+  local function setr(q) r = r and error_dup() or tonumber(q) end
+  local function sets(q) s = s and error_dup() or tonumber(q) end
+  local function adds(q) s = s + tonumber(q) end
+  local function setj(q) j = (m or w or j) and error_dup() or tonumber(q); end
+  local function setz(q) z = (z ~= 0 and z) and error_dup() or q end
+  local function setzn(zs,zn) zn = tonumber(zn); setz( ((zn<24) and (zn*60) or (mod(zn,100) + floor(zn/100) * 60))*( zs=='+' and -1 or 1) ) end
+  local function setzc(zs,zh,zm) setz( ((tonumber(zh)*60) + tonumber(zm))*( zs=='+' and -1 or 1) ) end
+
+  if not (sw("^(%d%d%d%d)",sety) and (sw("^(%-?)(%d%d)%1(%d%d)",function(_,a,b) setm(tonumber(a)); setd(tonumber(b)) end) or sw("^(%-?)[Ww](%d%d)%1(%d?)",function(_,a,b) w, u = tonumber(a), tonumber(b or 1) end) or sw("^%-?(%d%d%d)",setj) or sw("^%-?(%d%d)",function(a) setm(a);setd(1) end))
+  and ((sw("^%s*[Tt]?(%d%d):?",seth) and sw("^(%d%d):?",setr) and sw("^(%d%d)",sets) and sw("^(%.%d+)",adds))
+	or sw:finish() or (sw"^%s*$" or sw"^%s*[Zz]%s*$" or sw("^%s-([%+%-])(%d%d):?(%d%d)%s*$",setzc) or sw("^%s*([%+%-])(%d%d)%s*$",setzn))
+	)  )
+  then --print(y,m,d,h,r,s,z,w,u,j)
+  sw:restart(); y,m,d,h,r,s,z,w,u,j = nil,nil,nil,nil,nil,nil,nil,nil,nil,nil
+	repeat -- print(sw:aimchr())
+	  if sw("^[tT:]?%s*(%d%d?):",seth) then --print("$Time")
+		_ = sw("^%s*(%d%d?)",setr) and sw("^%s*:%s*(%d%d?)",sets) and sw("^(%.%d+)",adds)
+	  elseif sw("^(%d+)[/\\%s,-]?%s*") then --print("$Digits")
+		x, c = tonumber(sw[1]), len(sw[1])
+		if (x >= 70) or (m and d and (not y)) or (c > 3) then
+		  sety( x + ((x >= 100 or c>3)and 0 or 1900) )
+		else
+		  if m then setd(x) else m = x end
+		end
+	  elseif sw("^(%a+)[/\\%s,-]?%s*") then --print("$Words")
+		x = sw[1]
+		if inlist(x, sl_months,   2, sw) then
+		  if m and (not d) and (not y) then d, m = m, false end
+		  setm(mod(sw[0],12)+1)
+		elseif inlist(x, sl_timezone, 2, sw) then
+		  c = fix(sw[0]) -- ignore gmt and utc
+		  if c ~= 0 then setz(c, x) end
+		elseif not inlist(x, sl_weekdays, 2, sw) then
+		  sw:back()
+		  -- am pm bce ad ce bc
+		  if sw("^([bB])%s*(%.?)%s*[Cc]%s*(%2)%s*[Ee]%s*(%2)%s*") or sw("^([bB])%s*(%.?)%s*[Cc]%s*(%2)%s*") then
+			e = e and error_dup() or -1
+		  elseif sw("^([aA])%s*(%.?)%s*[Dd]%s*(%2)%s*") or sw("^([cC])%s*(%.?)%s*[Ee]%s*(%2)%s*") then
+			e = e and error_dup() or 1
+		  elseif sw("^([PApa])%s*(%.?)%s*[Mm]?%s*(%2)%s*") then
+			x = lwr(sw[1]) -- there should be hour and it must be correct
+			if (not h) or (h > 12) or (h < 0) then return error_inv() end
+			if x == 'a' and h == 12 then h = 0 end -- am
+			if x == 'p' and h ~= 12 then h = h + 12 end -- pm
+		  else error_syn() end
+		end
+	  elseif not(sw("^([+-])(%d%d?):(%d%d)",setzc) or sw("^([+-])(%d+)",setzn) or sw("^[Zz]%s*$")) then -- sw{"([+-])",{"(%d%d?):(%d%d)","(%d+)"}}
+		error_syn("?")
+	  end
+	sw("^%s*")  until sw:finish()
+  --else print("$Iso(Date|Time|Zone)")
+  end
+  -- if date is given, it must be complete year, month & day
+  if (not y and not h) or ((m and not d) or (d and not m)) or ((m and w) or (m and j) or (j and w)) then return error_inv("!") end
+  -- fix month
+  if m then m = m - 1 end
+  -- fix year if we are on BCE
+  if e and e < 0 and y > 0 then y = 1 - y end
+  --  create date object
+  dn = (y and ((w and makedaynum_isoywd(y,w,u)) or (j and makedaynum(y, 0, j)) or makedaynum(y, m, d))) or DAYNUM_DEF
+  df = makedayfrc(h or 0, r or 0, s or 0, 0) + ((z or 0)*TICKSPERMIN)
+  --print("Zone",h,r,s,z,m,d,y,df)
+  return date_new(dn, df) -- no need to :normalize();
+ end
+local function date_fromtable(v)
+  local y, m, d = fix(v.year), getmontharg(v.month), fix(v.day)
+  local h, r, s, t = tonumber(v.hour), tonumber(v.min), tonumber(v.sec), tonumber(v.ticks)
+  -- atleast there is time or complete date
+  if (y or m or d) and (not(y and m and d)) then return error("incomplete table")  end
+  return (y or h or r or s or t) and date_new(y and makedaynum(y, m, d) or DAYNUM_DEF, makedayfrc(h or 0, r or 0, s or 0, t or 0))
+end
+local tmap = {
+  ['number'] = function(v) return date_epoch:copy():addseconds(v) end,
+  ['string'] = function(v) return date_parse(v) end,
+  ['boolean']= function(v) return date_fromtable(osdate(v and "!*t" or "*t")) end,
+  ['table']  = function(v) local ref = getmetatable(v) == dobj; return ref and v or date_fromtable(v), ref end
+}
+local function date_getdobj(v)
+  local o, r = (tmap[type(v)] or fnil)(v);
+  return (o and o:normalize() or error"invalid date time value"), r -- if r is true then o is a reference to a date obj
+end
+--#end -- not DATE_OBJECT_AFX
+local function date_from(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
+  local y, m, d = fix(arg1), getmontharg(arg2), fix(arg3)
+  local h, r, s, t = tonumber(arg4 or 0), tonumber(arg5 or 0), tonumber(arg6 or 0), tonumber(arg7 or 0)
+  if y and m and d and h and r and s and t then
+	return date_new(makedaynum(y, m, d), makedayfrc(h, r, s, t)):normalize()
+  else
+	return date_error_arg()
+  end
+end
+
+--[[ THE DATE OBJECT METHODS ]]--
+function dobj:normalize()
+  local dn, df = fix(self.daynum), self.dayfrc
+  self.daynum, self.dayfrc = dn + floor(df/TICKSPERDAY), mod(df, TICKSPERDAY)
+  return (dn >= DAYNUM_MIN and dn <= DAYNUM_MAX) and self or error("date beyond imposed limits:"..self)
+end
+
+function dobj:getdate()  local y, m, d = breakdaynum(self.daynum) return y, m+1, d end
+function dobj:gettime()  return breakdayfrc(self.dayfrc) end
+
+function dobj:getclockhour() local h = self:gethours() return h>12 and mod(h,12) or (h==0 and 12 or h) end
+
+function dobj:getyearday() return yearday(self.daynum) + 1 end
+function dobj:getweekday() return weekday(self.daynum) + 1 end   -- in lua weekday is sunday = 1, monday = 2 ...
+
+function dobj:getyear()   local r,_,_ = breakdaynum(self.daynum)  return r end
+function dobj:getmonth() local _,r,_ = breakdaynum(self.daynum)  return r+1 end-- in lua month is 1 base
+function dobj:getday()   local _,_,r = breakdaynum(self.daynum)  return r end
+function dobj:gethours()  return mod(floor(self.dayfrc/TICKSPERHOUR),HOURPERDAY) end
+function dobj:getminutes()  return mod(floor(self.dayfrc/TICKSPERMIN), MINPERHOUR) end
+function dobj:getseconds()  return mod(floor(self.dayfrc/TICKSPERSEC ),SECPERMIN)  end
+function dobj:getfracsec()  return mod(floor(self.dayfrc/TICKSPERSEC ),SECPERMIN)+(mod(self.dayfrc,TICKSPERSEC)/TICKSPERSEC) end
+function dobj:getticks(u)  local x = mod(self.dayfrc,TICKSPERSEC) return u and ((x*u)/TICKSPERSEC) or x  end
+
+function dobj:getweeknumber(wdb)
+  local wd, yd = weekday(self.daynum), yearday(self.daynum)
+  if wdb then
+	wdb = tonumber(wdb)
+	if wdb then
+	  wd = mod(wd-(wdb-1),7)-- shift the week day base
+	else
+	  return date_error_arg()
+	end
+  end
+  return (yd < wd and 0) or (floor(yd/7) + ((mod(yd, 7)>=wd) and 1 or 0))
+end
+
+function dobj:getisoweekday() return mod(weekday(self.daynum)-1,7)+1 end   -- sunday = 7, monday = 1 ...
+function dobj:getisoweeknumber() return (isowy(self.daynum)) end
+function dobj:getisoyear() return isoy(self.daynum)  end
+function dobj:getisodate()
+  local w, y = isowy(self.daynum)
+  return y, w, self:getisoweekday()
+end
+function dobj:setisoyear(y, w, d)
+  local cy, cw, cd = self:getisodate()
+  if y then cy = fix(tonumber(y))end
+  if w then cw = fix(tonumber(w))end
+  if d then cd = fix(tonumber(d))end
+  if cy and cw and cd then
+	self.daynum = makedaynum_isoywd(cy, cw, cd)
+	return self:normalize()
+  else
+	return date_error_arg()
+  end
+end
+
+function dobj:setisoweekday(d)    return self:setisoyear(nil, nil, d) end
+function dobj:setisoweeknumber(w,d)  return self:setisoyear(nil, w, d)  end
+
+function dobj:setyear(y, m, d)
+  local cy, cm, cd = breakdaynum(self.daynum)
+  if y then cy = fix(tonumber(y))end
+  if m then cm = getmontharg(m)  end
+  if d then cd = fix(tonumber(d))end
+  if cy and cm and cd then
+	self.daynum  = makedaynum(cy, cm, cd)
+	return self:normalize()
+  else
+	return date_error_arg()
+  end
+end
+
+function dobj:setmonth(m, d)return self:setyear(nil, m, d) end
+function dobj:setday(d)    return self:setyear(nil, nil, d) end
+
+function dobj:sethours(h, m, s, t)
+  local ch,cm,cs,ck = breakdayfrc(self.dayfrc)
+  ch, cm, cs, ck = tonumber(h or ch), tonumber(m or cm), tonumber(s or cs), tonumber(t or ck)
+  if ch and cm and cs and ck then
+	self.dayfrc = makedayfrc(ch, cm, cs, ck)
+	return self:normalize()
+  else
+	return date_error_arg()
+  end
+end
+
+function dobj:setminutes(m,s,t)  return self:sethours(nil,   m,   s, t) end
+function dobj:setseconds(s, t)  return self:sethours(nil, nil,   s, t) end
+function dobj:setticks(t)    return self:sethours(nil, nil, nil, t) end
+
+function dobj:spanticks()  return (self.daynum*TICKSPERDAY + self.dayfrc) end
+function dobj:spanseconds()  return (self.daynum*TICKSPERDAY + self.dayfrc)/TICKSPERSEC  end
+function dobj:spanminutes()  return (self.daynum*TICKSPERDAY + self.dayfrc)/TICKSPERMIN  end
+function dobj:spanhours()  return (self.daynum*TICKSPERDAY + self.dayfrc)/TICKSPERHOUR end
+function dobj:spandays()  return (self.daynum*TICKSPERDAY + self.dayfrc)/TICKSPERDAY  end
+
+function dobj:addyears(y, m, d)
+  local cy, cm, cd = breakdaynum(self.daynum)
+  if y then y = fix(tonumber(y))else y = 0 end
+  if m then m = fix(tonumber(m))else m = 0 end
+  if d then d = fix(tonumber(d))else d = 0 end
+  if y and m and d then
+	self.daynum  = makedaynum(cy+y, cm+m, cd+d)
+	return self:normalize()
+  else
+	return date_error_arg()
+  end
+end
+
+function dobj:addmonths(m, d)
+  return self:addyears(nil, m, d)
+end
+
+local function dobj_adddayfrc(self,n,pt,pd)
+  n = tonumber(n)
+  if n then
+	local x = floor(n/pd);
+	self.daynum = self.daynum + x;
+	self.dayfrc = self.dayfrc + (n-x*pd)*pt;
+	return self:normalize()
+  else
+	return date_error_arg()
+  end
+end
+function dobj:adddays(n)  return dobj_adddayfrc(self,n,TICKSPERDAY,1) end
+function dobj:addhours(n)  return dobj_adddayfrc(self,n,TICKSPERHOUR,HOURPERDAY) end
+function dobj:addminutes(n)  return dobj_adddayfrc(self,n,TICKSPERMIN,MINPERDAY)  end
+function dobj:addseconds(n)  return dobj_adddayfrc(self,n,TICKSPERSEC,SECPERDAY)  end
+function dobj:addticks(n)  return dobj_adddayfrc(self,n,1,TICKSPERDAY) end
+local tvspec = {
+  -- Abbreviated weekday name (Sun)
+  ['%a']=function(self) return sl_weekdays[weekday(self.daynum) + 7] end,
+  -- Full weekday name (Sunday)
+  ['%A']=function(self) return sl_weekdays[weekday(self.daynum)] end,
+  -- Abbreviated month name (Dec)
+  ['%b']=function(self) return sl_months[self:getmonth() - 1 + 12] end,
+  -- Full month name (December)
+  ['%B']=function(self) return sl_months[self:getmonth() - 1] end,
+  -- Year/100 (19, 20, 30)
+  ['%C']=function(self) return fmt("%.2d", fix(self:getyear()/100)) end,
+  -- The day of the month as a number (range 1 - 31)
+  ['%d']=function(self) return fmt("%.2d", self:getday())  end,
+  -- year for ISO 8601 week, from 00 (79)
+  ['%g']=function(self) return fmt("%.2d", mod(self:getisoyear() ,100)) end,
+  -- year for ISO 8601 week, from 0000 (1979)
+  ['%G']=function(self) return fmt("%.4d", self:getisoyear()) end,
+  -- same as %b
+  ['%h']=function(self) return self:fmt0("%b") end,
+  -- hour of the 24-hour day, from 00 (06)
+  ['%H']=function(self) return fmt("%.2d", self:gethours()) end,
+  -- The  hour as a number using a 12-hour clock (01 - 12)
+  ['%I']=function(self) return fmt("%.2d", self:getclockhour()) end,
+  -- The day of the year as a number (001 - 366)
+  ['%j']=function(self) return fmt("%.3d", self:getyearday())  end,
+  -- Month of the year, from 01 to 12
+  ['%m']=function(self) return fmt("%.2d", self:getmonth())  end,
+  -- Minutes after the hour 55
+  ['%M']=function(self) return fmt("%.2d", self:getminutes())end,
+  -- AM/PM indicator (AM)
+  ['%p']=function(self) return sl_meridian[self:gethours() > 11 and 1 or -1] end, --AM/PM indicator (AM)
+  -- The second as a number (59, 20 , 01)
+  ['%S']=function(self) return fmt("%.2d", self:getseconds())  end,
+  -- ISO 8601 day of the week, to 7 for Sunday (7, 1)
+  ['%u']=function(self) return self:getisoweekday() end,
+  -- Sunday week of the year, from 00 (48)
+  ['%U']=function(self) return fmt("%.2d", self:getweeknumber()) end,
+  -- ISO 8601 week of the year, from 01 (48)
+  ['%V']=function(self) return fmt("%.2d", self:getisoweeknumber()) end,
+  -- The day of the week as a decimal, Sunday being 0
+  ['%w']=function(self) return self:getweekday() - 1 end,
+  -- Monday week of the year, from 00 (48)
+  ['%W']=function(self) return fmt("%.2d", self:getweeknumber(2)) end,
+  -- The year as a number without a century (range 00 to 99)
+  ['%y']=function(self) return fmt("%.2d", mod(self:getyear() ,100)) end,
+  -- Year with century (2000, 1914, 0325, 0001)
+  ['%Y']=function(self) return fmt("%.4d", self:getyear()) end,
+  -- Time zone offset, the date object is assumed local time (+1000, -0230)
+  ['%z']=function(self) local b = -self:getbias(); local x = abs(b); return fmt("%s%.4d", b < 0 and "-" or "+", fix(x/60)*100 + floor(mod(x,60))) end,
+  -- Time zone name, the date object is assumed local time
+  ['%Z']=function(self) return self:gettzname() end,
+  -- Misc --
+  -- Year, if year is in BCE, prints the BCE Year representation, otherwise result is similar to "%Y" (1 BCE, 40 BCE)
+  ['%\b']=function(self) local x = self:getyear() return fmt("%.4d%s", x>0 and x or (-x+1), x>0 and "" or " BCE") end,
+  -- Seconds including fraction (59.998, 01.123)
+  ['%\f']=function(self) local x = self:getfracsec() return fmt("%s%.9f",x >= 10 and "" or "0", x) end,
+  -- percent character %
+  ['%%']=function(self) return "%" end,
+  -- Group Spec --
+  -- 12-hour time, from 01:00:00 AM (06:55:15 AM); same as "%I:%M:%S %p"
+  ['%r']=function(self) return self:fmt0("%I:%M:%S %p") end,
+  -- hour:minute, from 01:00 (06:55); same as "%I:%M"
+  ['%R']=function(self) return self:fmt0("%I:%M")  end,
+  -- 24-hour time, from 00:00:00 (06:55:15); same as "%H:%M:%S"
+  ['%T']=function(self) return self:fmt0("%H:%M:%S") end,
+  -- month/day/year from 01/01/00 (12/02/79); same as "%m/%d/%y"
+  ['%D']=function(self) return self:fmt0("%m/%d/%y") end,
+  -- year-month-day (1979-12-02); same as "%Y-%m-%d"
+  ['%F']=function(self) return self:fmt0("%Y-%m-%d") end,
+  -- The preferred date and time representation;  same as "%x %X"
+  ['%c']=function(self) return self:fmt0("%x %X") end,
+  -- The preferred date representation, same as "%a %b %d %\b"
+  ['%x']=function(self) return self:fmt0("%a %b %d %\b") end,
+  -- The preferred time representation, same as "%H:%M:%\f"
+  ['%X']=function(self) return self:fmt0("%H:%M:%\f") end,
+  -- GroupSpec --
+  -- Iso format, same as "%Y-%m-%dT%T"
+  ['${iso}'] = function(self) return self:fmt0("%Y-%m-%dT%T") end,
+  -- http format, same as "%a, %d %b %Y %T GMT"
+  ['${http}'] = function(self) return self:fmt0("%a, %d %b %Y %T GMT") end,
+  -- ctime format, same as "%a %b %d %T GMT %Y"
+  ['${ctime}'] = function(self) return self:fmt0("%a %b %d %T GMT %Y") end,
+  -- RFC850 format, same as "%A, %d-%b-%y %T GMT"
+  ['${rfc850}'] = function(self) return self:fmt0("%A, %d-%b-%y %T GMT") end,
+  -- RFC1123 format, same as "%a, %d %b %Y %T GMT"
+  ['${rfc1123}'] = function(self) return self:fmt0("%a, %d %b %Y %T GMT") end,
+  -- asctime format, same as "%a %b %d %T %Y"
+  ['${asctime}'] = function(self) return self:fmt0("%a %b %d %T %Y") end,
+}
+function dobj:fmt0(str) return (gsub(str, "%%[%a%%\b\f]", function(x) local f = tvspec[x];return (f and f(self)) or x end)) end
+function dobj:fmt(str)
+  str = str or self.fmtstr or fmtstr
+  return self:fmt0((gmatch(str, "${%w+}")) and (gsub(str, "${%w+}", function(x)local f=tvspec[x];return (f and f(self)) or x end)) or str)
+end
+
+function dobj.__lt(a, b) if (a.daynum == b.daynum) then return (a.dayfrc < b.dayfrc) else return (a.daynum < b.daynum) end end
+function dobj.__le(a, b) if (a.daynum == b.daynum) then return (a.dayfrc <= b.dayfrc) else return (a.daynum <= b.daynum) end end
+function dobj.__eq(a, b)return (a.daynum == b.daynum) and (a.dayfrc == b.dayfrc) end
+function dobj.__sub(a,b)
+  local d1, d2 = date_getdobj(a), date_getdobj(b)
+  local d0 = d1 and d2 and date_new(d1.daynum - d2.daynum, d1.dayfrc - d2.dayfrc)
+  return d0 and d0:normalize()
+end
+function dobj.__add(a,b)
+  local d1, d2 = date_getdobj(a), date_getdobj(b)
+  local d0 = d1 and d2 and date_new(d1.daynum + d2.daynum, d1.dayfrc + d2.dayfrc)
+  return d0 and d0:normalize()
+end
+function dobj.__concat(a, b) return tostring(a) .. tostring(b) end
+function dobj:__tostring() return self:fmt() end
+
+function dobj:copy() return date_new(self.daynum, self.dayfrc) end
+
+--[[ THE LOCAL DATE OBJECT METHODS ]]--
+function dobj:tolocal()
+  local dn,df = self.daynum, self.dayfrc
+  local bias  = getbiasutc2(self)
+  if bias then
+	-- utc = local + bias; local = utc - bias
+	self.daynum = dn
+	self.dayfrc = df - bias*TICKSPERSEC
+	return self:normalize()
+  else
+	return nil
+  end
+end
+
+function dobj:toutc()
+  local dn,df = self.daynum, self.dayfrc
+  local bias  = getbiasloc2(dn, df)
+  if bias then
+	-- utc = local + bias;
+	self.daynum = dn
+	self.dayfrc = df + bias*TICKSPERSEC
+	return self:normalize()
+  else
+	return nil
+  end
+end
+
+function dobj:getbias()  return (getbiasloc2(self.daynum, self.dayfrc))/SECPERMIN end
+
+function dobj:gettzname()
+  local _, tvu, _ = getbiasloc2(self.daynum, self.dayfrc)
+  return tvu and osdate("%Z",tvu) or ""
+end
+
+--#if not DATE_OBJECT_AFX then
+function date.time(h, r, s, t)
+  h, r, s, t = tonumber(h or 0), tonumber(r or 0), tonumber(s or 0), tonumber(t or 0)
+  if h and r and s and t then
+	 return date_new(DAYNUM_DEF, makedayfrc(h, r, s, t))
+  else
+	return date_error_arg()
+  end
+end
+
+function date:__call(arg1, args)
+  local arg_count = select("#", args) + (arg1 == nil and 0 or 1)
+  if arg_count  > 1 then return (date_from(arg1, args))
+  elseif arg_count == 0 then return (date_getdobj(false))
+  else local o, r = date_getdobj(arg1);  return r and o:copy() or o end
+end
+
+date.diff = dobj.__sub
+
+function date.isleapyear(v)
+  local y = fix(v);
+  if not y then
+	y = date_getdobj(v)
+	y = y and y:getyear()
+  end
+  return isleapyear(y+0)
+end
+
+function date.epoch() return date_epoch:copy()  end
+
+function date.isodate(y,w,d) return date_new(makedaynum_isoywd(y + 0, w and (w+0) or 1, d and (d+0) or 1), 0)  end
+
+-- Internal functions
+function date.fmt(str) if str then fmtstr = str end; return fmtstr end
+function date.daynummin(n)  DAYNUM_MIN = (n and n < DAYNUM_MAX) and n or DAYNUM_MIN  return n and DAYNUM_MIN or date_new(DAYNUM_MIN, 0):normalize()end
+function date.daynummax(n)  DAYNUM_MAX = (n and n > DAYNUM_MIN) and n or DAYNUM_MAX return n and DAYNUM_MAX or date_new(DAYNUM_MAX, 0):normalize()end
+function date.ticks(t) if t then setticks(t) end return TICKSPERSEC  end
+--#end -- not DATE_OBJECT_AFX
+
+local tm = osdate("!*t", 0);
+if tm then
+  date_epoch = date_new(makedaynum(tm.year, tm.month - 1, tm.day), makedayfrc(tm.hour, tm.min, tm.sec, 0))
+  -- the distance from our epoch to os epoch in daynum
+  DATE_EPOCH = date_epoch and date_epoch:spandays()
+else -- error will be raise only if called!
+  date_epoch = setmetatable({},{__index = function() error("failed to get the epoch date") end})
+end
+
+--#if not DATE_OBJECT_AFX then
+return date
+--#else
+--$return date_from
+--#end
+
diff --git a/src/Rust/benches/date.rs b/src/Rust/benches/date.rs
new file mode 100644
index 00000000..7898cacd
--- /dev/null
+++ b/src/Rust/benches/date.rs
@@ -0,0 +1,21 @@
+use criterion::{criterion_group, criterion_main, Criterion};
+use vvs_parser::prelude::{ast::*, parser::*};
+
+const DATE_SOURCE: &str = include_str!("./date.lua");
+
+fn parse(criterion: &mut Criterion) {
+    criterion.bench_function("get ast from parsed date", move |b| b.iter(|| parse_lua_tree(DATE_SOURCE)));
+}
+
+fn range(criterion: &mut Criterion) {
+    let ast = parse_lua_tree(DATE_SOURCE).unwrap();
+    criterion.bench_function("get range of ast of date", move |b| b.iter(|| ast.nodes().range()));
+}
+
+criterion_group! {
+    name = benches;
+    config = Criterion::default().sample_size(20);
+    targets = parse, range
+}
+
+criterion_main!(benches);
diff --git a/src/Rust/benches/t.lua b/src/Rust/benches/t.lua
new file mode 100644
index 00000000..ced68d9c
--- /dev/null
+++ b/src/Rust/benches/t.lua
@@ -0,0 +1,1135 @@
+-- Sourced from https://github.com/osyrisrblx/t
+
+-- The MPL 2.0 license of Full Moon does not apply to this file.
+-- The license of this file is as follows:
+
+-- MIT License
+
+-- Copyright (c) 2018 Osyris
+--
+-- Permission is hereby granted, free of charge, to any person obtaining a copy
+-- of this software and associated documentation files (the "Software"), to deal
+-- in the Software without restriction, including without limitation the rights
+-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+-- copies of the Software, and to permit persons to whom the Software is
+-- furnished to do so, subject to the following conditions:
+--
+-- The above copyright notice and this permission notice shall be included in all
+-- copies or substantial portions of the Software.
+--
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-- SOFTWARE.
+
+-- t: a runtime typechecker for Roblox
+
+-- regular lua compatibility
+local typeof = typeof or type
+
+local function primitive(typeName)
+	return function(value)
+		local valueType = typeof(value)
+		if valueType == typeName then
+			return true
+		else
+			return false, string.format("%s expected, got %s", typeName, valueType)
+		end
+	end
+end
+
+local t = {}
+
+--[[**
+	matches any type except nil
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+function t.any(value)
+	if value ~= nil then
+		return true
+	else
+		return false, "any expected, got nil"
+	end
+end
+
+--Lua primitives
+
+--[[**
+	ensures Lua primitive boolean type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.boolean = primitive("boolean")
+
+--[[**
+	ensures Lua primitive thread type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.thread = primitive("thread")
+
+--[[**
+	ensures Lua primitive callback type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.callback = primitive("function")
+
+--[[**
+	ensures Lua primitive none type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.none = primitive("nil")
+
+--[[**
+	ensures Lua primitive string type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.string = primitive("string")
+
+--[[**
+	ensures Lua primitive table type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.table = primitive("table")
+
+--[[**
+	ensures Lua primitive userdata type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.userdata = primitive("userdata")
+
+--[[**
+	ensures value is a number and non-NaN
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+function t.number(value)
+	local valueType = typeof(value)
+	if valueType == "number" then
+		if value == value then
+			return true
+		else
+			return false, "unexpected NaN value"
+		end
+	else
+		return false, string.format("number expected, got %s", valueType)
+	end
+end
+
+--[[**
+	ensures value is NaN
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+function t.nan(value)
+	if value ~= value then
+		return true
+	else
+		return false, "unexpected non-NaN value"
+	end
+end
+
+-- roblox types
+
+--[[**
+	ensures Roblox Axes type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Axes = primitive("Axes")
+
+--[[**
+	ensures Roblox BrickColor type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.BrickColor = primitive("BrickColor")
+
+--[[**
+	ensures Roblox CFrame type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.CFrame = primitive("CFrame")
+
+--[[**
+	ensures Roblox Color3 type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Color3 = primitive("Color3")
+
+--[[**
+	ensures Roblox ColorSequence type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.ColorSequence = primitive("ColorSequence")
+
+--[[**
+	ensures Roblox ColorSequenceKeypoint type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.ColorSequenceKeypoint = primitive("ColorSequenceKeypoint")
+
+--[[**
+	ensures Roblox DockWidgetPluginGuiInfo type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.DockWidgetPluginGuiInfo = primitive("DockWidgetPluginGuiInfo")
+
+--[[**
+	ensures Roblox Faces type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Faces = primitive("Faces")
+
+--[[**
+	ensures Roblox Instance type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Instance = primitive("Instance")
+
+--[[**
+	ensures Roblox NumberRange type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.NumberRange = primitive("NumberRange")
+
+--[[**
+	ensures Roblox NumberSequence type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.NumberSequence = primitive("NumberSequence")
+
+--[[**
+	ensures Roblox NumberSequenceKeypoint type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.NumberSequenceKeypoint = primitive("NumberSequenceKeypoint")
+
+--[[**
+	ensures Roblox PathWaypoint type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.PathWaypoint = primitive("PathWaypoint")
+
+--[[**
+	ensures Roblox PhysicalProperties type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.PhysicalProperties = primitive("PhysicalProperties")
+
+--[[**
+	ensures Roblox Random type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Random = primitive("Random")
+
+--[[**
+	ensures Roblox Ray type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Ray = primitive("Ray")
+
+--[[**
+	ensures Roblox Rect type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Rect = primitive("Rect")
+
+--[[**
+	ensures Roblox Region3 type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Region3 = primitive("Region3")
+
+--[[**
+	ensures Roblox Region3int16 type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Region3int16 = primitive("Region3int16")
+
+--[[**
+	ensures Roblox TweenInfo type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.TweenInfo = primitive("TweenInfo")
+
+--[[**
+	ensures Roblox UDim type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.UDim = primitive("UDim")
+
+--[[**
+	ensures Roblox UDim2 type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.UDim2 = primitive("UDim2")
+
+--[[**
+	ensures Roblox Vector2 type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Vector2 = primitive("Vector2")
+
+--[[**
+	ensures Roblox Vector3 type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Vector3 = primitive("Vector3")
+
+--[[**
+	ensures Roblox Vector3int16 type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Vector3int16 = primitive("Vector3int16")
+
+-- roblox enum types
+
+--[[**
+	ensures Roblox Enum type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.Enum = primitive("Enum")
+
+--[[**
+	ensures Roblox EnumItem type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.EnumItem = primitive("EnumItem")
+
+--[[**
+	ensures Roblox RBXScriptSignal type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.RBXScriptSignal = primitive("RBXScriptSignal")
+
+--[[**
+	ensures Roblox RBXScriptConnection type
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+t.RBXScriptConnection = primitive("RBXScriptConnection")
+
+--[[**
+	ensures value is a given literal value
+
+	@param literal The literal to use
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.literal(args)
+	local size = select("#", args)
+	if size == 1 then
+		local literal = args
+		return function(value)
+			if value ~= literal then
+				return false, string.format("expected %s, got %s", tostring(literal), tostring(value))
+			end
+			return true
+		end
+	else
+		local literals = {}
+		for i = 1, size do
+			local value = select(i, args)
+			literals[i] = t.literal(value)
+		end
+		return t.union(unpack(literals))
+	end
+end
+
+--[[**
+	DEPRECATED
+	Please use t.literal
+**--]]
+t.exactly = t.literal
+
+--[[**
+	Returns a t.union of each key in the table as a t.literal
+
+	@param keyTable The table to get keys from
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+function t.keyOf(keyTable)
+	local keys = {}
+	for key in pairs(keyTable) do
+		keys[#keys + 1] = key
+	end
+	return t.literal(unpack(keys))
+end
+
+--[[**
+	Returns a t.union of each value in the table as a t.literal
+
+	@param valueTable The table to get values from
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+function t.valueOf(valueTable)
+	local values = {}
+	for _, value in pairs(valueTable) do
+		values[#values + 1] = value
+	end
+	return t.literal(unpack(values))
+end
+
+--[[**
+	ensures value is an integer
+
+	@param value The value to check against
+
+	@returns True iff the condition is satisfied, false otherwise
+**--]]
+function t.integer(value)
+	local success, errMsg = t.number(value)
+	if not success then
+		return false, errMsg or ""
+	end
+	if value%1 == 0 then
+		return true
+	else
+		return false, string.format("integer expected, got %s", value)
+	end
+end
+
+--[[**
+	ensures value is a number where min <= value
+
+	@param min The minimum to use
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.numberMin(min)
+	return function(value)
+		local success, errMsg = t.number(value)
+		if not success then
+			return false, errMsg or ""
+		end
+		if value >= min then
+			return true
+		else
+			return false, string.format("number >= %s expected, got %s", min, value)
+		end
+	end
+end
+
+--[[**
+	ensures value is a number where value <= max
+
+	@param max The maximum to use
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.numberMax(max)
+	return function(value)
+		local success, errMsg = t.number(value)
+		if not success then
+			return false, errMsg
+		end
+		if value <= max then
+			return true
+		else
+			return false, string.format("number <= %s expected, got %s", max, value)
+		end
+	end
+end
+
+--[[**
+	ensures value is a number where min < value
+
+	@param min The minimum to use
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.numberMinExclusive(min)
+	return function(value)
+		local success, errMsg = t.number(value)
+		if not success then
+			return false, errMsg or ""
+		end
+		if min < value then
+			return true
+		else
+			return false, string.format("number > %s expected, got %s", min, value)
+		end
+	end
+end
+
+--[[**
+	ensures value is a number where value < max
+
+	@param max The maximum to use
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.numberMaxExclusive(max)
+	return function(value)
+		local success, errMsg = t.number(value)
+		if not success then
+			return false, errMsg or ""
+		end
+		if value < max then
+			return true
+		else
+			return false, string.format("number < %s expected, got %s", max, value)
+		end
+	end
+end
+
+--[[**
+	ensures value is a number where value > 0
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+t.numberPositive = t.numberMinExclusive(0)
+
+--[[**
+	ensures value is a number where value < 0
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+t.numberNegative = t.numberMaxExclusive(0)
+
+--[[**
+	ensures value is a number where min <= value <= max
+
+	@param min The minimum to use
+	@param max The maximum to use
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.numberConstrained(min, max)
+	assert(t.number(min) and t.number(max))
+	local minCheck = t.numberMin(min)
+	local maxCheck = t.numberMax(max)
+	return function(value)
+		local minSuccess, minErrMsg = minCheck(value)
+		if not minSuccess then
+			return false, minErrMsg or ""
+		end
+
+		local maxSuccess, maxErrMsg = maxCheck(value)
+		if not maxSuccess then
+			return false, maxErrMsg or ""
+		end
+
+		return true
+	end
+end
+
+--[[**
+	ensures value is a number where min < value < max
+
+	@param min The minimum to use
+	@param max The maximum to use
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.numberConstrainedExclusive(min, max)
+	assert(t.number(min) and t.number(max))
+	local minCheck = t.numberMinExclusive(min)
+	local maxCheck = t.numberMaxExclusive(max)
+	return function(value)
+		local minSuccess, minErrMsg = minCheck(value)
+		if not minSuccess then
+			return false, minErrMsg or ""
+		end
+
+		local maxSuccess, maxErrMsg = maxCheck(value)
+		if not maxSuccess then
+			return false, maxErrMsg or ""
+		end
+
+		return true
+	end
+end
+
+--[[**
+	ensures value matches string pattern
+
+	@param string pattern to check against
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.match(pattern)
+	assert(t.string(pattern))
+	return function(value)
+		local stringSuccess, stringErrMsg = t.string(value)
+		if not stringSuccess then
+			return false, stringErrMsg
+		end
+
+		if string.match(value, pattern) == nil then
+			return false, string.format("\"%s\" failed to match pattern \"%s\"", value, pattern)
+		end
+
+		return true
+	end
+end
+
+--[[**
+	ensures value is either nil or passes check
+
+	@param check The check to use
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.optional(check)
+	assert(t.callback(check))
+	return function(value)
+		if value == nil then
+			return true
+		end
+		local success, errMsg = check(value)
+		if success then
+			return true
+		else
+			return false, string.format("(optional) %s", errMsg or "")
+		end
+	end
+end
+
+--[[**
+	matches given tuple against tuple type definition
+
+	@param ... The type definition for the tuples
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.tuple(args)
+	local checks = args
+	return function(args)
+		for i = 1, #checks do
+			local success, errMsg = checks[i](args[i])
+			if success == false then
+				return false, string.format("Bad tuple index #%s:\n\t%s", i, errMsg or "")
+			end
+		end
+		return true
+	end
+end
+
+--[[**
+	ensures all keys in given table pass check
+
+	@param check The function to use to check the keys
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.keys(check)
+	assert(t.callback(check))
+	return function(value)
+		local tableSuccess, tableErrMsg = t.table(value)
+		if tableSuccess == false then
+			return false, tableErrMsg or ""
+		end
+
+		for key in pairs(value) do
+			local success, errMsg = check(key)
+			if success == false then
+				return false, string.format("bad key %s:\n\t%s", tostring(key), errMsg or "")
+			end
+		end
+
+		return true
+	end
+end
+
+--[[**
+	ensures all values in given table pass check
+
+	@param check The function to use to check the values
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.values(check)
+	assert(t.callback(check))
+	return function(value)
+		local tableSuccess, tableErrMsg = t.table(value)
+		if tableSuccess == false then
+			return false, tableErrMsg or ""
+		end
+
+		for key, val in pairs(value) do
+			local success, errMsg = check(val)
+			if success == false then
+				return false, string.format("bad value for key %s:\n\t%s", tostring(key), errMsg or "")
+			end
+		end
+
+		return true
+	end
+end
+
+--[[**
+	ensures value is a table and all keys pass keyCheck and all values pass valueCheck
+
+	@param keyCheck The function to use to check the keys
+	@param valueCheck The function to use to check the values
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.map(keyCheck, valueCheck)
+	assert(t.callback(keyCheck), t.callback(valueCheck))
+	local keyChecker = t.keys(keyCheck)
+	local valueChecker = t.values(valueCheck)
+	return function(value)
+		local keySuccess, keyErr = keyChecker(value)
+		if not keySuccess then
+			return false, keyErr or ""
+		end
+
+		local valueSuccess, valueErr = valueChecker(value)
+		if not valueSuccess then
+			return false, valueErr or ""
+		end
+
+		return true
+	end
+end
+
+do
+	local arrayKeysCheck = t.keys(t.integer)
+	--[[**
+		ensures value is an array and all values of the array match check
+
+		@param check The check to compare all values with
+
+		@returns A function that will return true iff the condition is passed
+	**--]]
+	function t.array(check)
+		assert(t.callback(check))
+		local valuesCheck = t.values(check)
+		return function(value)
+			local keySuccess, keyErrMsg = arrayKeysCheck(value)
+			if keySuccess == false then
+				return false, string.format("[array] %s", keyErrMsg or "")
+			end
+
+			-- # is unreliable for sparse arrays
+			-- Count upwards using ipairs to avoid false positives from the behavior of #
+			local arraySize = 0
+
+			for _, _ in ipairs(value) do
+				arraySize = arraySize + 1
+			end
+
+			for key in pairs(value) do
+				if key < 1 or key > arraySize then
+					return false, string.format("[array] key %s must be sequential", tostring(key))
+				end
+			end
+
+			local valueSuccess, valueErrMsg = valuesCheck(value)
+			if not valueSuccess then
+				return false, string.format("[array] %s", valueErrMsg or "")
+			end
+
+			return true
+		end
+	end
+end
+
+do
+	local callbackArray = t.array(t.callback)
+	--[[**
+		creates a union type
+
+		@param ... The checks to union
+
+		@returns A function that will return true iff the condition is passed
+	**--]]
+	function t.union(args)
+		local checks = args
+		assert(callbackArray(checks))
+		return function(value)
+			for _, check in pairs(checks) do
+				if check(value) then
+					return true
+				end
+			end
+			return false, "bad type for union"
+		end
+	end
+
+	--[[**
+		Alias for t.union
+	**--]]
+	t.some = t.union
+
+	--[[**
+		creates an intersection type
+
+		@param ... The checks to intersect
+
+		@returns A function that will return true iff the condition is passed
+	**--]]
+	function t.intersection(args)
+		local checks = args
+		assert(callbackArray(checks))
+		return function(value)
+			for _, check in pairs(checks) do
+				local success, errMsg = check(value)
+				if not success then
+					return false, errMsg or ""
+				end
+			end
+			return true
+		end
+	end
+
+	--[[**
+		Alias for t.intersection
+	**--]]
+	t.every = t.intersection
+end
+
+do
+	local checkInterface = t.map(t.any, t.callback)
+	--[[**
+		ensures value matches given interface definition
+
+		@param checkTable The interface definition
+
+		@returns A function that will return true iff the condition is passed
+	**--]]
+	function t.interface(checkTable)
+		assert(checkInterface(checkTable))
+		return function(value)
+			local tableSuccess, tableErrMsg = t.table(value)
+			if tableSuccess == false then
+				return false, tableErrMsg or ""
+			end
+
+			for key, check in pairs(checkTable) do
+				local success, errMsg = check(value[key])
+				if success == false then
+					return false, string.format("[interface] bad value for %s:\n\t%s", tostring(key), errMsg or "")
+				end
+			end
+			return true
+		end
+	end
+
+	--[[**
+		ensures value matches given interface definition strictly
+
+		@param checkTable The interface definition
+
+		@returns A function that will return true iff the condition is passed
+	**--]]
+	function t.strictInterface(checkTable)
+		assert(checkInterface(checkTable))
+		return function(value)
+			local tableSuccess, tableErrMsg = t.table(value)
+			if tableSuccess == false then
+				return false, tableErrMsg or ""
+			end
+
+			for key, check in pairs(checkTable) do
+				local success, errMsg = check(value[key])
+				if success == false then
+					return false, string.format("[interface] bad value for %s:\n\t%s", tostring(key), errMsg or "")
+				end
+			end
+
+			for key in pairs(value) do
+				if not checkTable[key] then
+					return false, string.format("[interface] unexpected field '%s'", tostring(key))
+				end
+			end
+
+			return true
+		end
+	end
+end
+
+--[[**
+	ensure value is an Instance and it's ClassName matches the given ClassName
+
+	@param className The class name to check for
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.instanceOf(className, childTable)
+	assert(t.string(className))
+
+	local childrenCheck
+	if childTable ~= nil then
+		childrenCheck = t.children(childTable)
+	end
+
+	return function(value)
+		local instanceSuccess, instanceErrMsg = t.Instance(value)
+		if not instanceSuccess then
+			return false, instanceErrMsg or ""
+		end
+
+		if value.ClassName ~= className then
+			return false, string.format("%s expected, got %s", className, value.ClassName)
+		end
+
+		if childrenCheck then
+			local childrenSuccess, childrenErrMsg = childrenCheck(value)
+			if not childrenSuccess then
+				return false, childrenErrMsg
+			end
+		end
+
+		return true
+	end
+end
+t.instance = t.instanceOf
+
+--[[**
+	ensure value is an Instance and it's ClassName matches the given ClassName by an IsA comparison
+
+	@param className The class name to check for
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.instanceIsA(className, childTable)
+	assert(t.string(className))
+
+	local childrenCheck
+	if childTable ~= nil then
+		childrenCheck = t.children(childTable)
+	end
+
+	return function(value)
+		local instanceSuccess, instanceErrMsg = t.Instance(value)
+		if not instanceSuccess then
+			return false, instanceErrMsg or ""
+		end
+
+		if not value:IsA(className) then
+			return false, string.format("%s expected, got %s", className, value.ClassName)
+		end
+
+		if childrenCheck then
+			local childrenSuccess, childrenErrMsg = childrenCheck(value)
+			if not childrenSuccess then
+				return false, childrenErrMsg
+			end
+		end
+
+		return true
+	end
+end
+
+--[[**
+	ensures value is an enum of the correct type
+
+	@param enum The enum to check
+
+	@returns A function that will return true iff the condition is passed
+**--]]
+function t.enum(enum)
+	assert(t.Enum(enum))
+	return function(value)
+		local enumItemSuccess, enumItemErrMsg = t.EnumItem(value)
+		if not enumItemSuccess then
+			return false, enumItemErrMsg
+		end
+
+		if value.EnumType == enum then
+			return true
+		else
+			return false, string.format("enum of %s expected, got enum of %s", tostring(enum), tostring(value.EnumType))
+		end
+	end
+end
+
+do
+	local checkWrap = t.tuple(t.callback, t.callback)
+
+	--[[**
+		wraps a callback in an assert with checkArgs
+
+		@param callback The function to wrap
+		@param checkArgs The functon to use to check arguments in the assert
+
+		@returns A function that first asserts using checkArgs and then calls callback
+	**--]]
+	function t.wrap(callback, checkArgs)
+		assert(checkWrap(callback, checkArgs))
+		return function(args)
+			assert(checkArgs(args))
+			return callback(args)
+		end
+	end
+end
+
+--[[**
+	asserts a given check
+
+	@param check The function to wrap with an assert
+
+	@returns A function that simply wraps the given check in an assert
+**--]]
+function t.strict(check)
+	return function(args)
+		assert(check(args))
+	end
+end
+
+do
+	local checkChildren = t.map(t.string, t.callback)
+
+	--[[**
+		Takes a table where keys are child names and values are functions to check the children against.
+		Pass an instance tree into the function.
+		If at least one child passes each check, the overall check passes.
+
+		Warning! If you pass in a tree with more than one child of the same name, this function will always return false
+
+		@param checkTable The table to check against
+
+		@returns A function that checks an instance tree
+	**--]]
+	function t.children(checkTable)
+		assert(checkChildren(checkTable))
+
+		return function(value)
+			local instanceSuccess, instanceErrMsg = t.Instance(value)
+			if not instanceSuccess then
+				return false, instanceErrMsg or ""
+			end
+
+			local childrenByName = {}
+			for _, child in pairs(value:GetChildren()) do
+				local name = child.Name
+				if checkTable[name] then
+					if childrenByName[name] then
+						return false, string.format("Cannot process multiple children with the same name \"%s\"", name)
+					end
+					childrenByName[name] = child
+				end
+			end
+
+			for name, check in pairs(checkTable) do
+				local success, errMsg = check(childrenByName[name])
+				if not success then
+					return false, string.format("[%s.%s] %s", value:GetFullName(), name, errMsg or "")
+				end
+			end
+
+			return true
+		end
+	end
+end
+
+return t
diff --git a/src/Rust/benches/t.rs b/src/Rust/benches/t.rs
new file mode 100644
index 00000000..ea31bac1
--- /dev/null
+++ b/src/Rust/benches/t.rs
@@ -0,0 +1,21 @@
+use criterion::{criterion_group, criterion_main, Criterion};
+use vvs_parser::prelude::{ast::*, parser::*};
+
+const T_SOURCE: &str = include_str!("./t.lua");
+
+fn parse(criterion: &mut Criterion) {
+    criterion.bench_function("get ast from parsed t", move |b| b.iter(|| parse_lua_tree(T_SOURCE)));
+}
+
+fn range(criterion: &mut Criterion) {
+    let ast = parse_lua_tree(T_SOURCE).unwrap();
+    criterion.bench_function("get range of ast of t", move |b| b.iter(|| ast.nodes().range()));
+}
+
+criterion_group! {
+    name = benches;
+    config = Criterion::default().sample_size(20);
+    targets = parse, range
+}
+
+criterion_main!(benches);
diff --git a/src/Rust/rustfmt.toml b/src/Rust/rustfmt.toml
index abc68cf2..9ef09980 100644
--- a/src/Rust/rustfmt.toml
+++ b/src/Rust/rustfmt.toml
@@ -1,12 +1,12 @@
 edition = "2021"
-max_width = 120
 newline_style = "Unix"
 
 # Let's use the horizontal space of the screen
-fn_call_width = 70
-single_line_if_else_max_width = 70
-struct_lit_width = 70
-struct_variant_width = 70
+max_width = 120
+fn_call_width = 100
+single_line_if_else_max_width = 100
+struct_lit_width = 100
+struct_variant_width = 100
 
 # Modern rust
 use_try_shorthand = true
diff --git a/src/Rust/vvs_ass/Cargo.toml b/src/Rust/vvs_ass/Cargo.toml
index 2a9a1f64..7200e2fc 100644
--- a/src/Rust/vvs_ass/Cargo.toml
+++ b/src/Rust/vvs_ass/Cargo.toml
@@ -1,18 +1,18 @@
 [package]
-name = "vvs_ass"
+name              = "vvs_ass"
+description       = "ASS specification and VVS specificities for VVCC"
 version.workspace = true
 authors.workspace = true
 edition.workspace = true
 license.workspace = true
-description = "ASS specification and VVS specificities for VVCC"
 
 [dependencies]
-vvs_procmacro = { path = "../vvs_procmacro" }
-vvs_utils = { path = "../vvs_utils" }
-vvs_font = { path = "../vvs_font" }
+vvs_procmacro.workspace = true
+vvs_utils.workspace     = true
+vvs_font.workspace      = true
 
 unicode-segmentation.workspace = true
-thiserror.workspace = true
-anyhow.workspace = true
-serde.workspace = true
-log.workspace = true
+thiserror.workspace            = true
+anyhow.workspace               = true
+serde.workspace                = true
+log.workspace                  = true
diff --git a/src/Rust/vvs_ass/src/colors.rs b/src/Rust/vvs_ass/src/colors.rs
index 380a9a1a..d4047bb8 100644
--- a/src/Rust/vvs_ass/src/colors.rs
+++ b/src/Rust/vvs_ass/src/colors.rs
@@ -36,6 +36,7 @@ impl ASSColor {
     rgb! { FUCHSIA => 255   0 255 }
     rgb! { PURPLE  => 128   0 128 }
 
+    #[inline]
     fn skip_delimiters(str: &str) -> &str {
         str.trim()
             .trim_start_matches('#')
@@ -44,6 +45,7 @@ impl ASSColor {
             .trim_end_matches('&')
     }
 
+    #[inline]
     pub fn try_from_rgba(str: impl AsRef<str>) -> Result<Self, String> {
         let color = Self::skip_delimiters(str.as_ref());
         if !(color.len() == 6 || color.len() == 8) {
@@ -61,6 +63,7 @@ impl ASSColor {
         })
     }
 
+    #[inline]
     pub fn try_from_bgra(str: impl AsRef<str>) -> Result<Self, String> {
         let color = Self::skip_delimiters(str.as_ref());
         if !(color.len() == 6 || color.len() == 8) {
@@ -78,6 +81,7 @@ impl ASSColor {
         })
     }
 
+    #[inline]
     pub fn into_rgba(self) -> Self {
         match self {
             this @ ASSColor::RGBA { .. } => this,
@@ -113,6 +117,7 @@ impl ASSColor {
         }
     }
 
+    #[inline]
     pub fn into_hsla(self) -> Self {
         match self {
             this @ ASSColor::HSLA { .. } => this,
@@ -132,6 +137,7 @@ impl ASSColor {
     }
 
     /// Returns the HUE from the color (the H in HSL/HSV).
+    #[inline]
     fn hue(&self) -> f32 {
         match self {
             ASSColor::HSLA { h, .. } => *h,
diff --git a/src/Rust/vvs_ass/src/definitions.rs b/src/Rust/vvs_ass/src/definitions.rs
index dcd1b201..bb488d6f 100644
--- a/src/Rust/vvs_ass/src/definitions.rs
+++ b/src/Rust/vvs_ass/src/definitions.rs
@@ -17,17 +17,17 @@ pub struct ASSEvent {
 
     /// Subtitles having different layer number will be ignored during the collusion detection.
     /// Higher numbered layers will be drawn over the lower numbered.
-    pub layer: i64,
+    pub layer: i32,
 
     /// Start Time of the Event, in 0:00:00:00 format ie. Hrs:Mins:Secs:hundredths. This is the
     /// time elapsed during script playback at which the text will appear onscreen. Note that there
     /// is a single digit for the hours!
-    pub start: i64,
+    pub start: i32,
 
     /// End Time of the Event, in 0:00:00:00 format ie. Hrs:Mins:Secs:hundredths. This is the time
     /// elapsed during script playback at which the text will disappear offscreen. Note that there
     /// is a single digit for the hours!
-    pub end: i64,
+    pub end: i32,
 
     /// Style name. If it is "Default", then your own *Default style will be subtituted. However,
     /// the Default style used by the script author IS stored in the script even though SSA ignores
@@ -171,6 +171,7 @@ pub enum ScriptInfoKey {
 impl FromStr for ScriptInfoKey {
     type Err = String;
 
+    #[inline]
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         use ScriptInfoKey::*;
         match s.trim() {
@@ -199,6 +200,7 @@ impl FromStr for ScriptInfoKey {
 impl FromStr for ASSFileSection {
     type Err = String;
 
+    #[inline]
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         use ASSFileSection::*;
         const TRIM_PAT: &[char] = &['[', ']', ' ', '\t'];
diff --git a/src/Rust/vvs_ass/src/drawing.rs b/src/Rust/vvs_ass/src/drawing.rs
index c2d2a882..7e5c7bf8 100644
--- a/src/Rust/vvs_ass/src/drawing.rs
+++ b/src/Rust/vvs_ass/src/drawing.rs
@@ -21,49 +21,22 @@
 #[derive(Debug, Clone, PartialEq)]
 pub enum ASSDrawingCmd {
     // Moves the cursor to <x>, <y>
-    M {
-        x: i64,
-        y: i64,
-    },
+    M { x: i64, y: i64 },
 
     // Moves the cursor to <x>, <y> (unclosed shapes will be left open)
-    N {
-        x: i64,
-        y: i64,
-    },
+    N { x: i64, y: i64 },
 
     // Draws a line to <x>, <y>
-    L {
-        x: i64,
-        y: i64,
-    },
+    L { x: i64, y: i64 },
 
     // 3rd degree bezier curve to point 3 using point 1 and 2 as the control points
-    B {
-        x1: i64,
-        y1: i64,
-        x2: i64,
-        y2: i64,
-        x3: i64,
-        y3: i64,
-    },
+    B { x1: i64, y1: i64, x2: i64, y2: i64, x3: i64, y3: i64 },
 
     // 3rd degree uniform b-spline to point N, must contain at least 3 coordinates
-    S {
-        x1: i64,
-        y1: i64,
-        x2: i64,
-        y2: i64,
-        x3: i64,
-        y3: i64,
-        others: Vec<(i64, i64)>,
-    },
+    S { x1: i64, y1: i64, x2: i64, y2: i64, x3: i64, y3: i64, others: Vec<(i64, i64)> },
 
     // Extend b-spline to <x>, <y>
-    P {
-        x: i64,
-        y: i64,
-    },
+    P { x: i64, y: i64 },
 
     // close b-spline
     C,
@@ -76,6 +49,7 @@ pub struct ASSDrawing {
 }
 
 impl ASSDrawingCmd {
+    #[inline]
     pub fn is_move_cmd(&self) -> bool {
         use ASSDrawingCmd::*;
         matches!(self, M { .. } | N { .. })
diff --git a/src/Rust/vvs_ass/src/elements/aux_table.rs b/src/Rust/vvs_ass/src/elements/aux_table.rs
new file mode 100644
index 00000000..78da4efe
--- /dev/null
+++ b/src/Rust/vvs_ass/src/elements/aux_table.rs
@@ -0,0 +1,3 @@
+pub trait AuxTable: Default + PartialEq {
+    fn deep_clone(&self) -> Self;
+}
diff --git a/src/Rust/vvs_ass/src/elements/line.rs b/src/Rust/vvs_ass/src/elements/line.rs
index 63df87f0..8e86b8aa 100644
--- a/src/Rust/vvs_ass/src/elements/line.rs
+++ b/src/Rust/vvs_ass/src/elements/line.rs
@@ -1,78 +1,20 @@
-use crate::{ASSAuxTable, ASSPosition, ASSSyllabePtr};
+use crate::{ASSPosition, ASSSyllabe, AuxTable};
 
-#[derive(Debug, Default, Clone, PartialEq)]
-pub struct ASSLine {
+#[derive(Debug, Default, PartialEq)]
+pub struct ASSLine<T: AuxTable> {
+    pub is_comment: bool,
+    pub start: i32,
+    pub fini: i32,
     pub position: ASSPosition,
-    pub content: Vec<ASSSyllabePtr>,
-    pub aux: ASSAuxTable,
-    pub start: i64,
-    pub fini: i64,
+    pub content: Vec<ASSSyllabe<T>>,
+    pub aux: T,
 }
 
-#[derive(Debug, Default, Clone)]
-#[repr(transparent)]
-pub struct ASSLinePtr(pub crate::Ptr<ASSLine>);
-
-#[derive(Debug, Default, Clone)]
-#[repr(transparent)]
-pub struct ASSLines(pub Vec<ASSLinePtr>);
-
-impl PartialEq for ASSLinePtr {
-    fn eq(&self, other: &Self) -> bool {
-        *self.0.try_read().unwrap() == *other.0.try_read().unwrap()
-    }
-}
-
-impl PartialEq for ASSLines {
-    fn eq(&self, Self(other): &Self) -> bool {
-        let Self(this) = self;
-        (this.len() != other.len()) && {
-            this.iter()
-                .zip(other.iter())
-                .fold(true, |acc, (ASSLinePtr(this), ASSLinePtr(other))| {
-                    acc && (*this.try_read().unwrap() == *other.try_read().unwrap())
-                })
-        }
-    }
-}
-
-impl From<ASSLine> for ASSLinePtr {
-    fn from(value: ASSLine) -> Self {
-        ASSLinePtr(crate::ptr!(value))
-    }
-}
-
-impl ASSLines {
-    pub fn len(&self) -> usize {
-        self.0.len()
-    }
-
-    pub fn is_empty(&self) -> bool {
-        self.0.is_empty()
-    }
-
-    pub fn push(&mut self, value: impl Into<ASSLinePtr>) {
-        self.0.push(value.into())
-    }
-}
-
-impl Extend<ASSLinePtr> for ASSLines {
-    fn extend<T: IntoIterator<Item = ASSLinePtr>>(&mut self, iter: T) {
-        self.0.extend(iter)
-    }
-}
-
-impl Extend<ASSLine> for ASSLines {
-    fn extend<T: IntoIterator<Item = ASSLine>>(&mut self, iter: T) {
-        self.extend(iter.into_iter().map(|line| ASSLinePtr(crate::ptr!(line))))
-    }
-}
-
-impl IntoIterator for ASSLines {
-    type Item = ASSLinePtr;
-    type IntoIter = <Vec<ASSLinePtr> as IntoIterator>::IntoIter;
-
-    fn into_iter(self) -> Self::IntoIter {
-        self.0.into_iter()
+impl<T: AuxTable> Clone for ASSLine<T> {
+    fn clone(&self) -> Self {
+        let Self { is_comment, start, fini, position, .. } = *self;
+        let content = self.content.clone();
+        let aux = self.aux.deep_clone();
+        Self { is_comment, start, fini, position, content, aux }
     }
 }
diff --git a/src/Rust/vvs_ass/src/elements/mod.rs b/src/Rust/vvs_ass/src/elements/mod.rs
index 2de364b6..d585f9a2 100644
--- a/src/Rust/vvs_ass/src/elements/mod.rs
+++ b/src/Rust/vvs_ass/src/elements/mod.rs
@@ -1,39 +1,27 @@
+mod aux_table;
 mod line;
 mod syllabe;
 
-pub use self::{line::*, syllabe::*};
+pub use self::{aux_table::*, line::*, syllabe::*};
 
 use crate::{definitions::ScriptInfoKey, ASSStyle};
 use std::collections::HashMap;
 
 #[derive(Debug, Clone)]
-pub struct ASSContainer {
-    pub lines: ASSLines,
+pub struct ASSContainer<T: AuxTable> {
+    pub lines: Vec<ASSLine<T>>,
     pub script_info: HashMap<ScriptInfoKey, String>,
     pub styles: HashMap<String, ASSStyle>,
 }
 
-#[derive(Debug, Clone)]
-#[repr(transparent)]
-pub struct ASSContainerPtr(pub crate::Ptr<ASSContainer>);
-
-impl ASSContainer {
+impl<T: AuxTable> ASSContainer<T> {
     /// Create an ASS container from its parts, they must be valide!
+    #[inline]
     pub(crate) fn from_parts(
-        lines: impl IntoIterator<Item = ASSLine>,
+        lines: impl IntoIterator<Item = ASSLine<T>>,
         script_info: HashMap<ScriptInfoKey, String>,
         styles: HashMap<String, ASSStyle>,
     ) -> Self {
-        Self {
-            lines: ASSLines(lines.into_iter().map(|line| ASSLinePtr(crate::ptr!(line))).collect()),
-            script_info,
-            styles,
-        }
-    }
-}
-
-impl From<ASSContainer> for ASSContainerPtr {
-    fn from(value: ASSContainer) -> Self {
-        Self(crate::ptr!(value))
+        Self { lines: lines.into_iter().collect(), script_info, styles }
     }
 }
diff --git a/src/Rust/vvs_ass/src/elements/syllabe.rs b/src/Rust/vvs_ass/src/elements/syllabe.rs
index 4c098045..76898ff3 100644
--- a/src/Rust/vvs_ass/src/elements/syllabe.rs
+++ b/src/Rust/vvs_ass/src/elements/syllabe.rs
@@ -1,78 +1,19 @@
-use crate::{ASSAuxTable, ASSPosition};
+use crate::{ASSPosition, AuxTable};
 
-#[derive(Debug, Default, Clone, PartialEq)]
-pub struct ASSSyllabe {
+#[derive(Debug, Default, PartialEq)]
+pub struct ASSSyllabe<T: AuxTable> {
     pub position: ASSPosition,
     pub content: String,
-    pub aux: ASSAuxTable,
-    pub start: i64,
-    pub fini: i64,
+    pub aux: T,
+    pub start: i32,
+    pub fini: i32,
 }
 
-#[derive(Debug, Default, Clone)]
-#[repr(transparent)]
-pub struct ASSSyllabePtr(pub crate::Ptr<ASSSyllabe>);
-
-#[derive(Debug, Default, Clone)]
-#[repr(transparent)]
-pub struct ASSSyllabes(pub Vec<ASSSyllabePtr>);
-
-impl PartialEq for ASSSyllabePtr {
-    fn eq(&self, other: &Self) -> bool {
-        *self.0.try_read().unwrap() == *other.0.try_read().unwrap()
-    }
-}
-
-impl PartialEq for ASSSyllabes {
-    fn eq(&self, Self(other): &Self) -> bool {
-        let Self(this) = self;
-        (this.len() != other.len()) && {
-            this.iter()
-                .zip(other.iter())
-                .fold(true, |acc, (ASSSyllabePtr(this), ASSSyllabePtr(other))| {
-                    acc && (*this.try_read().unwrap() == *other.try_read().unwrap())
-                })
-        }
-    }
-}
-
-impl From<ASSSyllabe> for ASSSyllabePtr {
-    fn from(value: ASSSyllabe) -> Self {
-        ASSSyllabePtr(crate::ptr!(value))
-    }
-}
-
-impl ASSSyllabes {
-    pub fn len(&self) -> usize {
-        self.0.len()
-    }
-
-    pub fn is_empty(&self) -> bool {
-        self.0.is_empty()
-    }
-
-    pub fn push(&mut self, value: impl Into<ASSSyllabePtr>) {
-        self.0.push(value.into())
-    }
-}
-
-impl Extend<ASSSyllabePtr> for ASSSyllabes {
-    fn extend<T: IntoIterator<Item = ASSSyllabePtr>>(&mut self, iter: T) {
-        self.0.extend(iter)
-    }
-}
-
-impl Extend<ASSSyllabe> for ASSSyllabes {
-    fn extend<T: IntoIterator<Item = ASSSyllabe>>(&mut self, iter: T) {
-        self.extend(iter.into_iter().map(|syllabe| ASSSyllabePtr(crate::ptr!(syllabe))))
-    }
-}
-
-impl IntoIterator for ASSSyllabes {
-    type Item = ASSSyllabePtr;
-    type IntoIter = <Vec<ASSSyllabePtr> as IntoIterator>::IntoIter;
-
-    fn into_iter(self) -> Self::IntoIter {
-        self.0.into_iter()
+impl<T: AuxTable> Clone for ASSSyllabe<T> {
+    fn clone(&self) -> Self {
+        let Self { position, start, fini, .. } = *self;
+        let content = self.content.clone();
+        let aux = self.aux.deep_clone();
+        Self { position, content, aux, start, fini }
     }
 }
diff --git a/src/Rust/vvs_ass/src/lib.rs b/src/Rust/vvs_ass/src/lib.rs
index 59575219..ef883672 100644
--- a/src/Rust/vvs_ass/src/lib.rs
+++ b/src/Rust/vvs_ass/src/lib.rs
@@ -9,23 +9,9 @@ mod position;
 mod reader;
 mod styles;
 mod types;
-mod values;
 
 #[cfg(test)]
 mod tests;
 
-pub use crate::{colors::*, drawing::*, elements::*, position::*, styles::*, types::*, values::*};
+pub use crate::{colors::*, drawing::*, elements::*, position::*, styles::*, types::*};
 pub use reader::{ass_container_from_file, ass_container_from_str, ASSElementReaderError, ContainerFileType};
-
-pub type Ptr<T> = std::sync::Arc<std::sync::RwLock<T>>;
-
-#[macro_export]
-macro_rules! ptr {
-    ($expr: expr) => {
-        std::sync::Arc::new(std::sync::RwLock::new($expr))
-    };
-}
-
-/// A trait to parameterize the ASS element types. It can be a mutable pointer (Arc<RwLock>), a
-/// pointer to a constant thing (Arc) or no pointer at all (just the ASS element).
-pub trait ASSPtr<T>: std::ops::Deref<Target = T> {}
diff --git a/src/Rust/vvs_ass/src/position.rs b/src/Rust/vvs_ass/src/position.rs
index bc335d23..1f9c4986 100644
--- a/src/Rust/vvs_ass/src/position.rs
+++ b/src/Rust/vvs_ass/src/position.rs
@@ -53,6 +53,7 @@ pub type ASSPositionPtr = std::sync::Arc<ASSPosition>;
 impl std::str::FromStr for ASSAlign {
     type Err = String;
 
+    #[inline]
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         match s.trim() {
             "1" => Ok(ASSAlign::BL),
@@ -70,12 +71,14 @@ impl std::str::FromStr for ASSAlign {
 }
 
 impl From<vvs_font::Point> for ASSPosition {
+    #[inline]
     fn from(vvs_font::Point { x, y }: vvs_font::Point) -> Self {
         ASSPosition::Pos { x, y }
     }
 }
 
 impl ASSPosition {
+    #[inline]
     pub fn into_ptr(self) -> ASSPositionPtr {
         std::sync::Arc::new(self)
     }
diff --git a/src/Rust/vvs_ass/src/reader/ass.rs b/src/Rust/vvs_ass/src/reader/ass.rs
index 77c14255..d3a95ae7 100644
--- a/src/Rust/vvs_ass/src/reader/ass.rs
+++ b/src/Rust/vvs_ass/src/reader/ass.rs
@@ -1,8 +1,4 @@
-use crate::{
-    definitions::{ASSEvent, ASSFileSection, ScriptInfoKey},
-    reader::ASSElementReader,
-    ASSColor, ASSContainer, ASSElementReaderError, ASSLine, ASSStyle,
-};
+use crate::{definitions::*, reader::ASSElementReader, *};
 use std::collections::HashMap;
 use vvs_procmacro::EnumVariantFromStr;
 
@@ -76,9 +72,9 @@ impl<'a, K: Eq + Copy + std::hash::Hash + std::fmt::Debug> UnwrapHashMap<'a, K>
         name: &str,
     ) -> Result<T, ASSElementReaderError> {
         let Self(hashmap) = self;
-        let element = hashmap.get(&key).ok_or(ASSElementReaderError::Custom(format!(
-            "failed to find entry with key {key:?}"
-        )))?;
+        let element = hashmap
+            .get(&key)
+            .ok_or(ASSElementReaderError::Custom(format!("failed to find entry with key {key:?}")))?;
         parser(element, name)
     }
 
@@ -117,9 +113,7 @@ fn parse_boolean(boolean: &str, name: &str) -> Result<bool, ASSElementReaderErro
     match boolean.trim() {
         "-1" | "1" | "+1" => Ok(true),
         "0" => Ok(false),
-        boolean => Err(ASSElementReaderError::Custom(format!(
-            "invalid ass boolean for {name} found: {boolean}"
-        ))),
+        boolean => Err(ASSElementReaderError::Custom(format!("invalid ass boolean for {name} found: {boolean}"))),
     }
 }
 
@@ -129,13 +123,13 @@ fn parse_float(float: &str, name: &str) -> Result<f64, ASSElementReaderError> {
         .map_err(|err| ASSElementReaderError::Custom(format!("invalid float value for {name}: {err}")))
 }
 
-fn parse_int(int: &str, name: &str) -> Result<i64, ASSElementReaderError> {
-    int.parse::<i64>()
+fn parse_int(int: &str, name: &str) -> Result<i32, ASSElementReaderError> {
+    int.parse::<i32>()
         .map_err(|err| ASSElementReaderError::Custom(format!("invalid integer value for {name}: {err}")))
 }
 
 /// Parse dates in the `0:00:00:00` format
-fn parse_date(date: &str, name: &str) -> Result<i64, ASSElementReaderError> {
+fn parse_date(date: &str, name: &str) -> Result<i32, ASSElementReaderError> {
     let std_err = "invalid date for {name}, expected \"h:mm:ss.cc\", got {date:?}".to_string();
     let [h, m, sc] = &date.split(':').collect::<Vec<_>>()[..] else {
         return Err(ASSElementReaderError::Custom(std_err));
@@ -149,7 +143,7 @@ fn parse_date(date: &str, name: &str) -> Result<i64, ASSElementReaderError> {
         } else {
             Ok(str.parse::<u16>().map_err(|err| {
                 ASSElementReaderError::Custom(format!("invalid component {compnent} for date {name}: {err}"))
-            })? as i64)
+            })? as i32)
         }
     };
     let (h, m, s, c) = (
@@ -164,9 +158,7 @@ fn parse_date(date: &str, name: &str) -> Result<i64, ASSElementReaderError> {
 impl ASSReader {
     fn read_script_info(&mut self, line: &str) -> Result<(), ASSElementReaderError> {
         let Some((key, value)) = line.split_once(':') else {
-            return Err(ASSElementReaderError::Custom(format!(
-                "invalid script info line: {line}"
-            )));
+            return Err(ASSElementReaderError::Custom(format!("invalid script info line: {line}")));
         };
         let value = value.trim();
         let key = match key
@@ -187,9 +179,9 @@ impl ASSReader {
             key => key,
         };
         match self.script_info.get(&key) {
-            Some(_) => Err(ASSElementReaderError::Custom(format!(
-                "redefinition of key '{key:?}' in script info section"
-            ))),
+            Some(_) => {
+                Err(ASSElementReaderError::Custom(format!("redefinition of key '{key:?}' in script info section")))
+            }
             None => {
                 self.script_info.insert(key, value.to_string());
                 Ok(())
@@ -198,6 +190,8 @@ impl ASSReader {
     }
 
     fn read_v4_style(&mut self, line: &str) -> Result<(), ASSElementReaderError> {
+        use V4PlusStyleFields::*;
+
         let line = if line.starts_with("Format:") {
             let line = line.split_once(':').unwrap().1.trim();
             self.styles_format = line
@@ -220,57 +214,49 @@ impl ASSReader {
         let fields: UnwrapHashMap<V4PlusStyleFields> =
             UnwrapHashMap(HashMap::from_iter(self.styles_format.iter().copied().zip(fields)));
 
-        let encoding = fields.get(V4PlusStyleFields::Encoding);
+        let encoding = fields.get(Encoding);
         if encoding.ne("1") {
-            return Err(ASSElementReaderError::Custom(format!(
-                "we expected the encoding '1', got: {encoding}"
-            )));
+            return Err(ASSElementReaderError::Custom(format!("we expected the encoding '1', got: {encoding}")));
         }
 
-        let name = fields.get(V4PlusStyleFields::Name);
+        let name = fields.get(Name);
         let style = ASSStyle {
             name: name.to_string(),
-            font_name: fields.get(V4PlusStyleFields::Fontname).to_string(),
-            font_size: fields.parsed(V4PlusStyleFields::Fontsize, parse_int, "font size")?,
-            primary_color: fields.parsed(V4PlusStyleFields::PrimaryColour, parse_color, "primary")?,
-            secondary_color: fields.parsed(V4PlusStyleFields::SecondaryColour, parse_color, "secondary")?,
-            outline_color: fields.parsed(V4PlusStyleFields::OutlineColour, parse_color, "outline")?,
-            back_color: fields.parsed(V4PlusStyleFields::BackColour, parse_color, "back")?,
-            bold: fields.parsed(V4PlusStyleFields::Bold, parse_boolean, "bold")?,
-            italic: fields.parsed(V4PlusStyleFields::Italic, parse_boolean, "italic")?,
-            underline: fields.parsed(V4PlusStyleFields::Underline, parse_boolean, "underline")?,
-            strikeout: fields.parsed(V4PlusStyleFields::StrikeOut, parse_boolean, "strikeout")?,
-            scale_x: fields.parsed(V4PlusStyleFields::ScaleX, parse_float, "scale_x")?,
-            scale_y: fields.parsed(V4PlusStyleFields::ScaleY, parse_float, "scale_y")?,
-            spacing: fields.parsed(V4PlusStyleFields::Spacing, parse_float, "spacing")?,
-            angle: fields.parsed(V4PlusStyleFields::Angle, parse_float, "angle")?,
-            border_style: fields
-                .get(V4PlusStyleFields::BorderStyle)
-                .parse()
-                .map_err(ASSElementReaderError::Custom)?,
-            outline: fields.parsed(V4PlusStyleFields::Outline, parse_float, "outline")?,
-            shadow: fields.parsed(V4PlusStyleFields::Shadow, parse_float, "shadow")?,
-            alignment: fields
-                .get(V4PlusStyleFields::Alignment)
-                .parse()
-                .map_err(ASSElementReaderError::Custom)?,
-            margin_l: fields.parsed(V4PlusStyleFields::MarginL, parse_int, "margin_l")?,
-            margin_r: fields.parsed(V4PlusStyleFields::MarginR, parse_int, "margin_r")?,
-            margin_v: fields.parsed(V4PlusStyleFields::MarginV, parse_int, "margin_v")?,
+            font_name: fields.get(Fontname).to_string(),
+            font_size: fields.parsed(Fontsize, parse_int, "font size")?,
+            primary_color: fields.parsed(PrimaryColour, parse_color, "primary")?,
+            secondary_color: fields.parsed(SecondaryColour, parse_color, "secondary")?,
+            outline_color: fields.parsed(OutlineColour, parse_color, "outline")?,
+            back_color: fields.parsed(BackColour, parse_color, "back")?,
+            bold: fields.parsed(Bold, parse_boolean, "bold")?,
+            italic: fields.parsed(Italic, parse_boolean, "italic")?,
+            underline: fields.parsed(Underline, parse_boolean, "underline")?,
+            strikeout: fields.parsed(StrikeOut, parse_boolean, "strikeout")?,
+            scale_x: fields.parsed(ScaleX, parse_float, "scale_x")?,
+            scale_y: fields.parsed(ScaleY, parse_float, "scale_y")?,
+            spacing: fields.parsed(Spacing, parse_float, "spacing")?,
+            angle: fields.parsed(Angle, parse_float, "angle")?,
+            border_style: fields.get(BorderStyle).parse().map_err(ASSElementReaderError::Custom)?,
+            outline: fields.parsed(Outline, parse_float, "outline")?,
+            shadow: fields.parsed(Shadow, parse_float, "shadow")?,
+            alignment: fields.get(Alignment).parse().map_err(ASSElementReaderError::Custom)?,
+            margin_l: fields.parsed(MarginL, parse_int, "margin_l")?,
+            margin_r: fields.parsed(MarginR, parse_int, "margin_r")?,
+            margin_v: fields.parsed(MarginV, parse_int, "margin_v")?,
         };
 
         match self.styles.insert(name.to_string(), style) {
             None => Ok(()),
             Some(old) => {
                 log::error!(target: "ass", "redefine style '{name}', previous style was: {old:#?}");
-                Err(ASSElementReaderError::Custom(format!(
-                    "redefinition of style '{name}'"
-                )))
+                Err(ASSElementReaderError::Custom(format!("redefinition of style '{name}'")))
             }
         }
     }
 
     fn read_event(&mut self, line: &str) -> Result<(), ASSElementReaderError> {
+        use EventFields::*;
+
         let line = if line.starts_with("Format:") {
             let line = line.split_once(':').unwrap().1.trim();
             self.events_format = line
@@ -278,11 +264,8 @@ impl ASSReader {
                 .flat_map(|str| str.trim().parse::<EventFields>())
                 .collect();
             return match self.events_format.last() {
-                Some(EventFields::Text) => Ok(()),
-                _ => Err(ASSElementReaderError::Custom(format!(
-                    "invalid format line: {:?}",
-                    self.events_format
-                ))),
+                Some(Text) => Ok(()),
+                _ => Err(ASSElementReaderError::Custom(format!("invalid format line: {:?}", self.events_format))),
             };
         } else {
             line.split_once(':').unwrap().1.trim()
@@ -302,21 +285,23 @@ impl ASSReader {
                 .zip(fields.into_iter().map(|s| s.trim())),
         ));
         self.events.push(ASSEvent {
-            marked: fields.parsed_or(EventFields::Marked, parse_boolean, "marked", false),
-            layer: fields.parsed_or(EventFields::Layer, parse_int, "layer", 0),
-            start: fields.parsed(EventFields::Start, parse_date, "start")?,
-            end: fields.parsed(EventFields::End, parse_date, "end")?,
-            style: fields.get_or(EventFields::Style, "Default").to_string(),
-            name: fields.get_or(EventFields::Name, "").to_string(),
-            effect: fields.get_or(EventFields::Effect, "").to_string(),
-            text: fields.get(EventFields::Text).to_string(),
+            marked: fields.parsed_or(Marked, parse_boolean, "marked", false),
+            layer: fields.parsed_or(Layer, parse_int, "layer", 0),
+            start: fields.parsed(Start, parse_date, "start")?,
+            end: fields.parsed(End, parse_date, "end")?,
+            style: fields.get_or(Style, "Default").to_string(),
+            name: fields.get_or(Name, "").to_string(),
+            effect: fields.get_or(Effect, "").to_string(),
+            text: fields.get(Text).to_string(),
         });
         Ok(())
     }
 }
 
-impl ASSElementReader for ASSReader {
-    fn try_read(mut self, file: impl std::io::BufRead) -> Result<ASSContainer, ASSElementReaderError> {
+impl<T: AuxTable> ASSElementReader<T> for ASSReader {
+    fn try_read(mut self, file: impl std::io::BufRead) -> Result<ASSContainer<T>, ASSElementReaderError> {
+        use ASSFileSection::*;
+
         // Parse the file
         let mut skip_that_section = false;
         for line in file.lines() {
@@ -337,9 +322,9 @@ impl ASSElementReader for ASSReader {
                 };
             } else if !skip_that_section {
                 match self.section {
-                    Some(ASSFileSection::ScriptInfo) => self.read_script_info(line)?,
-                    Some(ASSFileSection::V4Styles) => self.read_v4_style(line)?,
-                    Some(ASSFileSection::Events) => self.read_event(line)?,
+                    Some(ScriptInfo) => self.read_script_info(line)?,
+                    Some(V4Styles) => self.read_v4_style(line)?,
+                    Some(Events) => self.read_event(line)?,
                     None => {
                         return Err(ASSElementReaderError::Custom(format!(
                             "found the following line without a section: {line}"
diff --git a/src/Rust/vvs_ass/src/reader/json.rs b/src/Rust/vvs_ass/src/reader/json.rs
index b6df2266..fb12dbc4 100644
--- a/src/Rust/vvs_ass/src/reader/json.rs
+++ b/src/Rust/vvs_ass/src/reader/json.rs
@@ -1,12 +1,12 @@
-use crate::{reader::ASSElementReader, ASSContainer, ASSElementReaderError};
+use crate::{reader::ASSElementReader, ASSContainer, ASSElementReaderError, AuxTable};
 
 /// Documentation available here: http://www.tcax.org/docs/ass-specs.html or in the `utils/manual`
 /// folder.
 #[derive(Debug, Default)]
 pub struct JSONReader {}
 
-impl ASSElementReader for JSONReader {
-    fn try_read(self, _file: impl std::io::BufRead) -> Result<ASSContainer, ASSElementReaderError> {
+impl<T: AuxTable> ASSElementReader<T> for JSONReader {
+    fn try_read(self, _file: impl std::io::BufRead) -> Result<ASSContainer<T>, ASSElementReaderError> {
         todo!()
     }
 }
diff --git a/src/Rust/vvs_ass/src/reader/mod.rs b/src/Rust/vvs_ass/src/reader/mod.rs
index 70f904a9..b2165a05 100644
--- a/src/Rust/vvs_ass/src/reader/mod.rs
+++ b/src/Rust/vvs_ass/src/reader/mod.rs
@@ -1,7 +1,7 @@
 //! Read the content of an ASS file / a Vivy subtitle file and creates an
 //! [vvs_ass::elements::lines::ASSLinesPtr] structure accordingly.
 
-use crate::ASSContainer;
+use crate::{ASSContainer, AuxTable};
 use std::{
     fs::File,
     io::{BufReader, Error as IoError},
@@ -38,11 +38,11 @@ pub enum ASSElementReaderError {
     Custom(String),
 }
 
-trait ASSElementReader {
-    fn try_read(self, file: impl std::io::BufRead) -> Result<ASSContainer, ASSElementReaderError>;
+trait ASSElementReader<T: AuxTable> {
+    fn try_read(self, file: impl std::io::BufRead) -> Result<ASSContainer<T>, ASSElementReaderError>;
 }
 
-pub fn ass_container_from_file(file: impl AsRef<Path>) -> Result<ASSContainer, ASSElementReaderError> {
+pub fn ass_container_from_file<T: AuxTable>(file: impl AsRef<Path>) -> Result<ASSContainer<T>, ASSElementReaderError> {
     let file = file.as_ref();
     let Some(extension) = file.extension() else {
         return Err(ASSElementReaderError::NoExtension(file.to_path_buf()));
@@ -57,10 +57,10 @@ pub fn ass_container_from_file(file: impl AsRef<Path>) -> Result<ASSContainer, A
     }
 }
 
-pub fn ass_container_from_str(
+pub fn ass_container_from_str<T: AuxTable>(
     extension: ContainerFileType,
     str: impl AsRef<str>,
-) -> Result<ASSContainer, ASSElementReaderError> {
+) -> Result<ASSContainer<T>, ASSElementReaderError> {
     use ContainerFileType::*;
     let content = BufReader::new(str.as_ref().as_bytes());
     match extension {
diff --git a/src/Rust/vvs_ass/src/styles.rs b/src/Rust/vvs_ass/src/styles.rs
index 81252927..612e64df 100644
--- a/src/Rust/vvs_ass/src/styles.rs
+++ b/src/Rust/vvs_ass/src/styles.rs
@@ -17,7 +17,7 @@ pub struct ASSStyle {
     pub font_name: String,
 
     /// The size of the font. Don't use a thing that is too big... Must be positive.
-    pub font_size: i64,
+    pub font_size: i32,
 
     /// The colour that a subtitle will normally appear in.
     pub primary_color: ASSColor,
@@ -84,23 +84,24 @@ pub struct ASSStyle {
     /// subtitle text will be displayed.
     ///
     /// Must be a positive integer.
-    pub margin_l: i64,
+    pub margin_l: i32,
 
     /// This defines the Right Margin in pixels. It is the distance from the right-hand edge of the
     /// screen. The three onscreen margins (margin_l, margin_r, margin_v) define areas in which the
     /// subtitle text will be displayed.
-    pub margin_r: i64,
+    pub margin_r: i32,
 
     /// This defines the vertical Left Margin in pixels.
     /// - For a subtitle, it is the distance from the bottom of the screen.
     /// - For a toptitle, it is the distance from the top of the screen.
     /// - For a midtitle, the value is ignored - the text will be vertically centred
-    pub margin_v: i64,
+    pub margin_v: i32,
 }
 
 impl std::str::FromStr for ASSBorderStyle {
     type Err = String;
 
+    #[inline]
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         match s.trim() {
             "1" => Ok(ASSBorderStyle::OutlineAndDropShadow),
@@ -111,10 +112,12 @@ impl std::str::FromStr for ASSBorderStyle {
 }
 
 impl ASSStyle {
+    #[inline]
     pub fn default_name() -> &'static str {
         "Default"
     }
 
+    #[inline]
     pub fn default_name_string() -> String {
         Self::default_name().to_string()
     }
@@ -122,9 +125,19 @@ impl ASSStyle {
 
 impl Default for ASSStyle {
     fn default() -> Self {
+        let font = vvs_font::embeded_fonts()
+            .first()
+            .expect("we should at least bundle one font");
+        let font = vvs_font::Font::try_from(font.1).expect("the font we bundle is not valid");
+        let font_name = font.name().expect("the font we bundle doesn't have a valid name");
+        match &font.font_types()[..] {
+            [vvs_font::FontType::Regular] => {}
+            _ => panic!("the font we bundle is not regular"),
+        }
+
         Self {
             name: Self::default_name_string(),
-            font_name: Default::default(),
+            font_name,
             font_size: 14,
             primary_color: ASSColor::WHITE,
             secondary_color: ASSColor::RED,
diff --git a/src/Rust/vvs_ass/src/tests.rs b/src/Rust/vvs_ass/src/tests.rs
index 12c6ec72..a85f04b4 100644
--- a/src/Rust/vvs_ass/src/tests.rs
+++ b/src/Rust/vvs_ass/src/tests.rs
@@ -1,3 +1,5 @@
+use crate::*;
+
 mod color {
     use crate::*;
 
@@ -32,10 +34,7 @@ mod color {
         assert!(ASSColor::try_from_rgba("AABBCC").is_ok());
         assert!(ASSColor::try_from_rgba("AABBCCAA").is_ok());
 
-        assert_eq!(
-            ASSColor::try_from_rgba("AABBCC").unwrap(),
-            ASSColor::try_from_bgra("CCBBAA").unwrap()
-        );
+        assert_eq!(ASSColor::try_from_rgba("AABBCC").unwrap(), ASSColor::try_from_bgra("CCBBAA").unwrap());
     }
 
     #[test]
@@ -46,18 +45,9 @@ mod color {
             let ASSColor::HSLA { h, s, l, .. } = ASSColor::try_from_rgba(rgb).unwrap().into_hsla() else {
                 unreachable!()
             };
-            assert!(
-                (h_target - h).abs() <= EPSILON_DEG,
-                "invalid convertion for color #{rgb}, hue {h_target} != {h}"
-            );
-            assert!(
-                (s - s1_target).abs() <= EPSILON_0_1,
-                "invalid convertion for color #{rgb}, s {s1_target} != {s}"
-            );
-            assert!(
-                (l - l1_target).abs() <= EPSILON_0_1,
-                "invalid convertion for color #{rgb}, l {l1_target} != {l}"
-            );
+            assert!((h_target - h).abs() <= EPSILON_DEG, "invalid convertion for color #{rgb}, hue {h_target} != {h}");
+            assert!((s - s1_target).abs() <= EPSILON_0_1, "invalid convertion for color #{rgb}, s {s1_target} != {s}");
+            assert!((l - l1_target).abs() <= EPSILON_0_1, "invalid convertion for color #{rgb}, l {l1_target} != {l}");
         }
     }
 
@@ -81,13 +71,21 @@ mod color {
             eq! { b_target, b, "invalid convertion on blue for #{rgb}: {b_target} != {b}"}
         }
     }
+}
 
-    #[test]
-    fn test_parse_empty_ass() {
-        use crate::reader::ass_container_from_str;
-        let content = include_str!("../utils/empty.ass");
-        if let Err(err) = ass_container_from_str(reader::ContainerFileType::ASS, content) {
-            panic!("{err}")
+#[test]
+fn test_parse_empty_ass() {
+    #[derive(Default, Clone, Copy, PartialEq, Eq)]
+    struct AT();
+    impl AuxTable for AT {
+        fn deep_clone(&self) -> Self {
+            *self
         }
     }
+
+    if let Err(err) =
+        reader::ass_container_from_str::<AT>(reader::ContainerFileType::ASS, include_str!("../utils/empty.ass"))
+    {
+        panic!("{err}")
+    }
 }
diff --git a/src/Rust/vvs_ass/src/types.rs b/src/Rust/vvs_ass/src/types.rs
index a3db2667..f217f8a4 100644
--- a/src/Rust/vvs_ass/src/types.rs
+++ b/src/Rust/vvs_ass/src/types.rs
@@ -50,6 +50,7 @@ pub enum ASSType {
 
 impl ASSType {
     /// Get the name of the ASS type.
+    #[inline]
     pub fn as_str(&self) -> &'static str {
         match self {
             ASSType::Lines => "lines",
@@ -60,6 +61,7 @@ impl ASSType {
     }
 
     /// Get the name of the type, but padded with spaces.
+    #[inline]
     pub fn as_padded_str(&self) -> &'static str {
         match self {
             ASSType::Lines => "lines   ",
@@ -70,6 +72,7 @@ impl ASSType {
     }
 
     /// Returns the base type.
+    #[inline]
     pub fn base_type(&self) -> Self {
         match self {
             ASSType::Lines | ASSType::Line => ASSType::Line,
@@ -78,6 +81,7 @@ impl ASSType {
     }
 
     /// Returns the vec type.
+    #[inline]
     pub fn vec_type(&self) -> Self {
         match self {
             ASSType::Lines | ASSType::Line => ASSType::Lines,
@@ -87,12 +91,14 @@ impl ASSType {
 }
 
 impl AsRef<str> for ASSType {
+    #[inline]
     fn as_ref(&self) -> &str {
         self.as_str()
     }
 }
 
 impl std::fmt::Display for ASSType {
+    #[inline]
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         f.write_str(self.as_str())
     }
diff --git a/src/Rust/vvs_ass/src/values.rs b/src/Rust/vvs_ass/src/values.rs
deleted file mode 100644
index 32a16819..00000000
--- a/src/Rust/vvs_ass/src/values.rs
+++ /dev/null
@@ -1,200 +0,0 @@
-use serde::{Deserialize, Serialize};
-use std::{collections::HashMap, convert::TryFrom};
-
-/// The values that can be added to an ASS element.
-#[derive(Clone, PartialEq, Serialize, Deserialize)]
-pub enum ASSAuxValue {
-    Integer(i64),
-    Floating(f64),
-    Boolean(bool),
-    String(String),
-}
-
-/// The auxiliary table of user values associated to ASS elements.
-#[derive(Debug, Default, Clone, PartialEq)]
-pub struct ASSAuxTable(HashMap<String, ASSAuxValue>);
-
-impl std::fmt::Debug for ASSAuxValue {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        match self {
-            Self::Integer(arg0) => write!(f, "{arg0}"),
-            Self::Floating(arg0) => write!(f, "{arg0}"),
-            Self::String(arg0) => write!(f, "{arg0:?}"),
-            Self::Boolean(arg0) => write!(f, "{arg0}"),
-        }
-    }
-}
-
-impl ASSAuxValue {
-    pub fn type_str(&self) -> &'static str {
-        match self {
-            ASSAuxValue::Floating(_) => "floating",
-            ASSAuxValue::Integer(_) => "integer",
-            ASSAuxValue::Boolean(_) => "boolean",
-            ASSAuxValue::String(_) => "string",
-        }
-    }
-
-    pub fn coerce_like(self, like: &ASSAuxValue) -> Option<ASSAuxValue> {
-        use ASSAuxValue::*;
-        match (&self, like) {
-            (Floating(_), Floating(_))
-            | (Integer(_), Integer(_))
-            | (Boolean(_), Boolean(_))
-            | (String(_), String(_)) => Some(self),
-
-            (Integer(v), Floating(_)) => Some(Floating(i32::try_from(*v).ok()? as f64)),
-            (Integer(0), Boolean(_)) => Some(Boolean(false)),
-            (Integer(_), Boolean(_)) => Some(Boolean(true)),
-
-            (Boolean(v), String(_)) => Some(String(format!("{v}"))),
-            (Integer(v), String(_)) => Some(String(format!("{v}"))),
-            (Floating(v), String(_)) => Some(String(format!("{v}"))),
-
-            (Boolean(v), Integer(_)) => Some(Integer(*v as i64)),
-
-            (String(_), Integer(_)) => todo!(),
-            (String(_), Floating(_)) => todo!(),
-            (String(_), Boolean(_)) => todo!(),
-
-            (Floating(_), Integer(_)) | (Floating(_), Boolean(_)) | (Boolean(_), Floating(_)) => {
-                log::error!(target: "lua", "invalid convertion from type `{}` to `{}`", self.type_str(), like.type_str());
-                None
-            }
-        }
-    }
-}
-
-impl From<String> for ASSAuxValue {
-    fn from(value: String) -> Self {
-        Self::String(value)
-    }
-}
-
-impl From<&str> for ASSAuxValue {
-    fn from(value: &str) -> Self {
-        Self::String(value.to_string())
-    }
-}
-
-impl From<bool> for ASSAuxValue {
-    fn from(value: bool) -> Self {
-        Self::Boolean(value)
-    }
-}
-
-impl From<f32> for ASSAuxValue {
-    fn from(value: f32) -> Self {
-        Self::Floating(value as f64)
-    }
-}
-
-impl From<f64> for ASSAuxValue {
-    fn from(value: f64) -> Self {
-        Self::Floating(value)
-    }
-}
-
-impl From<i64> for ASSAuxValue {
-    fn from(value: i64) -> Self {
-        Self::Integer(value)
-    }
-}
-
-impl From<i32> for ASSAuxValue {
-    fn from(value: i32) -> Self {
-        Self::Integer(value as i64)
-    }
-}
-
-impl From<u32> for ASSAuxValue {
-    fn from(value: u32) -> Self {
-        Self::Integer(value as i64)
-    }
-}
-
-impl From<i16> for ASSAuxValue {
-    fn from(value: i16) -> Self {
-        Self::Integer(value as i64)
-    }
-}
-
-impl From<u16> for ASSAuxValue {
-    fn from(value: u16) -> Self {
-        Self::Integer(value as i64)
-    }
-}
-
-impl From<i8> for ASSAuxValue {
-    fn from(value: i8) -> Self {
-        Self::Integer(value as i64)
-    }
-}
-
-impl From<u8> for ASSAuxValue {
-    fn from(value: u8) -> Self {
-        Self::Integer(value as i64)
-    }
-}
-
-impl std::fmt::Display for ASSAuxValue {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        match self {
-            ASSAuxValue::Floating(val) => write!(f, "{val}"),
-            ASSAuxValue::Integer(val) => write!(f, "{val}"),
-            ASSAuxValue::Boolean(val) => write!(f, "{val}"),
-            ASSAuxValue::String(val) => f.write_str(val),
-        }
-    }
-}
-
-impl ASSAuxTable {
-    pub fn new() -> Self {
-        Default::default()
-    }
-
-    pub fn set(&mut self, name: impl AsRef<str>, value: ASSAuxValue) {
-        let name = name.as_ref();
-        let new = value.type_str();
-        match self.0.get_mut(name) {
-            Some(old) => match value.coerce_like(old) {
-                Some(new) => *old = new,
-                None => log::error!(
-                    target: "lua",
-                    "can't set new value for `{name}`, old value was of type `{}` and new one is of type `{new}`",
-                    old.type_str()
-                ),
-            },
-            None => {
-                let _ = self.0.insert(name.to_string(), value);
-            }
-        }
-    }
-
-    pub fn get_copy(&self, name: impl AsRef<str>) -> Option<ASSAuxValue> {
-        self.0.get(name.as_ref()).cloned()
-    }
-
-    pub fn get(&self, name: impl AsRef<str>) -> Option<&ASSAuxValue> {
-        self.0.get(name.as_ref())
-    }
-
-    pub fn get_mut(&mut self, name: impl AsRef<str>) -> Option<&mut ASSAuxValue> {
-        self.0.get_mut(name.as_ref())
-    }
-}
-
-impl IntoIterator for ASSAuxTable {
-    type Item = <HashMap<String, ASSAuxValue> as IntoIterator>::Item;
-    type IntoIter = <HashMap<String, ASSAuxValue> as IntoIterator>::IntoIter;
-
-    fn into_iter(self) -> Self::IntoIter {
-        self.0.into_iter()
-    }
-}
-
-impl FromIterator<(String, ASSAuxValue)> for ASSAuxTable {
-    fn from_iter<T: IntoIterator<Item = (String, ASSAuxValue)>>(iter: T) -> Self {
-        Self(HashMap::from_iter(iter))
-    }
-}
diff --git a/src/Rust/vvs_cli/Cargo.toml b/src/Rust/vvs_cli/Cargo.toml
index 004cbf26..2f958d4b 100644
--- a/src/Rust/vvs_cli/Cargo.toml
+++ b/src/Rust/vvs_cli/Cargo.toml
@@ -11,26 +11,23 @@ name = "vvcc"
 path = "src/main.rs"
 
 [dependencies]
-vvs_font = { path = "../vvs_font" }
-vvs_utils = { path = "../vvs_utils" }
+vvs_ass.workspace     = true
+vvs_font.workspace    = true
+vvs_utils.workspace   = true
+vvs_parser.workspace  = true
+vvs_runtime.workspace = true
+vvs_codegen.workspace = true
 
 thiserror.workspace = true
-anyhow.workspace = true
-serde.workspace = true
-toml.workspace = true
-log.workspace = true
+anyhow.workspace    = true
+serde.workspace     = true
+toml.workspace      = true
+log.workspace       = true
 
-clap_mangen = "^0.2"
-clap_complete = "^4"
-clap = { version = "^4", default-features = false, features = [
-    "usage",
-    "help",
-    "std",
-    "suggestions",
-    "error-context",
-    "derive",
-    "wrap_help",
-] }
+clap_mangen.workspace   = true
+clap_complete.workspace = true
+clap.workspace          = true
 
-[target.'cfg(unix)'.dependencies]
-# vvs_repl = { path = "../vvs_repl" }
+[build-dependencies]
+anyhow.workspace   = true
+vvs_llvm.workspace = true
diff --git a/src/Rust/vvs_cli/build.rs b/src/Rust/vvs_cli/build.rs
new file mode 100644
index 00000000..a0148072
--- /dev/null
+++ b/src/Rust/vvs_cli/build.rs
@@ -0,0 +1,3 @@
+fn main() -> anyhow::Result<()> {
+    vvs_llvm::build::llvm_link()
+}
diff --git a/src/Rust/vvs_cli/src/args.rs b/src/Rust/vvs_cli/src/args.rs
index 1c1d6343..9f75870f 100644
--- a/src/Rust/vvs_cli/src/args.rs
+++ b/src/Rust/vvs_cli/src/args.rs
@@ -2,44 +2,17 @@ use crate::parser::FileTypeValueParser;
 use clap::Parser;
 use clap_complete::Shell;
 use std::path::PathBuf;
-use vvs_utils::*;
-
-fn get_cli_groups() -> impl IntoIterator<Item = clap::ArgGroup> {
-    #[cfg(unix)]
-    fn is_unix_target() -> bool {
-        true
-    }
-    #[cfg(not(unix))]
-    fn is_unix_target() -> bool {
-        false
-    }
-
-    use clap::ArgGroup as grp;
-    [
-        grp::new("action").args(["manpage", "shell", "font-file", "script.vvs"]),
-        grp::new("ass")
-            .args(["subtitle.ass"])
-            .conflicts_with_all(["manpage", "font-file"]),
-        grp::new("opts")
-            .args(["options.toml"])
-            .conflicts_with_all(["shell", "manpage", "font-file"]),
-        grp::new("infos")
-            .args(["info"])
-            .conflicts_with_all(["shell", "manpage", "font-file"]),
-    ]
-    .into_iter()
-    .chain(either!(!is_unix_target() => None; Some(
-        clap::ArgGroup::new("repl")  .args(["interactive"]) .conflicts_with_all(["shell", "manpage", "font-file"])
-    )))
-}
 
 #[derive(Parser, Debug)]
 #[command( author
          , version
          , about
-         , name = "vvcc"
-         , groups = get_cli_groups()
-)]
+         , name   = "vvcc"
+         , groups = [ clap::ArgGroup::new("action").args(["manpage", "shell", "font-file", "script.vvs"])
+                    , clap::ArgGroup::new("ass")   .args(["subtitle.ass"]).conflicts_with_all(["manpage", "font-file"])
+                    , clap::ArgGroup::new("opts")  .args(["options.ini"]) .conflicts_with_all(["shell", "manpage", "font-file"])
+                    , clap::ArgGroup::new("infos") .args(["info"])        .conflicts_with_all(["shell", "manpage", "font-file"])
+])]
 pub struct Args {
     /// The script to run.
     ///
@@ -68,8 +41,8 @@ pub struct Args {
     #[arg( short        = 't'
          , long         = "option"
          , action       = clap::ArgAction::Set
-         , id           = "options.toml"
-         , value_parser = FileTypeValueParser::new("toml")
+         , id           = "options.ini"
+         , value_parser = FileTypeValueParser::new("ini")
     )]
     pub options: Option<PathBuf>,
 
@@ -85,17 +58,6 @@ pub struct Args {
     )]
     pub include_folders: Vec<PathBuf>,
 
-    /// Launch vvcc REPL after loading the passed script if any.
-    ///
-    /// In REPL mode you must not touch to fields that begins by underscores, never. Those fields
-    /// are reserved for vivy or for library developpers. Note that even library developpers must
-    /// not touch or call fields from vivy that begins by underscores.
-    #[cfg(unix)]
-    #[arg( short  = 'i'
-         , action = clap::ArgAction::SetTrue
-    )]
-    pub interactive: bool,
-
     /// Shows informations about a script.
     ///
     /// The informations consists of the loaded modules, all the options, their possible values,
@@ -129,12 +91,14 @@ pub struct Args {
     /// `$HOME/.local/share/man/man1/` or `/usr/share/man/man1` folder
     #[arg( long   = "manpage"
          , action = clap::ArgAction::SetTrue
+         , hide   = true
     )]
     pub manpage: bool,
 
     /// Generate completion script for the given shell
     #[arg( long   = "shell"
          , action = clap::ArgAction::Set
+         , hide   = true
     )]
     pub shell: Option<Shell>,
 }
diff --git a/src/Rust/vvs_cli/src/config.rs b/src/Rust/vvs_cli/src/config.rs
index 38b4d304..0222b83d 100644
--- a/src/Rust/vvs_cli/src/config.rs
+++ b/src/Rust/vvs_cli/src/config.rs
@@ -29,7 +29,6 @@ pub struct Config {
     pub script: Option<PathBuf>,
     pub ass_file: Option<PathBuf>,
     pub options: Option<PathBuf>,
-    pub interactive: bool,
     pub info: bool,
     pub manpage: bool,
     pub shell: Option<Shell>,
@@ -92,23 +91,26 @@ impl Extend<Args> for Config {
                 append     args => self, { include_folders };
                 set_if_not args => self, { script, ass_file, options, shell, font_info };
                 max        args => self, { verbose };
-                override   args => self, { info, manpage, interactive };
+                override   args => self, { info, manpage };
             }
         });
     }
 }
 
 impl ConfigFile {
+    #[inline]
     pub fn serialize(&self) -> Result<String, Box<dyn std::error::Error>> {
         Ok(toml::to_string_pretty(self).map_err(Box::new)?)
     }
 
+    #[inline]
     pub fn deserialize(input: String) -> Result<Self, Box<dyn std::error::Error>> {
         Ok(toml::from_str(&input).map_err(Box::new)?)
     }
 }
 
 impl Default for ConfigKaraMaker {
+    #[inline]
     fn default() -> Self {
         Self { kara_maker: "Viieux".to_string(), email: Default::default() }
     }
diff --git a/src/Rust/vvs_cli/src/main.rs b/src/Rust/vvs_cli/src/main.rs
index da51848f..345a2bbe 100644
--- a/src/Rust/vvs_cli/src/main.rs
+++ b/src/Rust/vvs_cli/src/main.rs
@@ -1,12 +1,18 @@
 //! The VivyScript cli
-#![forbid(unsafe_code)]
 
-use anyhow::{Context, Result};
+use crate::args::Args;
+use anyhow::{anyhow, Context, Result};
+use clap::CommandFactory;
+use std::{fs, io};
+use vvs_ass::{ass_container_from_file, ASSContainer};
 use vvs_cli::{
     args,
     config::{Config, ConfigFile},
     logger,
 };
+use vvs_codegen::LowererBuilder;
+use vvs_parser::prelude::*;
+use vvs_runtime::{types::VVRTTable, JIT};
 use vvs_utils::xdg::*;
 
 fn print_face_info(name: &str, font: &[u8]) -> Result<()> {
@@ -20,10 +26,7 @@ fn print_face_info(name: &str, font: &[u8]) -> Result<()> {
         .join(", ");
 
     println!("###");
-    println!(
-        "# Family Name:        {}",
-        font.name().with_context(|| "failed to get the font name")?
-    );
+    println!("# Family Name:        {}", font.name().context("failed to get the font name")?);
     println!("# Name(s):            {}", font.family_names().join(", "));
     println!("# Font Type(s):       {font_types}");
     println!("# Number of glyph(s): {}", font.number_of_glyphs());
@@ -32,68 +35,100 @@ fn print_face_info(name: &str, font: &[u8]) -> Result<()> {
 }
 
 fn main() -> Result<()> {
-    logger::init(None).map_err(Box::new)?;
-
+    logger::init(None).context("failed to init logger")?;
     let mut config = Config::default();
     config.extend([
         XDGConfig::<ConfigFile, XDGConfigMergedSilent>::new("vvcc", ConfigFile::deserialize)
             .file("vvcc.toml")
             .read_or_default(ConfigFile::serialize),
     ]);
-    config.extend([<args::Args as clap::Parser>::parse()]);
+    config.extend([<Args as clap::Parser>::parse()]);
     let Config {
         script,
-        ass_file: _,
-        options: _,
-        #[cfg(unix)]
-        interactive,
-        info: _,
+        ass_file: ass_file_path,
+        options: options_path,
+        info,
         manpage,
         shell,
         font_info,
         verbose,
         include_folders: _,
-        ..
+        kara_maker,
     } = config;
-    #[cfg(not(unix))]
-    let interactive = false;
     logger::level(verbose);
 
     if manpage {
         log::debug!(target: "vvcc", "generate the manpage for vvcc");
-        use clap::CommandFactory;
-        return clap_mangen::Man::new(args::Args::command())
-            .render(&mut std::io::stdout())
-            .with_context(|| "failed to render manpage for vvcc");
-    } else if let Some(shell) = shell {
+        return clap_mangen::Man::new(Args::command())
+            .render(&mut io::stdout())
+            .context("failed to render manpage for vvcc");
+    }
+
+    if let Some(shell) = shell {
         log::debug!(target: "vvcc", "generate shell completion script for shell {shell}");
-        use clap::CommandFactory;
-        let mut command = args::Args::command();
+        let mut command = Args::command();
         let command_name = command.get_name().to_string();
-        clap_complete::generate(shell, &mut command, command_name, &mut std::io::stdout());
+        clap_complete::generate(shell, &mut command, command_name, &mut io::stdout());
         return Ok(());
-    } else if let Some(font_info) = font_info {
-        match font_info {
-            Some(path) => {
-                let font =
-                    std::fs::read(&path).with_context(|| format!("failed to read font: {}", path.to_string_lossy()))?;
-                print_face_info(&path.to_string_lossy(), &font)?;
+    }
+
+    if let Some(font_info) = font_info {
+        return match font_info {
+            Some(path) => print_face_info(
+                &path.to_string_lossy(),
+                &fs::read(&path).with_context(|| format!("failed to read font: {}", path.to_string_lossy()))?,
+            ),
+            None => vvs_font::embeded_fonts()
+                .iter()
+                .try_for_each(|(n, f)| print_face_info(n, f)),
+        };
+    }
+
+    match script {
+        None => Args::command()
+            .print_help()
+            .context("failed to print help message for vvcc"),
+
+        Some(script) => {
+            let script = SourceCode::from_path(script)?;
+            log::info!("run as `{kara_maker}` script `{}`", script.name());
+            if let Some(ref options) = options_path {
+                log::info!("use option file `{}`", options.display())
             }
-            None => {
-                for (name, font) in vvs_font::embeded_fonts() {
-                    print_face_info(name, font)?;
+
+            let output = FrontendPipeline::new(&script)
+                .passes(&[])
+                .options(options_path.as_ref())
+                .context("failed to parse option file")?
+                .run()
+                .context("failed to parse script files")?;
+
+            if info {
+                match ass_file_path {
+                    Some(ref path) => println!("ass file ........... {}", path.display()),
+                    None => println!("ass file ........... ø"),
+                }
+                match options_path {
+                    Some(path) => println!("options file ....... {}", path.display()),
+                    None => println!("options file ....... ø"),
                 }
+                println!("{output}");
             }
-        }
-        return Ok(());
-    }
 
-    if script.is_none() && !interactive {
-        use clap::CommandFactory;
-        return args::Args::command()
-            .print_help()
-            .with_context(|| "failed to print help message for vvcc");
-    }
+            // let FrontendOutput { ast, imports, main, options, library } = output;
 
-    Ok(())
+            let ass: ASSContainer<VVRTTable> = ass_container_from_file(
+                ass_file_path.ok_or_else(|| anyhow!("no subtitle file to run the script `{}` on", script.name()))?,
+            )
+            .context("failed to parse the subtitle file")?;
+
+            let jit = JIT::new()?;
+            let module = unsafe { LowererBuilder::new(script.name(), jit.ctx()) }.build().lower();
+            unsafe { jit.add_module(module)? };
+
+            log::error!("use the ASS container and insert it into the JIT: {ass:#?}");
+
+            unimplemented!()
+        }
+    }
 }
diff --git a/src/Rust/vvs_cli/src/parser.rs b/src/Rust/vvs_cli/src/parser.rs
index 21f29bfd..1e03bbc7 100644
--- a/src/Rust/vvs_cli/src/parser.rs
+++ b/src/Rust/vvs_cli/src/parser.rs
@@ -42,19 +42,13 @@ impl TypedValueParser for FileTypeValueParser {
                 None => {
                     err.insert(
                         ContextKind::InvalidValue,
-                        ContextValue::String(format!(
-                            "file has no extension, expected extension {}",
-                            self.extension
-                        )),
+                        ContextValue::String(format!("file has no extension, expected extension {}", self.extension)),
                     );
                     Err(err)
                 }
             },
             None => {
-                err.insert(
-                    ContextKind::InvalidValue,
-                    ContextValue::String("invalid utf8 string".to_string()),
-                );
+                err.insert(ContextKind::InvalidValue, ContextValue::String("invalid utf8 string".to_string()));
                 Err(err)
             }
         }
diff --git a/src/Rust/vvs_codegen/Cargo.toml b/src/Rust/vvs_codegen/Cargo.toml
new file mode 100644
index 00000000..39d9009a
--- /dev/null
+++ b/src/Rust/vvs_codegen/Cargo.toml
@@ -0,0 +1,23 @@
+[package]
+name = "vvs_codegen"
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+description = "The codegen into LLVM for Vivy Script"
+
+[dependencies]
+log.workspace        = true
+serde.workspace      = true
+serde_json.workspace = true
+anyhow.workspace     = true
+hashbrown.workspace  = true
+
+vvs_runtime_types.workspace = true
+vvs_utils.workspace         = true
+vvs_llvm.workspace          = true
+vvs_lang.workspace          = true
+
+[build-dependencies]
+vvs_llvm = { workspace = true, features = ["link"] }
+anyhow.workspace = true
diff --git a/src/Rust/vvs_codegen/build.rs b/src/Rust/vvs_codegen/build.rs
new file mode 100644
index 00000000..a0148072
--- /dev/null
+++ b/src/Rust/vvs_codegen/build.rs
@@ -0,0 +1,3 @@
+fn main() -> anyhow::Result<()> {
+    vvs_llvm::build::llvm_link()
+}
diff --git a/src/Rust/vvs_codegen/src/context.rs b/src/Rust/vvs_codegen/src/context.rs
new file mode 100644
index 00000000..6088a633
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/context.rs
@@ -0,0 +1,105 @@
+use crate::Value;
+use hashbrown::HashMap;
+use vvs_llvm::*;
+use vvs_runtime_types::vvll::LLVMTypeIsManaged;
+
+/// Just a hashmap used to store values in scope.
+#[derive(Default, Clone)]
+pub(crate) struct ValueContext {
+    /// The values in context.
+    values: HashMap<Box<str>, Value>,
+
+    /// The values that are to be droped, in the order of their définition! They must be dropped in
+    /// the reverse order in which they are stored!
+    to_drop: Vec<Value>,
+
+    /// The number of anon values present in this context.
+    anon_count: u64,
+}
+
+impl ValueContext {
+    /// Create a new sub-context. We clone the available values but not the destructors to run as
+    /// we don't want to run them too early.
+    pub fn sub_context(&self) -> Self {
+        let Self { values, anon_count: i, .. } = self;
+        Self { values: values.clone(), anon_count: *i, to_drop: vec![] }
+    }
+
+    /// Register a new value in the context. We don't give a shit about its name, see if we need a
+    /// destructor for this value.
+    pub fn register_anon(&mut self, value: Value) {
+        if let Some(name) = value.as_str() {
+            let name = format!(".anon.{}:{}", self.anon_count, name);
+            self.anon_count += 1;
+            self.register(name, value)
+        }
+    }
+
+    /// Clone the context and register a new value into it. Used to reduce a bit calls to clone
+    /// everywhere...
+    pub fn to_register(&self, name: impl AsRef<str>, value: Value) -> Self {
+        let mut this = self.clone();
+        this.register(name, value);
+        this
+    }
+
+    /// Clone the context and register a new value into it. Used to reduce a bit calls to clone
+    /// everywhere...
+    pub fn to_register_anon(&self, value: Value) -> Self {
+        let mut this = self.clone();
+        this.register_anon(value);
+        this
+    }
+
+    /// Register a new value in the context.
+    pub fn register(&mut self, name: impl AsRef<str>, value: Value) {
+        fn inner(this: &mut ValueContext, name: &str, value: Value) {
+            log::error!("take into account destructors for {name}");
+            if Value::Nil == value {
+                panic!("can't register nil value `{name}`")
+            } else if this.values.insert(name.into(), value).is_some() {
+                panic!("multiple definitions of `{name}`")
+            }
+        }
+        inner(self, name.as_ref(), value)
+    }
+
+    /// Register a multiple values in the context.
+    pub fn register_all(&mut self, iter: impl IntoIterator<Item = (impl AsRef<str>, Value)>) {
+        iter.into_iter().for_each(|(name, value)| self.register(name, value));
+    }
+
+    /// Get the values to drop in this context in the order of their definition. Also remove them
+    /// from this context.
+    pub fn get_values_to_drop(&mut self) -> Vec<Value> {
+        std::mem::take(&mut self.to_drop)
+    }
+
+    /// Forget a value to drop by its llvm value ref. This way we can also forget anon values.
+    pub fn forget_by_llvm_value(&mut self, value: LLVMValueRef) {
+        use Value::*;
+        if let Some(idx) = self.to_drop.iter().enumerate().find_map(|(idx, val)| {
+            matches!(*val, Const(_, val) | Alloca(_, _, val) | Function(_, _, val) if val == value).then_some(idx)
+        }) {
+            self.to_drop.remove(idx);
+        }
+    }
+
+    /// Add values to drop from another context to extend their lifetime. We can't fail that thing
+    /// because we ignore values that are re-registered.
+    pub fn add_values_to_drop(&mut self, mut values: Vec<Value>) {
+        values.retain(|v| {
+            v.llvm_value()
+                .is_some_and(|v| self.to_drop.iter().any(|u| u.llvm_value().is_some_and(|u| u == v)))
+                && v.llvm_type().is_some_and(|t| unsafe { LLVMTypeIsManaged(t) })
+        });
+        self.to_drop.append(&mut values);
+    }
+
+    /// Get the value by its name in the context, or panic!
+    pub fn get_value(&self, name: impl AsRef<str>) -> &Value {
+        self.values
+            .get(name.as_ref())
+            .unwrap_or_else(|| panic!("failed to find value `{}`", name.as_ref()))
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/graph.rs b/src/Rust/vvs_codegen/src/graph.rs
new file mode 100644
index 00000000..51388796
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/graph.rs
@@ -0,0 +1,103 @@
+//! Small utility to store a basic block graph of a function to compute dominance of values.
+
+use hashbrown::HashSet;
+use std::{collections::VecDeque, hash::Hash, iter};
+
+#[derive(Debug)]
+pub(crate) struct Graph<N: Copy + Clone + PartialEq + Eq + Hash> {
+    /// The nodes of the graph.
+    content: Vec<N>,
+
+    /// Encodes the edges of the graph. In general we have at most 2 outgoing edges per node (one
+    /// for test false, one for test true). We should not encounter a switch, or at least not that
+    /// many...
+    adjacence: Vec<(usize, usize)>,
+}
+
+impl<N: Copy + Clone + PartialEq + Eq + Hash> Default for Graph<N> {
+    fn default() -> Self {
+        Self { content: Vec::default(), adjacence: Vec::default() }
+    }
+}
+
+impl<N: Copy + Clone + PartialEq + Eq + Hash> Graph<N> {
+    /// Create a new empty graph but with a given capacity.
+    pub fn with_capacity(capacity: usize) -> Self {
+        Self { content: Vec::with_capacity(capacity), adjacence: Vec::with_capacity(capacity.saturating_mul(2)) }
+    }
+
+    /// Insert a new node in the graph. If the node is already present we do nothing.
+    pub fn add_node(mut self, node: N) -> Self {
+        if !self.content.contains(&node) {
+            self.content.push(node);
+        }
+        self
+    }
+
+    /// Insert a list of nodes in the graph.
+    pub fn add_nodes(self, nodes: impl IntoIterator<Item = N>) -> Self {
+        nodes.into_iter().fold(self, |this, node| this.add_node(node))
+    }
+
+    /// Insert an edge in the graph. If the edge already exists we do nothing.
+    pub fn add_edge(mut self, from: N, to: N) -> Self {
+        let (from, to) = (self.node_index(from), self.node_index(to));
+        if !self.adjacence.iter().any(|(ef, et)| *ef == from && *et == to) {
+            self.adjacence.push((from, to));
+        }
+        self
+    }
+
+    /// Find the index of a node in the graph or panic!
+    fn node_index(&self, node: N) -> usize {
+        self.content
+            .iter()
+            .enumerate()
+            .find_map(|(idx, n)| (*n == node).then_some(idx))
+            .expect("failed to find node")
+    }
+
+    /// Get all the direct next nodes from a given node.
+    fn nexts(&self, from: N) -> Vec<N> {
+        let node = self.node_index(from);
+        self.adjacence
+            .iter()
+            .filter(|&&(from, _)| (from == node))
+            .map(|&(_, to)| self.content[to])
+            .collect()
+    }
+
+    /// Returns all the nodes in all the simple paths between two nodes. The nodes can be the same,
+    /// in this case we return only this node. When computing the the paths we don't take loop edges.
+    pub fn any_path_content(&self, from: N, to: N) -> HashSet<N> {
+        // Don't ever reallocate.
+        let mut visited = VecDeque::with_capacity(self.content.len());
+        let mut stack = Vec::with_capacity(self.content.len());
+        let mut ret = HashSet::with_capacity(self.content.len());
+
+        // Init the state.
+        visited.push_front(from);
+        stack.push(self.nexts(from));
+
+        // Just do the search.
+        while let Some(children) = stack.last_mut() {
+            match children.pop() {
+                Some(child) if child == to => {
+                    ret.extend(visited.iter().copied().chain(iter::once(to)));
+                }
+                Some(child) if !visited.contains(&child) => {
+                    visited.push_front(child);
+                    stack.push(self.nexts(child));
+                }
+                Some(_visited_child) => {}
+                None => {
+                    visited.pop_back();
+                    stack.pop();
+                }
+            }
+        }
+
+        // We only have to returns the traversed nodes from the paths that found to.
+        ret
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lib.rs b/src/Rust/vvs_codegen/src/lib.rs
new file mode 100644
index 00000000..8f74fd9d
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lib.rs
@@ -0,0 +1,29 @@
+//! The code used to lower the Vivy Script AST into LLVM code.
+
+mod context;
+mod graph;
+mod lowerer;
+mod value;
+
+// Exports in this crate.
+use crate::{context::*, graph::*, value::*};
+
+// Re-exports.
+pub use lowerer::{Lowerer, LowererBuilder};
+
+type LLVMLowerContext = (vvs_llvm::LLVMModuleRef, vvs_llvm::LLVMContextRef, vvs_llvm::LLVMBuilderRef);
+
+/// The number of temp / unnamed values.
+static mut TEMP_NAME_COUNTER: u64 = 0;
+
+#[macro_export]
+macro_rules! cstr {
+    ($str: literal, $($arg: expr),+ $(,)?) => {
+        format!(concat!($str, "\0"), $($arg),+).as_ptr() as *const i8
+    };
+
+    () => {{
+        $crate::TEMP_NAME_COUNTER += 1;
+        format!(".temp.{}\0", $crate::TEMP_NAME_COUNTER).as_ptr() as *const i8
+    }};
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/calls.rs b/src/Rust/vvs_codegen/src/lowerer/calls.rs
new file mode 100644
index 00000000..b9d0be84
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/calls.rs
@@ -0,0 +1,108 @@
+use crate::lowerer::*;
+use vvs_lang::ast::*;
+use vvs_llvm::*;
+
+/// Lower a single instruction.
+pub(super) struct CallLowerer<'a> {
+    llvm: LLVMLowerContext,
+    ctx: &'a ValueContext,
+}
+
+impl<'a> CallLowerer<'a> {
+    pub(super) fn new(llvm: LLVMLowerContext, ctx: &'a ValueContext) -> Self {
+        Self { llvm, ctx }
+    }
+
+    pub(super) unsafe fn call_intrinsic<const N: usize>(
+        name: &'static str,
+        (m, _, b): LLVMLowerContext,
+        ret: LLVMTypeRef,
+        mut args: [LLVMValueRef; N],
+    ) -> LLVMValueRef {
+        let id = LLVMLookupIntrinsicID(name.as_ptr() as *const _, name.len());
+        let mut args_ty: Vec<_> = args.iter().map(|val| LLVMTypeOf(*val)).collect();
+        let (args_ty, args_len, args) = (args_ty.as_mut_ptr(), args.len().try_into().unwrap(), args.as_mut_ptr());
+        let (functy, func) = (
+            LLVMFunctionType(ret, args_ty, args_len, 0),
+            LLVMGetIntrinsicDeclaration(m, id, args_ty, args_len as usize),
+        );
+        LLVMBuildCall2(b, functy, func, args, args_len, cstr!())
+    }
+
+    pub(super) fn lower_method_invok(
+        self,
+        obj: &ASTExpr,
+        func: impl AsRef<str>,
+        args: &[ASTExpr],
+    ) -> (ValueContext, Value) {
+        let Self { llvm: llvm @ (_, c, b), ctx } = self;
+
+        let (ctx, object) = ExpressionLowerer::with_assumed_type(llvm, obj, ctx).lower();
+        let (oty, obj) = (object.get_ast_type(), object.loaded(c, b));
+
+        let (aargs, rty, lty, lfn) = match ctx.get_value(VVRTSymbol::method(oty, func.as_ref()).unwrap().to_string()) {
+            Value::Function(ASTType::Function(aargs, rty), lty, lfn) if args.len() == aargs.len() => {
+                (aargs.clone(), rty.clone(), *lty, *lfn)
+            }
+            val => unreachable!("unexpected not a function value: {val:?}"),
+        };
+
+        let mut largs = Vec::with_capacity(args.len());
+        let largc = 1 + args.len() as u32;
+        largs.push(obj);
+        let ctx = args.iter().zip(aargs).fold(ctx, |ctx, (arg, ty)| {
+            let (ctx, arg) = ExpressionLowerer::with_expected_type(llvm, arg, &ty, &ctx).lower();
+            largs.push(arg.loaded(c, b));
+            ctx
+        });
+
+        match *rty {
+            ASTType::Nil => unsafe {
+                LLVMBuildCall2(b, lty, lfn, largs.as_mut_ptr(), largc, c"".as_ptr());
+                (ctx, Value::Nil)
+            },
+            ty => unsafe {
+                let ret_ty = TypeLowerer::new(c, &ty).lower();
+                let ptr = LLVMBuildAlloca(b, ret_ty, cstr!());
+                let val = LLVMBuildCall2(b, lty, lfn, largs.as_mut_ptr(), largc, cstr!());
+                LLVMBuildStore(b, val, ptr);
+                (ctx, Value::Alloca(ty, ret_ty, ptr))
+            },
+        }
+    }
+
+    pub(super) fn lower_func_call(self, func: &ASTExpr, args: &[ASTExpr]) -> (ValueContext, Value) {
+        let Self { llvm: llvm @ (_, c, b), ctx } = self;
+
+        let (ctx, aty, rty_ast, lty, lfn) =
+            match ExpressionLowerer::with_expected_type(llvm, func, &ASTType::Nil, ctx).lower() {
+                (ctx, Value::Function(ASTType::Function(aty, rty), lty, lfn)) if args.len() == aty.len() => {
+                    (ctx, aty, rty, lty, lfn)
+                }
+                (_, what) => unreachable!("unexpected not-a-function-thingy: {what:?}"),
+            };
+
+        let mut largs = Vec::with_capacity(args.len());
+        let args_len = args.len().try_into().expect("too many arguments");
+        let mut ctx = args.iter().zip(aty).fold(ctx, |ctx, (arg, ty)| {
+            let (ctx, expr) = ExpressionLowerer::with_expected_type(llvm, arg, &ty, &ctx).lower();
+            largs.push(expr.loaded(c, b));
+            ctx
+        });
+
+        match unsafe { LLVMGetReturnType(lty) } {
+            rty if rty == unsafe { LLVMVoidTypeInContext(c) } => unsafe {
+                LLVMBuildCall2(b, lty, lfn, largs.as_mut_ptr(), args_len, c"".as_ptr());
+                (ctx, Value::Nil)
+            },
+            rty => unsafe {
+                let val = LLVMBuildCall2(b, lty, lfn, largs.as_mut_ptr(), args_len, cstr!());
+                let ptr = LLVMBuildAlloca(b, rty, c".ignored".as_ptr());
+                LLVMBuildStore(b, val, ptr);
+                let value = Value::Alloca(*rty_ast, rty, ptr);
+                ctx.register_anon(value.clone());
+                (ctx, value)
+            },
+        }
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/cast.rs b/src/Rust/vvs_codegen/src/lowerer/cast.rs
new file mode 100644
index 00000000..4d818f3a
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/cast.rs
@@ -0,0 +1,329 @@
+use crate::lowerer::*;
+use vvs_lang::ast::*;
+use vvs_llvm::*;
+use vvs_runtime_types::{types::*, vvll::LLVMExported};
+
+pub(super) struct CastLowerer<'a> {
+    llvm: LLVMLowerContext,
+
+    source: &'a Value,
+    from_type: &'a ASTType,
+    as_type: &'a ASTType,
+
+    ctx: &'a ValueContext,
+}
+
+/// Represents the value that was casted by the [CastLowerer] lowerer.
+#[derive(Debug)]
+pub(super) enum CastedValue {
+    /// A value can be [CastedValue::Unchanged] which means that we did nothing to it. you don't
+    /// need to register it again to trop it as it's nothing new...
+    Unchanged { value: Value },
+
+    /// A value can be [CastedValue::Dynamic] which means that we generated code to try to convert
+    /// the thing at runtime. The first element is the flag which is set to true if we did succeed,
+    /// false otherwise. This is an `i8` and must be checked at runtime. Because we created a
+    /// value, we muste register it to be dropped latter if needed.
+    Dynamic { flag: LLVMValueRef, value: Value },
+
+    /// A value can be [CastedValue::Static], which means that we did generate the code to cast the
+    /// thing and that we will always succeed. We still need to register this value to be dropped
+    /// if necessary...
+    Static { value: Value },
+}
+
+impl<'a> CastLowerer<'a> {
+    /// Create a new [CastLowerer] from an AST value.
+    pub fn from_ast(llvm: LLVMLowerContext, source: &'a ASTVar, as_type: &'a ASTType, ctx: &'a ValueContext) -> Self {
+        Self::from_llvm(llvm, ctx.get_value(source.name()), as_type, ctx)
+    }
+
+    /// Create a new [CastLowerer] from a LLVM value.
+    pub fn from_llvm(llvm: LLVMLowerContext, source: &'a Value, as_type: &'a ASTType, ctx: &'a ValueContext) -> Self {
+        Self { llvm, source, as_type, from_type: source.get_ast_type(), ctx }
+    }
+
+    /// Tells if the types are the same and we don't need to do the casting.
+    fn is_same_type(from: &ASTType, to: &ASTType) -> bool {
+        (to == from)
+            || (to.is_table() && from.is_table())
+            || (to.is_sequence() && from.is_sequence())
+            || (to.is_variant() && from.is_variant())
+    }
+
+    /// Lower in a static context, meaning that we assume that the casting process must succeed and
+    /// must not require a runtime check.
+    pub fn lower_static(self) -> CastedValue {
+        use ASTType::*;
+        let Self { llvm: llvm @ (_, c, b), source, from_type, as_type, ctx } = self;
+
+        if matches!(as_type, Nil) {
+            return CastedValue::Unchanged { value: ConstantLowerer::new(c, &ASTConst::Nil).lower() };
+        } else if Self::is_same_type(from_type, as_type) {
+            return CastedValue::Unchanged { value: source.clone() };
+        }
+
+        let loaded = source.loaded(c, b);
+        let store_into_ptr = |ty: ASTType, value: LLVMValueRef| unsafe {
+            let ptr = LLVMBuildAlloca(b, LLVMTypeOf(value), cstr!());
+            LLVMBuildStore(b, value, ptr);
+            CastedValue::Static { value: Value::Alloca(ty, LLVMTypeOf(value), ptr) }
+        };
+
+        macro_rules! build_into {
+            ($ty: ident: $conv: ident) => {
+                unsafe {
+                    let llvm_type = TypeLowerer::new(c, &$ty).lower();
+                    let ptr = LLVMBuildAlloca(b, llvm_type, cstr!());
+                    LLVMBuildStore(b, $conv(b, loaded, llvm_type, cstr!()), ptr);
+                    CastedValue::Static { value: Value::Alloca($ty, llvm_type, ptr) }
+                }
+            };
+        }
+
+        match from_type {
+            Nil => match as_type {
+                Integer => CastedValue::Static {
+                    value: Value::Const(Integer, unsafe {
+                        LLVMConstInt(TypeLowerer::new(c, &Integer).lower(), Default::default(), 0)
+                    }),
+                },
+                Floating => CastedValue::Static {
+                    value: Value::Const(Floating, unsafe {
+                        LLVMConstReal(TypeLowerer::new(c, &Floating).lower(), Default::default())
+                    }),
+                },
+                Boolean => CastedValue::Static {
+                    value: Value::Const(Boolean, unsafe {
+                        LLVMConstInt(TypeLowerer::new(c, &Boolean).lower(), Default::default(), 0)
+                    }),
+                },
+                ty if ty.is_table() => store_into_ptr(AnyTable, ctx.get_value("VVRTTable_new").call(b, [])),
+                ty if ty.is_sequence() => store_into_ptr(AnySequence, ctx.get_value("VVRTSeq_new").call(b, [])),
+                Any => store_into_ptr(Any, ctx.get_value("VVRTAny_nil").call(b, [])),
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            Integer => match as_type {
+                Integer => CastedValue::Unchanged { value: source.clone() },
+                Boolean => build_into! { Boolean: LLVMBuildIntCast },
+                Floating => build_into! { Floating: LLVMBuildSIToFP },
+                Any => store_into_ptr(Any, ctx.get_value("VVRTAny_from_integer").call(b, [loaded])),
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            Floating => match as_type {
+                Floating => CastedValue::Unchanged { value: source.clone() },
+                Integer => build_into! { Integer: LLVMBuildFPToSI },
+                Boolean => build_into! { Boolean: LLVMBuildFPToSI },
+                Any => store_into_ptr(Any, ctx.get_value("VVRTAny_from_floating").call(b, [loaded])),
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            Boolean => match as_type {
+                Boolean => CastedValue::Unchanged { value: source.clone() },
+                Integer => build_into! { Integer: LLVMBuildIntCast },
+                Floating => build_into! { Floating: LLVMBuildSIToFP },
+                Any => store_into_ptr(Any, ctx.get_value("VVRTAny_from_boolean").call(b, [loaded])),
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            ty if ty.is_sequence() => match as_type {
+                Any => store_into_ptr(Any, ctx.get_value("VVRTAny_from_seq").call(b, [source.loaded(c, b)])),
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            Tuple(tuple) => match as_type {
+                Tuple(as_tuple) if tuple.len() == as_tuple.len() => unsafe {
+                    let as_llvm = TypeLowerer::new(c, as_type).lower();
+                    let from_tuple = TypeLowerer::new(c, from_type).lower();
+                    let ptr = LLVMBuildAlloca(b, as_llvm, cstr!());
+
+                    tuple.iter().enumerate().for_each(|(idx, from)| {
+                        // Get the value that we must coerce.
+                        let from_ptr = LLVMBuildStructGEP2(b, from_tuple, loaded, idx as u32, cstr!());
+                        let from_val = Value::Alloca(from.clone(), TypeLowerer::new(c, from).lower(), from_ptr);
+
+                        // Because of how we define tuples, we don't have to register the temp
+                        // values here, they should only be integers, floats or booleans.
+                        let value = match CastLowerer::from_llvm(llvm, &from_val, as_type, ctx).lower_static() {
+                            CastedValue::Unchanged { value } | CastedValue::Static { value } => value.loaded(c, b),
+                            casted => unreachable!("should have statically casted, got: {casted:?}"),
+                        };
+                        let mut idxs = [
+                            LLVMConstInt(LLVMInt32TypeInContext(c), 0, 0),
+                            LLVMConstInt(LLVMInt32TypeInContext(c), idx as u64, 0),
+                        ];
+                        let ptr = LLVMBuildGEP2(b, as_llvm, ptr, idxs.as_mut_ptr(), idxs.len() as u32, cstr!());
+                        LLVMBuildStore(b, value, ptr);
+                    });
+
+                    CastedValue::Static { value: Value::Alloca(as_type.clone(), as_llvm, ptr) }
+                },
+
+                ty if ty.is_numeric() && tuple.len() == 1 => unsafe {
+                    let from_val = Value::Alloca(
+                        tuple[0].clone(),
+                        TypeLowerer::new(c, &tuple[0]).lower(),
+                        LLVMBuildStructGEP2(b, TypeLowerer::new(c, from_type).lower(), loaded, 0, cstr!()),
+                    );
+                    CastLowerer::from_llvm(llvm, &from_val, ty, ctx).lower_static()
+                },
+
+                ty if ty.is_table() => unsafe {
+                    let table = ctx.get_value("VVRTTable_new").call(b, []);
+                    let from_tuple = TypeLowerer::new(c, from_type).lower();
+
+                    tuple.iter().enumerate().for_each(|(idx, from)| {
+                        let from_ptr = LLVMBuildStructGEP2(b, from_tuple, loaded, idx as u32, cstr!());
+                        let from_val = Value::Alloca(from.clone(), TypeLowerer::new(c, from).lower(), from_ptr);
+
+                        // Here we don't need to clone because we know that all types whithing a
+                        // tuple are trivially copiable.
+                        let value = match CastLowerer::from_llvm(llvm, &from_val, &Any, ctx).lower_static() {
+                            CastedValue::Unchanged { value } | CastedValue::Static { value } => value.loaded(c, b),
+                            casted => unreachable!("should have statically casted, got: {casted:?}"),
+                        };
+
+                        let key = idx.to_string();
+                        let (key, len) = (
+                            LLVMConstStringInContext(c, key.as_ptr() as *const _, key.len() as u32, 1),
+                            LLVMConstInt(LLVMInt32TypeInContext(c), key.len() as u64, 0),
+                        );
+                        ctx.get_value("VVRTTable_insert_from_raw_key")
+                            .call(b, [table, key, len, value]);
+                    });
+
+                    let ptr = LLVMBuildAlloca(b, VVRTTable::llvm_type(c), cstr!());
+                    LLVMBuildStore(b, table, ptr);
+                    CastedValue::Static { value: Value::Alloca(AnyTable, VVRTTable::llvm_type(c), ptr) }
+                },
+
+                ty if ty.is_sequence() => unsafe {
+                    let seq = ctx.get_value("VVRTSeq_new").call(b, []);
+                    let from_tuple = TypeLowerer::new(c, from_type).lower();
+
+                    tuple.iter().enumerate().for_each(|(idx, from)| {
+                        let from_ptr = LLVMBuildStructGEP2(b, from_tuple, loaded, idx as u32, cstr!());
+                        let from_val = Value::Alloca(from.clone(), TypeLowerer::new(c, from).lower(), from_ptr);
+
+                        // Here we don't need to clone because we know that all types whithing a
+                        // tuple are trivially copiable.
+                        let value = match CastLowerer::from_llvm(llvm, &from_val, &Any, ctx).lower_static() {
+                            CastedValue::Unchanged { value } | CastedValue::Static { value } => value.loaded(c, b),
+                            casted => unreachable!("should have statically casted, got: {casted:?}"),
+                        };
+
+                        ctx.get_value("VVRTSeq_push").call(b, [seq, value]);
+                    });
+
+                    let ptr = LLVMBuildAlloca(b, VVRTSeq::llvm_type(c), cstr!());
+                    LLVMBuildStore(b, seq, ptr);
+                    CastedValue::Static { value: Value::Alloca(AnySequence, VVRTSeq::llvm_type(c), ptr) }
+                },
+
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            ty if ty.is_variant() => match as_type {
+                as_type if as_type.is_table() => todo!(),
+                String => store_into_ptr(String, ctx.get_value("VVRTVariant_to_string").call(b, [loaded])),
+                Any => store_into_ptr(Any, ctx.get_value("VVRTAny_from_variant").call(b, [loaded])),
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            // Forbiden casts or Dynamic casts
+            ty => panic!("can't cast a value of type `{ty}` or this type need a runtime check to do the cast"),
+        }
+    }
+
+    /// Try to do the lowering at runtime, if it failed we guarenty that the value will be nil and
+    /// that no values will need to be dropped. In case of success we calling function must
+    /// register the value in the context.
+    pub fn lower_dynamic(self) -> CastedValue {
+        use ASTType::*;
+        let Self { llvm: (_, c, b), source, from_type, as_type, ctx } = self;
+
+        if matches!(as_type, Nil) && !matches!(from_type, ASTType::Any) {
+            return CastedValue::Unchanged { value: ConstantLowerer::new(c, &ASTConst::Nil).lower() };
+        } else if Self::is_same_type(from_type, as_type) {
+            return CastedValue::Unchanged { value: source.clone() };
+        }
+
+        let loaded = source.loaded(c, b);
+        let store_into_ptr = |ty: ASTType, value: LLVMValueRef| unsafe {
+            let ptr = LLVMBuildAlloca(b, LLVMTypeOf(value), cstr!());
+            LLVMBuildStore(b, value, ptr);
+            Value::Alloca(ty, LLVMTypeOf(value), ptr)
+        };
+        let any_is_ty = |ty: VVRTType| {
+            ctx.get_value("VVRTAny_is_ty")
+                .call(b, [loaded, unsafe { ty.as_llvm_const(c) }])
+        };
+
+        match from_type {
+            ty if ty.is_table() => match as_type {
+                Any => CastedValue::Static {
+                    value: store_into_ptr(Any, ctx.get_value("VVRTAny_from_table").call(b, [loaded])),
+                },
+                ty if ty.is_variant() => todo!(),
+                ty if ty.is_sequence() => todo!(),
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            // Get value out of any.
+            Any => match as_type {
+                Nil => CastedValue::Dynamic {
+                    flag: any_is_ty(VVRTType::Nil),
+                    value: ConstantLowerer::new(c, &ASTConst::Nil).lower(),
+                },
+                Integer => CastedValue::Dynamic {
+                    flag: any_is_ty(VVRTType::Number),
+                    value: store_into_ptr(Integer, ctx.get_value("VVRTAny_maybe_as_integer").call(b, [loaded])),
+                },
+                Boolean => CastedValue::Dynamic {
+                    flag: any_is_ty(VVRTType::Number),
+                    value: store_into_ptr(Boolean, ctx.get_value("VVRTAny_maybe_as_boolean").call(b, [loaded])),
+                },
+                Floating => CastedValue::Dynamic {
+                    flag: any_is_ty(VVRTType::Number),
+                    value: store_into_ptr(Floating, ctx.get_value("VVRTAny_maybe_as_floating").call(b, [loaded])),
+                },
+                String => {
+                    let val = ctx.get_value("VVRTAny_maybe_as_string").call(b, [loaded]);
+                    let val = ctx.get_value("VVRTString_clone").call(b, [val]);
+                    CastedValue::Dynamic { flag: any_is_ty(VVRTType::String), value: store_into_ptr(String, val) }
+                }
+                Syllabe => {
+                    let val = ctx.get_value("VVRTAny_maybe_as_syllabe").call(b, [loaded]);
+                    let val = ctx.get_value("VVRTSyllabe_clone").call(b, [val]);
+                    CastedValue::Dynamic { flag: any_is_ty(VVRTType::ASSSyllabe), value: store_into_ptr(Syllabe, val) }
+                }
+                Line => {
+                    let val = ctx.get_value("VVRTAny_maybe_as_line").call(b, [loaded]);
+                    let val = ctx.get_value("VVRTLine_clone").call(b, [val]);
+                    CastedValue::Dynamic { flag: any_is_ty(VVRTType::ASSLine), value: store_into_ptr(Line, val) }
+                }
+                ty if ty.is_variant() => {
+                    let val = ctx.get_value("VVRTAny_maybe_as_variant").call(b, [loaded]);
+                    let val = ctx.get_value("VVRTVariant_clone").call(b, [val]);
+                    CastedValue::Dynamic { flag: any_is_ty(VVRTType::Variant), value: store_into_ptr(Variant, val) }
+                }
+                ty if ty.is_table() => {
+                    let val = ctx.get_value("VVRTAny_maybe_as_table").call(b, [loaded]);
+                    let val = ctx.get_value("VVRTTable_clone").call(b, [val]);
+                    CastedValue::Dynamic { flag: any_is_ty(VVRTType::Table), value: store_into_ptr(AnyTable, val) }
+                }
+                ty if ty.is_sequence() => {
+                    let val = ctx.get_value("VVRTAny_maybe_as_seq").call(b, [loaded]);
+                    let val = ctx.get_value("VVRTSeq_clone").call(b, [val]);
+                    CastedValue::Dynamic { flag: any_is_ty(VVRTType::Seq), value: store_into_ptr(AnySequence, val) }
+                }
+                as_type => panic!("can't convert `{from_type} into {as_type}`"),
+            },
+
+            // Don't need to perform a runtime check to do the cast, use the lower function
+            _ => self.lower_static(),
+        }
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/constant.rs b/src/Rust/vvs_codegen/src/lowerer/constant.rs
new file mode 100644
index 00000000..e8a67e17
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/constant.rs
@@ -0,0 +1,59 @@
+use crate::Value;
+use std::mem;
+use vvs_lang::ast::*;
+use vvs_llvm::*;
+
+/// Lower a single constant. We only need the LLVM context what should be the type...
+pub(crate) struct ConstantLowerer<'a> {
+    /// The context.
+    c: LLVMContextRef,
+
+    /// We expression we want to lower.
+    constant: &'a ASTConst,
+}
+
+impl<'a> ConstantLowerer<'a> {
+    /// Create a new constant expression lowerer.
+    pub fn new(c: LLVMContextRef, constant: &'a ASTConst) -> Self {
+        Self { c, constant }
+    }
+
+    /// Create a sub-lowerer, for constants that need a recursive descent.
+    fn sub_lowerer(&self, constant: &'a ASTConst) -> Self {
+        Self { c: self.c, constant }
+    }
+
+    /// Lower the constant.
+    pub fn lower(self) -> Value {
+        let Self { c, constant } = self;
+        let ty = constant.get_const_type();
+        use {ASTConst::*, Value::*};
+        unsafe {
+            match constant {
+                ASTConst::Nil => Const(ty, LLVMConstPointerNull(LLVMInt64TypeInContext(c))),
+                False => Const(ty, LLVMConstInt(LLVMInt1TypeInContext(c), 0, 0)),
+                True => Const(ty, LLVMConstInt(LLVMInt1TypeInContext(c), 1, 0)),
+                Floating(f) => Const(ty, LLVMConstReal(LLVMFloatTypeInContext(c), *f as f64)),
+                String(s) => {
+                    let (ptr, len) = (s.as_bytes().as_ptr() as *const _, s.len().try_into().unwrap());
+                    Const(ty, LLVMConstString(ptr, len, 1))
+                }
+                Integer(i) => {
+                    let int = mem::transmute::<i64, u64>(*i as i64);
+                    Const(ty, LLVMConstInt(LLVMInt32TypeInContext(c), int, 1))
+                }
+                Tuple(inner) => {
+                    let i = inner.iter().map(|cnst| match self.sub_lowerer(cnst).lower() {
+                        Value::Const(_, val) => val,
+                        val => unreachable!("expected a constant, got {val:?}"),
+                    });
+                    let mut i = i.collect::<Vec<_>>();
+                    let (ptr, len) = (i.as_mut_ptr(), i.len().try_into().unwrap());
+                    Const(ty, LLVMConstStructInContext(c, ptr, len, 0))
+                }
+                Color(_) => panic!("need to implement colors"),
+                Table(_) => panic!("need to implement tables"),
+            }
+        }
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/drops.rs b/src/Rust/vvs_codegen/src/lowerer/drops.rs
new file mode 100644
index 00000000..3c56022c
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/drops.rs
@@ -0,0 +1,109 @@
+use crate::{value::Value, Graph, ValueContext};
+use std::collections::BTreeSet;
+use vvs_llvm::*;
+
+/// Drop all the values in the correct order at the end of a given basic block. We take into
+/// account any terminator of said basic block.
+pub(super) struct DropLowerer<'a> {
+    /// The context.
+    c: LLVMContextRef,
+
+    /// Our own builder.
+    b: LLVMBuilderRef,
+
+    /// The values to drop, they are in the order of their declaration. We drop them in the reverse
+    /// order!
+    values: &'a [Value],
+
+    /// The function from which the values must be dropped.
+    func: LLVMValueRef,
+
+    /// The basic block to use to drop things. We will create our own builder to do the thing, so
+    /// we don't need others things to pass their builder.
+    bb: LLVMBasicBlockRef,
+
+    /// The value context.
+    ctx: &'a ValueContext,
+}
+
+impl<'a> DropLowerer<'a> {
+    /// Create a new lowerer to drop the specified values from a given function at the end of a
+    /// given basic block.
+    ///
+    /// # Safety
+    /// All the values must have been declared inside the passed the function. The basic block must
+    /// be from the passed function.
+    pub unsafe fn new(
+        c: LLVMContextRef,
+        func: LLVMValueRef,
+        values: &'a [Value],
+        bb: LLVMBasicBlockRef,
+        ctx: &'a ValueContext,
+    ) -> Self {
+        let b = unsafe { LLVMCreateBuilderInContext(c) };
+        Self { c, b, values, func, bb, ctx }
+    }
+
+    pub fn lower(self) {
+        use LLVMOpcode::*;
+        let Self { c, b, values, bb, func, ctx } = self;
+
+        // Position the builder correcly.
+
+        unsafe {
+            match LLVMGetLastInstruction(bb) {
+                last if last.is_null() => LLVMPositionBuilderAtEnd(b, bb),
+                last => match LLVMGetInstructionOpcode(last) {
+                    LLVMRet | LLVMBr | LLVMSwitch | LLVMIndirectBr | LLVMCallBr => LLVMPositionBuilderBefore(b, last),
+                    _ => LLVMPositionBuilderAtEnd(b, bb),
+                },
+            };
+        };
+
+        // Get the dominance graph to filter the values that we must really drop here!
+
+        let bbs_iter = unsafe { LLVMFunctionIter::new(func) };
+        let bbs = Graph::with_capacity(bbs_iter.count()).add_nodes(bbs_iter);
+        let bbs = bbs_iter.fold(bbs, |bbs, bb| unsafe {
+            match LLVMBasicBlockIter::new(bb).last() {
+                Some(instr) => match LLVMGetInstructionOpcode(instr) {
+                    LLVMBr => match LLVMGetNumOperands(instr) {
+                        1 => bbs.add_edge(bb, LLVMValueAsBasicBlock(LLVMGetOperand(instr, 0))),
+                        3 => bbs
+                            .add_edge(bb, LLVMValueAsBasicBlock(LLVMGetOperand(instr, 1)))
+                            .add_edge(bb, LLVMValueAsBasicBlock(LLVMGetOperand(instr, 2))),
+                        n => unreachable!("got br instruction with {n} operands"),
+                    },
+                    LLVMSwitch => todo!("handle switch, got {} operands", LLVMGetNumOperands(instr)),
+                    LLVMIndirectBr => todo!("handle indirectbr, got {} operands", LLVMGetNumOperands(instr)),
+                    _ => bbs,
+                },
+                None => bbs,
+            }
+        });
+
+        // Filter the values that we must really delete and call the destructors. We can destroy
+        // the values in any order because things are reference-counted. Also, just drop the values
+
+        let declared_values: BTreeSet<LLVMValueRef> = unsafe {
+            bbs.any_path_content(LLVMGetEntryBasicBlock(func), bb)
+                .into_iter()
+                .flat_map(|bb| LLVMBasicBlockIter::new(bb))
+                .collect()
+        };
+
+        values
+            .iter()
+            .filter(|val| val.llvm_value().map_or(false, |val| declared_values.contains(&val)))
+            .flat_map(|val| val.get_dropper_name().map(|drop| (val, drop)))
+            .for_each(|(val, drop)| {
+                ctx.get_value(drop).call(b, [val.loaded(c, b)]);
+            });
+    }
+}
+
+impl<'a> Drop for DropLowerer<'a> {
+    fn drop(&mut self) {
+        unsafe { LLVMDisposeBuilder(self.b) };
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/expression.rs b/src/Rust/vvs_codegen/src/lowerer/expression.rs
new file mode 100644
index 00000000..6caad5f2
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/expression.rs
@@ -0,0 +1,347 @@
+use crate::{lowerer::*, Value, ValueContext};
+use vvs_lang::ast::*;
+use vvs_llvm::{LLVMIntPredicate::*, LLVMRealPredicate::*, *};
+use vvs_runtime_types::{
+    types::{VVRTString, VVRTTable},
+    vvll::LLVMExported,
+};
+use vvs_utils::either;
+
+/// Lower a single expression.
+pub(super) struct ExpressionLowerer<'a> {
+    llvm: LLVMLowerContext,
+
+    /// We expression we want to lower.
+    expr: &'a ASTExpr,
+
+    /// The expected type, to see if we need to generate coertion.
+    as_type: Option<&'a ASTType>,
+
+    /// The value context, this stores available already-lowered LLVM values.
+    ctx: &'a ValueContext,
+}
+
+impl<'a> ExpressionLowerer<'a> {
+    /// Create a new expression lowerer.
+    pub(super) fn with_assumed_type(llvm: LLVMLowerContext, expr: &'a ASTExpr, ctx: &'a ValueContext) -> Self {
+        Self { llvm, expr, as_type: None, ctx }
+    }
+
+    /// Create a new expression lowerer with an expected type for the lowered expression. If needed
+    /// the lower process will call [CastLowerer].
+    pub(super) fn with_expected_type(
+        llvm: LLVMLowerContext,
+        expr: &'a ASTExpr,
+        as_type: &'a ASTType,
+        ctx: &'a ValueContext,
+    ) -> Self {
+        Self { llvm, expr, as_type: Some(as_type), ctx }
+    }
+
+    /// Overwrite the used [ValueContext] used to do the lowering.
+    pub(super) fn with_ctx(mut self, ctx: &'a ValueContext) -> Self {
+        self.ctx = ctx;
+        self
+    }
+
+    /// Set the type that is expected by the expression, calling the [CastLowerer] if needed!
+    pub(super) fn into_type(mut self, ty: &'a ASTType) -> Self {
+        self.as_type = Some(ty);
+        self
+    }
+
+    /// Create a new sub-expression lowerer. Used for recusive descent to lower complexe
+    /// expressions, thus private.
+    fn sub_lowerer(&self, expr: &'a ASTExpr) -> Self {
+        let Self { llvm, ctx, .. } = *self;
+        Self { llvm, expr, as_type: None, ctx }
+    }
+
+    /// Lower an equality.
+    unsafe fn lower_equality(
+        llvm @ (_, c, b): LLVMLowerContext,
+        ctx: &ValueContext,
+        (l, lty): (LLVMValueRef, &ASTType),
+        (r, rty): (LLVMValueRef, &ASTType),
+    ) -> LLVMValueRef {
+        use ASTType::*;
+        match lty {
+            Nil => LLVMConstInt(LLVMInt1TypeInContext(c), 1, 0),
+            Boolean | Integer => LLVMBuildICmp(b, LLVMIntEQ, l, r, cstr!()),
+            Floating => {
+                let flt = LLVMFloatTypeInContext(c);
+                let diff = LLVMBuildFSub(b, l, r, c"".as_ptr());
+                let diff = CallLowerer::call_intrinsic("llvm.fabs.f32", llvm, flt, [diff]);
+                LLVMBuildFCmp(b, LLVMRealOLE, diff, LLVMConstReal(flt, 10e-5), c"".as_ptr())
+            }
+
+            Tuple(lt) => match rty {
+                Tuple(rt) if lt.len() == rt.len() => lt.iter().zip(rt).enumerate().fold(
+                    LLVMConstInt(LLVMInt1TypeInContext(c), 1, 0),
+                    |acc, (idx, (lt, rt))| {
+                        let idx = idx.try_into().expect("too many elements");
+                        let l = LLVMBuildStructGEP2(b, LLVMTypeOf(l), l, idx, cstr!());
+                        let r = LLVMBuildStructGEP2(b, LLVMTypeOf(r), r, idx, cstr!());
+                        let ret = Self::lower_equality(llvm, ctx, (l, lt), (r, rt));
+                        LLVMBuildAnd(b, ret, acc, cstr!())
+                    },
+                ),
+                _ => LLVMConstInt(LLVMInt1TypeInContext(c), 0, 0),
+            },
+
+            Any => ctx.get_value("VVRTAny_eq").call(b, [l, r]),
+            Line => ctx.get_value("VVRTLine_eq").call(b, [l, r]),
+            String => ctx.get_value("VVRTString_eq").call(b, [l, r]),
+            Syllabe => ctx.get_value("VVRTSyllabe_eq").call(b, [l, r]),
+            ty if ty.is_sequence() => ctx.get_value("VVRTSeq_eq").call(b, [l, r]),
+            ty if ty.is_variant() => ctx.get_value("VVRTVariant_eq").call(b, [l, r]),
+            ty if ty.is_table() => ctx.get_value("VVRTTable_eq").call(b, [l, r]),
+
+            _ => panic!("can't apply `{:?}` to expressions of type `{lty}` and `{rty}`", ASTBinop::CmpEQ),
+        }
+    }
+
+    /// Lower the value into LLVM-IR at the position specified by the builder passed at
+    /// construction time. If any value is created it will be added in the returned [ValueContext].
+    pub(super) fn lower(self) -> (ValueContext, Value) {
+        let Self { llvm: llvm @ (_, c, b), expr: ASTExpr { content, .. }, as_type, ctx } = self;
+        let (bln, int, flt) = (unsafe { LLVMInt1TypeInContext(c) }, unsafe { LLVMInt32TypeInContext(c) }, unsafe {
+            LLVMFloatTypeInContext(c)
+        });
+        let (false_, true_, zero_, one_) = (
+            unsafe { LLVMConstInt(bln, 0, 0) },
+            unsafe { LLVMConstInt(bln, 1, 0) },
+            unsafe { LLVMConstInt(int, 0, 0) },
+            unsafe { LLVMConstInt(int, 1, 0) },
+        );
+        let store_scalar = |ctx: ValueContext, val: LLVMValueRef, ty: LLVMTypeRef, ast: ASTType| unsafe {
+            let ptr = LLVMBuildAlloca(b, ty, cstr!());
+            LLVMBuildStore(b, val, ptr);
+            (ctx, Value::Alloca(ast, ty, ptr))
+        };
+
+        match content {
+            ASTExprVariant::Var(var) => (ctx.clone(), ctx.get_value(var.name()).clone()),
+
+            ASTExprVariant::Const(value) => {
+                let value = ConstantLowerer::new(c, value).lower();
+                match as_type {
+                    Some(expected_type) if expected_type != value.get_ast_type() => {
+                        match CastLowerer::from_llvm(llvm, &value, expected_type, ctx).lower_static() {
+                            CastedValue::Unchanged { value } => (ctx.clone(), value),
+                            CastedValue::Static { value } => (ctx.to_register_anon(value.clone()), value),
+                            CastedValue::Dynamic { .. } => unreachable!(),
+                        }
+                    }
+                    _ => (ctx.clone(), value),
+                }
+            }
+
+            ASTExprVariant::Tuple(tuple) => unsafe {
+                let (mut lowered_tuple, mut types, mut tuple_ty) =
+                    (Vec::with_capacity(tuple.len()), Vec::with_capacity(tuple.len()), Vec::with_capacity(tuple.len()));
+
+                let ctx = tuple.iter().fold(self.ctx.clone(), |ctx, item| {
+                    let (ctx, expr) = self.sub_lowerer(item).with_ctx(&ctx).lower();
+                    let (ast_type, expr) = (expr.get_ast_type(), expr.loaded(c, b));
+                    lowered_tuple.push(expr);
+                    types.push(LLVMTypeOf(expr));
+                    tuple_ty.push(ast_type.clone());
+                    ctx
+                });
+
+                let tuple_len = types.len().try_into().expect("too many elements");
+                let types = LLVMStructTypeInContext(c, types.as_mut_ptr(), tuple_len, 0);
+                let tuple_ptr = LLVMBuildAlloca(b, types, c"".as_ptr());
+
+                for (idx, val) in lowered_tuple.into_iter().enumerate() {
+                    let idx = idx.try_into().expect("too many elements");
+                    let ptr = LLVMBuildStructGEP2(b, types, tuple_ptr, idx, c"".as_ptr());
+                    LLVMBuildStore(b, val, ptr);
+                }
+
+                (ctx, Value::Alloca(ASTType::Tuple(tuple_ty), types, tuple_ptr))
+            },
+
+            ASTExprVariant::Table(table) => unsafe {
+                let ty = VVRTTable::llvm_type(c);
+                let ptr = LLVMBuildAlloca(b, ty, c"".as_ptr());
+                LLVMBuildStore(b, ctx.get_value("VVRTTable_new").call(b, []), ptr);
+                let mut ctx = table.iter().fold(self.ctx.clone(), |_, (key, value)| {
+                    // Static key! The table will create it's own string.
+                    let key_len: u32 = key.len().try_into().expect("too many elements");
+                    let key = LLVMConstStringInContext(c, key.as_ptr() as *const _, key_len, 1);
+                    let key_len = LLVMConstInt(LLVMInt32TypeInContext(c), key_len as u64, 0);
+
+                    // Lower the value and cast it into an Any.
+                    let (mut ctx, value) = self.sub_lowerer(value).into_type(&ASTType::Any).lower();
+                    let value = value.loaded(c, b);
+                    ctx.forget_by_llvm_value(value);
+
+                    // Insert the value with the correct key.
+                    ctx.get_value("VVRTTable_insert_from_raw_key")
+                        .call(b, [ptr, key, key_len, value]);
+                    ctx
+                });
+                let value = Value::Alloca(ASTType::AnyTable, ty, ptr);
+                ctx.register_anon(value.clone());
+                (ctx, value)
+            },
+
+            ASTExprVariant::FuncCall(func, args) => {
+                let (ctx, value) = CallLowerer::new(llvm, self.ctx).lower_func_call(func, args);
+                (ctx.to_register_anon(value.clone()), value)
+            }
+            ASTExprVariant::MethodInvok(obj, method, args) => {
+                let (ctx, value) = CallLowerer::new(llvm, self.ctx).lower_method_invok(obj, method, args);
+                (ctx.to_register_anon(value.clone()), value)
+            }
+
+            ASTExprVariant::Unop(op, inner) => unsafe {
+                use vvs_lang::ast::{ASTType::*, ASTUnop::*};
+
+                let (ctx, inner) = match as_type {
+                    Some(ty) => self.sub_lowerer(inner).into_type(ty).lower(),
+                    None => self.sub_lowerer(inner).lower(),
+                };
+                let (ty, inner) = (inner.get_ast_type(), inner.loaded(c, b));
+                let call_len = |ctx: ValueContext, func: &str| {
+                    let value = ctx.get_value(func).call(b, [inner]);
+                    store_scalar(ctx, value, int, Integer)
+                };
+
+                match op {
+                    LogicNot | BitNot | Neg if matches!(ty, Boolean) => {
+                        let cmp = LLVMBuildICmp(b, LLVMIntEQ, inner, false_, cstr!());
+                        let res = LLVMBuildSelect(b, cmp, true_, false_, cstr!());
+                        store_scalar(ctx, res, bln, Boolean)
+                    }
+
+                    LogicNot if matches!(ty, Integer) => {
+                        let cmp = LLVMBuildICmp(b, LLVMIntEQ, inner, zero_, cstr!());
+                        let res = LLVMBuildSelect(b, cmp, one_, zero_, cstr!());
+                        store_scalar(ctx, res, int, Integer)
+                    }
+
+                    BitNot if matches!(ty, Integer) => {
+                        let res = CallLowerer::call_intrinsic("llvm.bitreverse.i32", llvm, int, [inner]);
+                        store_scalar(ctx, res, int, Integer)
+                    }
+
+                    #[rustfmt::skip] Neg if matches!(ty, Integer ) => store_scalar(ctx, LLVMBuildNeg (b, inner, cstr!()), int, Integer ),
+                    #[rustfmt::skip] Neg if matches!(ty, Floating) => store_scalar(ctx, LLVMBuildFNeg(b, inner, cstr!()), flt, Floating),
+
+                    #[rustfmt::skip] Len => match ty {
+                        Line                   => call_len(ctx, "VVRTLine_len"),
+                        String                 => call_len(ctx, "VVRTString_len"),
+                        Syllabe                => call_len(ctx, "VVRTSyllabe_len"),
+                        ty if ty.is_sequence() => call_len(ctx, "VVRTSeq_len"),
+                        ty if ty.is_table()    => call_len(ctx, "VVRTTable_len"),
+                        Tuple(len) => {
+                            let len = TryInto::<i32>::try_into(len.len()).expect("too many elements") as u64;
+                            (ctx, Value::Const(Integer, LLVMConstInt(int, len, 0)))
+                        }
+                        ty => panic!("can't apply `{op:?}` to expression of type `{ty}`"),
+                    },
+
+                    op => panic!("can't apply `{op:?}` to expression of type `{ty}`"),
+                }
+            },
+
+            ASTExprVariant::Binop(left, op, right) => unsafe {
+                use vvs_lang::ast::{ASTBinop::*, ASTType::*};
+
+                let (ctx, left) = match as_type {
+                    Some(ty) => self.sub_lowerer(left).into_type(ty).lower(),
+                    None => self.sub_lowerer(left).lower(),
+                };
+                let lty = left.get_ast_type();
+                let (ctx, right) = self
+                    .sub_lowerer(right)
+                    .into_type(either!(*op == Power => &Integer; lty))
+                    .with_ctx(&ctx)
+                    .lower();
+                let (l, r, rty) = (left.loaded(c, b), right.loaded(c, b), right.get_ast_type());
+                let (is_int, is_flt, is_bln) =
+                    (matches!(lty, Integer), matches!(lty, Floating), matches!(lty, Boolean));
+
+                let (res, ty, ast) = match op {
+                    Power if is_int => todo!(),
+                    Power if is_flt => todo!(),
+
+                    #[rustfmt::skip] Mul if is_int => (LLVMBuildMul (b, l, r, cstr!()), int, Integer),
+                    #[rustfmt::skip] Div if is_int => (LLVMBuildSDiv(b, l, r, cstr!()), int, Integer),
+                    #[rustfmt::skip] Add if is_int => (LLVMBuildAdd (b, l, r, cstr!()), int, Integer),
+                    #[rustfmt::skip] Sub if is_int => (LLVMBuildSub (b, l, r, cstr!()), int, Integer),
+
+                    #[rustfmt::skip] Mul if is_flt => (LLVMBuildFMul(b, l, r, cstr!()), flt, Floating),
+                    #[rustfmt::skip] Div if is_flt => (LLVMBuildFDiv(b, l, r, cstr!()), flt, Floating),
+                    #[rustfmt::skip] Add if is_flt => (LLVMBuildFAdd(b, l, r, cstr!()), flt, Floating),
+                    #[rustfmt::skip] Sub if is_flt => (LLVMBuildFSub(b, l, r, cstr!()), flt, Floating),
+
+                    #[rustfmt::skip] Mod if is_int => (LLVMBuildSRem(b, l, r, cstr!()), int, Integer ),
+                    #[rustfmt::skip] Mod if is_flt => (LLVMBuildFRem(b, l, r, cstr!()), flt, Floating),
+
+                    #[rustfmt::skip] StrCat if matches!(lty, String) => {
+                        (ctx.get_value("VVRTString_cat").call(b, [l, r]), VVRTString::llvm_type(c), String)
+                    },
+
+                    #[rustfmt::skip] CmpLE if is_int => (LLVMBuildICmp(b, LLVMIntSLE,  l, r, cstr!()), bln, Boolean),
+                    #[rustfmt::skip] CmpLT if is_int => (LLVMBuildICmp(b, LLVMIntSLT,  l, r, cstr!()), bln, Boolean),
+                    #[rustfmt::skip] CmpGE if is_int => (LLVMBuildICmp(b, LLVMIntSGE,  l, r, cstr!()), bln, Boolean),
+                    #[rustfmt::skip] CmpGT if is_int => (LLVMBuildICmp(b, LLVMIntSGT,  l, r, cstr!()), bln, Boolean),
+
+                    #[rustfmt::skip] CmpLE if is_flt => (LLVMBuildFCmp(b, LLVMRealOLE, l, r, cstr!()), flt, Floating),
+                    #[rustfmt::skip] CmpLT if is_flt => (LLVMBuildFCmp(b, LLVMRealOLT, l, r, cstr!()), flt, Floating),
+                    #[rustfmt::skip] CmpGE if is_flt => (LLVMBuildFCmp(b, LLVMRealOGE, l, r, cstr!()), flt, Floating),
+                    #[rustfmt::skip] CmpGT if is_flt => (LLVMBuildFCmp(b, LLVMRealOGT, l, r, cstr!()), flt, Floating),
+
+                    #[rustfmt::skip] BitAnd | LogicAnd if is_bln => (LLVMBuildAnd(b, l, r, cstr!()), bln, Boolean),
+                    #[rustfmt::skip] BitXor | LogicXor if is_bln => (LLVMBuildXor(b, l, r, cstr!()), bln, Boolean),
+                    #[rustfmt::skip] BitOr  | LogicOr  if is_bln => (LLVMBuildOr (b, l, r, cstr!()), bln, Boolean),
+
+                    #[rustfmt::skip] BitAnd   if is_int => (LLVMBuildAnd(b, l, r, cstr!()), int, Integer),
+                    #[rustfmt::skip] BitXor   if is_int => (LLVMBuildXor(b, l, r, cstr!()), int, Integer),
+                    #[rustfmt::skip] BitOr    if is_int => (LLVMBuildOr (b, l, r, cstr!()), int, Integer),
+                    #[rustfmt::skip] LogicAnd if is_int => (LLVMBuildICmp(b, LLVMIntEQ, LLVMBuildAnd(b, l, r, cstr!()), one_, cstr!()), bln, Boolean),
+                    #[rustfmt::skip] LogicXor if is_int => (LLVMBuildICmp(b, LLVMIntEQ, LLVMBuildXor(b, l, r, cstr!()), one_, cstr!()), bln, Boolean),
+                    #[rustfmt::skip] LogicOr  if is_int => (LLVMBuildICmp(b, LLVMIntEQ, LLVMBuildOr (b, l, r, cstr!()), one_, cstr!()), bln, Boolean),
+
+                    #[rustfmt::skip] BitShiftLeft  if is_int => (LLVMBuildShl (b, l, r, cstr!()), int, Integer),
+                    #[rustfmt::skip] BitShiftRight if is_int => (LLVMBuildAShr(b, l, r, cstr!()), int, Integer),
+
+                    CmpEQ => (Self::lower_equality(llvm, &ctx, (l, lty), (r, rty)), bln, Boolean),
+                    CmpNE => {
+                        let not = Self::lower_equality(llvm, &ctx, (l, lty), (r, rty));
+                        (LLVMBuildNot(b, not, cstr!()), bln, Boolean)
+                    }
+
+                    op => panic!("can't apply `{op:?}` to expressions of type `{lty}` and `{rty}`"),
+                };
+                store_scalar(ctx, res, ty, ast)
+            },
+
+            ASTExprVariant::Suffixed(table, _fields) => {
+                let (_ctx, _table) = self.sub_lowerer(table).lower();
+                todo!()
+            }
+
+            ASTExprVariant::Color(variant) | ASTExprVariant::Movement(variant) => {
+                let mut arguments = Vec::with_capacity(variant.args_len());
+                let _ctx = variant.args().iter().fold(ctx.clone(), |ctx, expr| {
+                    let (ctx, expr) = self.sub_lowerer(expr).with_ctx(&ctx).lower();
+                    arguments.push(expr);
+                    ctx
+                });
+                let _variant = variant.variant();
+
+                todo!()
+            }
+
+            ASTExprVariant::Default(_) => todo!(),
+
+            // See later for clozures
+            ASTExprVariant::FuncBind(_, _) => unreachable!(),
+        }
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/function.rs b/src/Rust/vvs_codegen/src/lowerer/function.rs
new file mode 100644
index 00000000..fd8ab087
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/function.rs
@@ -0,0 +1,55 @@
+use crate::{lowerer::*, ValueContext};
+use vvs_lang::ast::*;
+use vvs_llvm::*;
+
+pub(super) struct FunctionLowerer<'a> {
+    llvm: LLVMLowerContext,
+
+    /// The global context, we store a reference, then we will add it the arguments of the
+    /// function.
+    ctx: &'a ValueContext,
+
+    /// The llvm function.
+    value: LLVMValueRef,
+
+    /// The vivy function.
+    function: &'a ASTFunction,
+}
+
+impl<'a> FunctionLowerer<'a> {
+    pub fn new(llvm: LLVMLowerContext, ctx: &'a ValueContext, v: LLVMValueRef, f: &'a ASTFunction) -> Self {
+        Self { llvm, ctx, value: v, function: f }
+    }
+
+    pub fn lower(self) {
+        let Self { llvm: llvm @ (_, c, b), value, function, .. } = self;
+        let ASTFunction { arguments, content, returns, .. } = function;
+        let mut ctx = self.ctx.clone();
+
+        let mut ctx = unsafe {
+            LLVMPositionBuilderAtEnd(b, LLVMAppendBasicBlockInContext(c, value, c"entry".as_ptr()));
+            for (idx, arg) in arguments.iter().enumerate() {
+                let ty = arg
+                    .get_specified_type()
+                    .expect("the type should be specified at this point");
+                let llvm_ty = TypeLowerer::new(c, ty).lower();
+                let arg_name = CString::new(arg.name().as_ref()).expect("invalid name");
+                let arg_param = LLVMGetParam(value, idx.try_into().expect("too many arguments"));
+                let ptr = LLVMBuildAlloca(b, llvm_ty, arg_name.as_ptr());
+                LLVMBuildStore(b, arg_param, ptr);
+                ctx.register(arg.name(), Value::Alloca(ty.clone(), llvm_ty, ptr));
+            }
+
+            InstructionLowerer::new(llvm, value, content, returns.clone(), ctx).lower()
+        };
+
+        let to_drop = ctx.get_values_to_drop();
+        unsafe { LLVMFunctionIter::new(value) }
+            .filter(|&bb| unsafe {
+                LLVMBasicBlockIter::new(bb)
+                    .last()
+                    .map_or(false, |instr| LLVMGetInstructionOpcode(instr) == LLVMOpcode::LLVMRet)
+            })
+            .for_each(|bb| unsafe { DropLowerer::new(c, value, &to_drop, bb, &ctx) }.lower());
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/instruction.rs b/src/Rust/vvs_codegen/src/lowerer/instruction.rs
new file mode 100644
index 00000000..d731bfd9
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/instruction.rs
@@ -0,0 +1,431 @@
+use crate::lowerer::*;
+use std::sync::OnceLock;
+use vvs_lang::{anon_expression, anon_instruction, ast::*};
+use vvs_llvm::*;
+use vvs_utils::either;
+
+#[derive(Clone, Copy)]
+struct BBLoop {
+    body_entry: LLVMBasicBlockRef,
+    loop_exit: LLVMBasicBlockRef,
+}
+
+/// Lower a single instruction.
+pub(super) struct InstructionLowerer<'a> {
+    llvm: LLVMLowerContext,
+
+    /// The function containing the instruction to lower.
+    func: LLVMValueRef,
+
+    /// Remeber the last loop to be able to break or continue.
+    last_loop: Option<BBLoop>,
+
+    /// The instruction we want to lower.
+    instr: &'a ASTInstr,
+
+    /// The return type of the function, to see if we need to generetate coertion.
+    func_return_type: ASTType,
+
+    /// The value context, this stores available already-lowered LLVM values.
+    ctx: ValueContext,
+}
+
+impl<'a> InstructionLowerer<'a> {
+    /// Create a new expression lowerer.
+    pub(super) fn new(
+        llvm: LLVMLowerContext,
+        func: LLVMValueRef,
+        instruction: &'a ASTInstr,
+        func_return_type: ASTType,
+        ctx: ValueContext,
+    ) -> Self {
+        let last_loop = Default::default();
+        Self { llvm, func, instr: instruction, func_return_type, ctx, last_loop }
+    }
+
+    /// Create a new sub-expression lowerer. Used for recusive descent to lower complexe
+    /// expressions, thus private.
+    fn sub_lowerer(&self, instruction: &'a ASTInstr) -> Self {
+        let Self { llvm, func, last_loop, .. } = *self;
+        let func_return_type = self.func_return_type.clone();
+        let ctx = self.ctx.clone();
+        Self { llvm, instr: instruction, func, func_return_type, ctx, last_loop }
+    }
+
+    /// Short-hand to create an expression lowerer by passing some arguments correctly.
+    fn expr(&'a self, expr: &'a ASTExpr) -> ExpressionLowerer<'a> {
+        ExpressionLowerer::with_assumed_type(self.llvm, expr, &self.ctx)
+    }
+
+    /// Get a new sub-expression lowerer. We need to know the exit block of this scope so that we
+    /// can build the calls to drop for this scope.
+    fn scoped_lowerer(&mut self, exit_bb: LLVMBasicBlockRef, cb: impl FnOnce(Self) -> ValueContext) {
+        static mut NOOP: OnceLock<ASTInstr> = OnceLock::new();
+
+        // Save context.
+        let pre_ctx = self.ctx.clone();
+        self.ctx = pre_ctx.sub_context();
+
+        // Build an empty instruction to give as parent lowerer in scope.
+        let Self { llvm: llvm @ (_, c, _), func, last_loop, .. } = *self;
+        let instruction = unsafe { NOOP.get_or_init(|| anon_instruction!(Noop)) };
+        let func_return_type = self.func_return_type.clone();
+        let ctx = self.ctx.sub_context();
+        let this = Self { llvm, func, last_loop, instr: instruction, func_return_type, ctx };
+
+        // Drop what was declared in the scope
+        let mut ctx = cb(this);
+        unsafe { DropLowerer::new(c, func, &ctx.get_values_to_drop(), exit_bb, &ctx) }.lower();
+
+        // Restore context.
+        self.ctx = pre_ctx;
+    }
+
+    /// Set the last loop to lower a given instruction.
+    fn with_loop(mut self, r#loop: BBLoop) -> Self {
+        self.last_loop = Some(r#loop);
+        self
+    }
+
+    /// Set the value context.
+    fn with_ctx(mut self, ctx: ValueContext) -> Self {
+        self.ctx = ctx;
+        self
+    }
+
+    pub(super) fn lower(mut self) -> ValueContext {
+        let Self { llvm: llvm @ (_, c, b), func, instr: ASTInstr { content, span }, .. } = self;
+        match content {
+            // Nop
+            ASTInstrVariant::Noop => self.ctx,
+
+            // A simple list of instructions
+            ASTInstrVariant::Block(instructions) => unsafe {
+                let exit = LLVMAppendBasicBlockInContext(c, self.func, c".block".as_ptr());
+                self.scoped_lowerer(exit, |this| {
+                    instructions
+                        .iter()
+                        .fold(this.ctx.clone(), |ctx, instruction| this.sub_lowerer(instruction).with_ctx(ctx).lower())
+                });
+                LLVMBuildBr(b, exit);
+                LLVMPositionBuilderAtEnd(b, exit);
+                self.ctx
+            },
+
+            // Breaks/Continue
+            ASTInstrVariant::Break | ASTInstrVariant::Continue if self.last_loop.is_none() => {
+                panic!("try to lower break/continue while not being inside a loop")
+            }
+            ASTInstrVariant::Break => unsafe {
+                LLVMBuildBr(b, self.last_loop.expect("internal error").loop_exit);
+                self.ctx
+            },
+            ASTInstrVariant::Continue => unsafe {
+                LLVMBuildBr(b, self.last_loop.expect("internal error").body_entry);
+                self.ctx
+            },
+
+            // Return from function
+            ASTInstrVariant::Return(expr) => unsafe {
+                let (ctx, value) = self.expr(expr).lower();
+                match value {
+                    Value::Nil => LLVMBuildRetVoid(b),
+                    Value::Function(..) => panic!("error at `{span}`: can't return a function for now"),
+                    value => LLVMBuildRet(b, value.loaded(c, b)),
+                };
+                ctx
+            },
+
+            // Assignation
+            ASTInstrVariant::Assign(dests, srcs) if dests.len() != srcs.len() => {
+                unreachable!("internal error: verifier failed for assignations at `{span}`")
+            }
+            ASTInstrVariant::Assign(dests, srcs) => dests.iter().zip(srcs).fold(self.ctx, |ctx, (dest, src)| {
+                let (dest, dest_ty) = Self::compute_dest_location(c, b, &ctx, dest);
+                let (ctx, src) = ExpressionLowerer::with_expected_type(llvm, src, dest_ty, &ctx).lower();
+                Self::store_into(c, b, dest, &src);
+                ctx
+            }),
+
+            // Declarations
+            ASTInstrVariant::Decl(dests, srcs) if dests.len() != srcs.len() => {
+                unreachable!("internal error: verifier failed for declarations at `{span}`")
+            }
+            ASTInstrVariant::Decl(dests, srcs) => {
+                let mut declarations = Vec::with_capacity(dests.len());
+                let ctx = dests.iter().zip(srcs).fold(self.ctx.clone(), |ctx, (dest, src)| {
+                    let dest_ast_ty = dest.get_specified_type().expect("internal error");
+                    let dest_llvm_ty = TypeLowerer::new(c, dest_ast_ty).lower();
+                    let val = unsafe { LLVMBuildAlloca(b, dest_llvm_ty, cstr!("{}", dest.name())) };
+                    let (ctx, expr) = self.expr(src).with_ctx(&ctx).into_type(dest_ast_ty).lower();
+                    Self::store_into(c, b, val, &expr);
+                    declarations.push((dest.name(), Value::Alloca(dest_ast_ty.clone(), dest_llvm_ty, val)));
+                    ctx
+                });
+                declarations.into_iter().fold(ctx, |mut ctx, (name, val)| {
+                    ctx.register(name, val);
+                    ctx
+                })
+            }
+
+            // Call a function, discard the result
+            ASTInstrVariant::FuncCall(func, args) => {
+                let (ctx, value) = CallLowerer::new(llvm, &self.ctx).lower_func_call(func, args);
+                ctx.to_register_anon(value)
+            }
+            ASTInstrVariant::MethodInvok(obj, method, args) => {
+                let (ctx, value) = CallLowerer::new(llvm, &self.ctx).lower_method_invok(obj, method, args);
+                ctx.to_register_anon(value)
+            }
+
+            // If/Else/Elseif blocks
+            ASTInstrVariant::Cond { if_blocks, else_block } => unsafe {
+                let exit = LLVMAppendBasicBlockInContext(c, self.func, c".if.exit".as_ptr());
+                let pre_ctx = self.ctx.clone();
+                let true_cond = ASTCondition::BooleanTrue(anon_expression!(Const(ASTConst::True)));
+
+                let get_bb = move |idx: usize, what: &str| {
+                    LLVMAppendBasicBlockInContext(c, self.func, cstr!(".if.{}.{}", idx, what))
+                };
+                let mut bbs: HashMap<usize, LLVMBasicBlockRef> = Default::default();
+                let mut get_bb_cond = move |idx| *bbs.entry(idx).or_insert_with(move || get_bb(idx, "condition"));
+
+                /// Use a macro to not write the same code twice by forgeting something...
+                macro_rules! build_cond_block {
+                    (($if_num: expr, $if_cond: expr, $if_inner: expr), $else_bb: expr, $exit: expr) => {{
+                        let (if_bb_body, if_bb_body_exit) = (get_bb($if_num, "body"), get_bb($if_num, "body.exit"));
+                        self.scoped_lowerer(if_bb_body_exit, |mut scoped| {
+                            // CONDITION: We don't need to drop things even if we didn't succeded,
+                            //            add the new ctx to lower the conditional body. The head
+                            //            BB of the conditional is cached by it's number.
+                            LLVMPositionBuilderAtEnd(b, get_bb_cond($if_num));
+                            let ctx = scoped.lower_condition($if_cond, if_bb_body, $else_bb);
+
+                            // BODY: We need to drop things after the exit of the loop, we also
+                            //       drop the conditional stuff
+                            LLVMPositionBuilderAtEnd(b, if_bb_body);
+                            let ctx = scoped.sub_lowerer($if_inner).with_ctx(ctx).lower();
+                            LLVMBuildBr(b, if_bb_body_exit);
+                            LLVMPositionBuilderAtEnd(b, if_bb_body_exit);
+                            LLVMBuildBr(b, $exit);
+
+                            // WARN: scoped.ctx -> contains also the temporary values! We must drop
+                            //       all of those if we succeded or not.
+                            DropLowerer::new(c, func, &scoped.ctx.get_values_to_drop(), $else_bb, &ctx).lower();
+                            DropLowerer::new(c, func, &scoped.ctx.get_values_to_drop(), if_bb_body_exit, &ctx).lower();
+
+                            ctx
+                        })
+                    }};
+                }
+
+                let else_block = else_block.as_ref().map(|instr| (&true_cond, instr.as_ref()));
+                let if_blocks = if_blocks.iter().map(|(cond, instr): &_| (cond, instr));
+                let blocks = if_blocks.chain(else_block).enumerate().collect::<Vec<(_, (&_, &_))>>();
+                assert!(!blocks.is_empty(), "empty conditionals not allowed");
+
+                // IF -> Need to jump to the first condition checker
+                LLVMBuildBr(b, get_bb_cond(0));
+
+                // Build IF, for ELSE -> will be handled at next iteration
+                blocks.windows(2).for_each(|slice| match slice {
+                    [(if_num, (if_cond, if_inner)), (else_num, _)] => {
+                        build_cond_block!((*if_num, if_cond, if_inner), get_bb_cond(*else_num), exit)
+                    }
+                    _ => unreachable!(),
+                });
+
+                // ELSE / IF in the case where we have only one conditional -> Handle last item
+                let (else_num, (else_cond, else_inner)) = blocks.last().expect("internal error");
+                build_cond_block!((*else_num, else_cond, else_inner), exit, exit);
+
+                LLVMPositionBuilderAtEnd(b, exit);
+                pre_ctx
+            },
+
+            // While loops
+            ASTInstrVariant::WhileDo(condition, inner) => unsafe {
+                let (cond, exit, body, body_exit) = (
+                    LLVMAppendBasicBlockInContext(c, self.func, c".while.cond".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".while.exit".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".while.body".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".while.body.exit".as_ptr()),
+                );
+
+                self.scoped_lowerer(body_exit, |mut scoped| {
+                    // For a WhileDo the condition binding variables are only visible in the body
+                    // of the loop. Here we ensure variables are only available inside the loop.
+                    LLVMBuildBr(b, cond);
+                    LLVMPositionBuilderAtEnd(b, cond);
+                    let ctx = scoped.lower_condition(condition, body, exit);
+
+                    LLVMPositionBuilderAtEnd(b, body);
+                    let ctx = scoped
+                        .sub_lowerer(inner)
+                        .with_ctx(ctx)
+                        .with_loop(BBLoop { body_entry: body, loop_exit: exit })
+                        .lower();
+
+                    // Drop what was
+                    LLVMBuildBr(b, body_exit);
+                    LLVMPositionBuilderAtEnd(b, body_exit);
+                    DropLowerer::new(c, func, &scoped.ctx.get_values_to_drop(), body_exit, &ctx).lower();
+                    LLVMBuildBr(b, cond);
+                    ctx
+                });
+
+                LLVMPositionBuilderAtEnd(b, exit);
+                self.ctx
+            },
+
+            // For loop
+            ASTInstrVariant::ForLoop { var, lower: l, upper: u, step, body: inner } => unsafe {
+                let (cond, exit, body, body_exit) = (
+                    LLVMAppendBasicBlockInContext(c, self.func, c".forloop.cond".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".forloop.exit".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".forloop.body".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".forloop.body.exit".as_ptr()),
+                );
+
+                let (ctx, lower) = self.expr(l).into_type(&ASTType::Integer).lower();
+                let (mut ctx, upper) = self.expr(u).with_ctx(&ctx).into_type(&ASTType::Integer).lower();
+                let (lower, upper) = (lower.loaded(c, b), upper.loaded(c, b));
+
+                // Setup the index
+                let t_i32 = LLVMInt32TypeInContext(c);
+                let step = step.unwrap_or(1) as i64;
+                assert!(step > 0, "the for-loop step must be strictly positive");
+                let step = LLVMConstInt(t_i32, std::mem::transmute_copy(&step), 0);
+
+                let index = LLVMBuildAlloca(b, t_i32, cstr!(".index.{}", var));
+                ctx.register(var.name(), Value::Alloca(ASTType::Integer, t_i32, index));
+                LLVMBuildStore(b, lower, index);
+
+                // Build the condition check
+                LLVMBuildBr(b, cond);
+                LLVMPositionBuilderAtEnd(b, cond);
+                const PREDICATE: LLVMIntPredicate = LLVMIntPredicate::LLVMIntSLT;
+                let loaded = LLVMBuildLoad2(b, t_i32, index, cstr!(".index.{}.loaded", var));
+                let cont = LLVMBuildICmp(b, PREDICATE, loaded, upper, cstr!(".index.{}.flag", var));
+                LLVMBuildCondBr(b, cont, body, exit);
+
+                // Lower the body, we need a scope for that.
+                self.scoped_lowerer(body_exit, |scoped| {
+                    LLVMPositionBuilderAtEnd(b, body);
+                    let ctx = scoped
+                        .sub_lowerer(inner)
+                        .with_loop(BBLoop { body_entry: body, loop_exit: exit })
+                        .lower();
+                    let loaded = LLVMBuildLoad2(b, t_i32, index, cstr!(".index.{}.loaded", var));
+                    let loaded = LLVMBuildAdd(b, loaded, step, cstr!(".index.{}.incremented", var));
+                    LLVMBuildStore(b, loaded, index);
+                    LLVMBuildBr(b, body_exit);
+                    LLVMPositionBuilderAtEnd(b, body_exit);
+                    LLVMBuildBr(b, cond);
+                    ctx
+                });
+
+                // End of loop
+                LLVMPositionBuilderAtEnd(b, exit);
+                ctx
+            },
+            ASTInstrVariant::ForInto { .. } => unsafe {
+                let (_cond, _exit, _body, _body_exit) = (
+                    LLVMAppendBasicBlockInContext(c, self.func, c".foreach.cond".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".foreach.exit".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".foreach.body".as_ptr()),
+                    LLVMAppendBasicBlockInContext(c, self.func, c".foreach.body.exit".as_ptr()),
+                );
+                todo!()
+            },
+        }
+    }
+
+    /// Store the content of a value into a location in memory.
+    ///
+    /// TODO: Do that in the Value enum
+    fn store_into(c: LLVMContextRef, b: LLVMBuilderRef, dest: LLVMValueRef, src: &Value) {
+        match src {
+            Value::Function(_, _, _) => panic!("we don't handle function pointers for now"),
+            Value::Const(_, v) => unsafe { LLVMBuildStore(b, *v, dest) },
+            Value::Nil => match ConstantLowerer::new(c, &ASTConst::Nil).lower() {
+                Value::Const(_, v) => unsafe { LLVMBuildStore(b, v, dest) },
+                _ => unreachable!(),
+            },
+            Value::Alloca(_, ty, v) => unsafe {
+                let v = LLVMBuildLoad2(b, *ty, *v, cstr!());
+                LLVMBuildStore(b, v, dest)
+            },
+        };
+    }
+
+    /// Get the address and the type of a variable to store into it.
+    fn compute_dest_location<'b>(
+        _c: LLVMContextRef,
+        _b: LLVMBuilderRef,
+        _ctx: &'b ValueContext,
+        _expr: &'b ASTExpr,
+    ) -> (LLVMValueRef, &'b ASTType) {
+        todo!()
+    }
+
+    /// Lower the condition. Returns the new context with the added binded values if needed. If the
+    /// condition is not checked we don't need to drop anything from the returned value context.
+    /// This means that we must drop the returned context only on the then condition path.
+    ///
+    /// If things where allocated to check the condition, then we add them to the current context,
+    /// but not to the returned context! This means that may the condition succeed or not, you must
+    /// drop the context of the calling lowerer at the end of the `then` and `else` paths.
+    ///
+    /// Most of the time the context is already scopped, so it shouldn't be too difficult trop
+    /// things at the right moment.
+    fn lower_condition(
+        &mut self,
+        condition: &ASTCondition,
+        bb_then: LLVMBasicBlockRef,
+        bb_else: LLVMBasicBlockRef,
+    ) -> ValueContext {
+        let Self { llvm: llvm @ (_, c, b), .. } = *self;
+        match condition {
+            ASTCondition::BooleanTrue(cond) => unsafe {
+                let (mut ctx, cond) = self.expr(cond).into_type(&ASTType::Boolean).lower();
+                LLVMBuildCondBr(b, cond.loaded(c, b), bb_then, bb_else);
+
+                let ret_ctx = self.ctx.clone();
+                self.ctx.add_values_to_drop(ctx.get_values_to_drop());
+                ret_ctx
+            },
+
+            ASTCondition::CoercibleInto { new, as_type, source: src }
+                if src
+                    .get_specified_type()
+                    .expect("should be setted")
+                    .coercible_to(as_type) =>
+            unsafe {
+                let llvm_true = LLVMConstInt(LLVMInt1TypeInContext(c), 1, 0);
+                let (register, flag, src) = match CastLowerer::from_ast(llvm, src, as_type, &self.ctx).lower_dynamic() {
+                    CastedValue::Dynamic { flag, value } => (true, flag, value),
+                    CastedValue::Static { value } => (true, llvm_true, value),
+                    CastedValue::Unchanged { value } => (false, llvm_true, value),
+                };
+                LLVMBuildCondBr(b, flag, bb_then, bb_else);
+
+                LLVMPositionBuilderAtEnd(b, bb_then);
+                let ty = TypeLowerer::new(c, as_type).lower();
+                let dest = LLVMBuildAlloca(b, ty, cstr!(".{}.alloca", new));
+                LLVMBuildStore(b, src.loaded(c, b), dest);
+
+                either!(!register => self.ctx.clone();
+                    self.ctx.to_register(new.name(), Value::Alloca(as_type.clone(), ty, dest))
+                )
+            },
+
+            ASTCondition::CoercibleInto { .. } => unsafe {
+                LLVMBuildBr(b, bb_else);
+                self.ctx.clone()
+            },
+
+            ASTCondition::BindVariant { .. } => todo!(),
+        }
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/mod.rs b/src/Rust/vvs_codegen/src/lowerer/mod.rs
new file mode 100644
index 00000000..2de61638
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/mod.rs
@@ -0,0 +1,221 @@
+mod calls;
+mod cast;
+mod constant;
+mod drops;
+mod expression;
+mod function;
+mod instruction;
+mod types;
+
+use crate::{
+    cstr,
+    lowerer::{calls::*, cast::*, drops::*, expression::*, function::*, instruction::*, types::*},
+    value::Value,
+    LLVMLowerContext, ValueContext,
+};
+use hashbrown::HashMap;
+use std::ffi::{CStr, CString};
+use vvs_lang::ast::*;
+use vvs_llvm::*;
+use vvs_runtime_types::{VVRTSymbol, VVRTSymbolType};
+
+// Re-export the constant lowerer because it can be usefull in other parts of the codegen.
+pub(crate) use self::constant::ConstantLowerer;
+
+pub struct Lowerer<'a> {
+    llvm: LLVMLowerContext,
+
+    functions: Vec<(ASTString, ASTString, &'a ASTFunction)>,
+    globals: HashMap<(ASTString, ASTString), &'a ASTConst>,
+
+    ctx: ValueContext,
+}
+
+pub struct LowererBuilder<'a> {
+    name: CString,
+    c: LLVMContextRef,
+    m: Option<LLVMModuleRef>,
+    b: LLVMBuilderRef,
+    programs: Option<&'a ASTProgram>,
+    modules: Vec<&'a ASTModule>,
+}
+
+impl<'a> LowererBuilder<'a> {
+    /// Create a new lowerer builder. We need a name and the context from the JIT thing.
+    ///
+    /// # Safety
+    /// This function is unsafe because we use the LLVM context pointer passed from anywhere. This
+    /// pointer must be not null and be a valid LLVM context.
+    pub unsafe fn new(name: impl AsRef<str>, c: LLVMContextRef) -> Self {
+        Self {
+            c,
+            name: CString::new(name.as_ref()).expect("invalid module name"),
+            b: LLVMCreateBuilderInContext(c),
+            m: Default::default(),
+            modules: Default::default(),
+            programs: Default::default(),
+        }
+    }
+
+    /// Add a complete program to lower. If any other program was present, overwrite it.
+    pub fn program(mut self, program: &'a ASTProgram) -> Self {
+        self.programs = Some(program);
+        self
+    }
+
+    /// Add a module to lower to the list of things to lower.
+    pub fn module(mut self, module: &'a ASTModule) -> Self {
+        self.modules.push(module);
+        self
+    }
+
+    /// Build the lowerer from this builder.
+    pub fn build(self) -> Lowerer<'a> {
+        let Self { c, m, b, programs, modules, name } = self;
+
+        // Get all the modules that will be lowered inside the final LLVM module. By doing this we
+        // have a similar thing to LTO for Vivy Script.
+
+        let init = HashMap::<ASTString, &'a ASTModule>::default();
+        let modules = modules
+            .into_iter()
+            .chain(programs.iter().flat_map(|prog| prog.modules()))
+            .fold(init, |mut map, module| match map.entry(module.name()) {
+                hashbrown::hash_map::Entry::Occupied(_) => map,
+                hashbrown::hash_map::Entry::Vacant(entry) => {
+                    entry.insert(module);
+                    map
+                }
+            });
+
+        // Get the globals that needs to be lowered / needs to be known by the lowerer. We first
+        // collect the setted options from the program as those will overwrite values from the
+        // modules, then we get what is defined as default in the module. To ensure we doesn't
+        // overwrite things, we only insert in the final hashmap if the thing was not already
+        // defined in the hashmap. Other than setted overwriting defaults, there should not be any
+        // other collisions.
+
+        let init: HashMap<(ASTString, ASTString), &'a ASTConst> = programs
+            .iter()
+            .flat_map(|prog| {
+                prog.setted_options()
+                    .iter()
+                    .map(|((m, n), v)| ((m.clone(), n.clone()), v))
+            })
+            .collect();
+        let globals = modules.iter().flat_map(|(mname, m)| {
+            let hdl = |(var, val): (&'a ASTVar, &'a _)| (mname.clone(), var.name(), val);
+            m.consts(ASTVisibilityRule::any()).map(hdl).chain(m.options().map(hdl))
+        });
+        let globals = globals.fold(init, |mut globals, (mn, n, val)| match globals.entry((mn, n)) {
+            hashbrown::hash_map::Entry::Occupied(_) => globals,
+            hashbrown::hash_map::Entry::Vacant(entry) => {
+                entry.insert(val);
+                globals
+            }
+        });
+
+        // Get the functions that are available in all the module to lower them. Should not be any
+        // collision.
+
+        let functions = modules.iter().flat_map(|(mname, m)| {
+            m.functions(ASTVisibilityRule::any())
+                .map(|(fname, f)| (mname.clone(), fname, f))
+        });
+        let functions = functions.collect();
+
+        // Now we can create the lowerer with the specified LLVM module or by creating a new one.
+
+        let m = m.unwrap_or_else(|| unsafe { LLVMModuleCreateWithNameInContext(name.as_ptr(), c) });
+        let mut ctx = ValueContext::default();
+        ctx.register_all(
+            unsafe { vvs_runtime_types::vvll::LLVMRegisterExportedIntoModule(c, m) }
+                .into_iter()
+                .map(|(name, asttype, val, ty)| (name, Value::Function(asttype, ty, val))),
+        );
+
+        Lowerer { llvm: (m, c, b), functions, globals, ctx }
+    }
+}
+
+impl<'a> Lowerer<'a> {
+    /// Lower the content of the programs and modules, then returns the LLVM module containing
+    /// everything...
+    pub fn lower(self) -> LLVMModuleRef {
+        let Self { llvm: llvm @ (m, c, b), functions, globals, mut ctx } = self;
+
+        // Register all the globals in the context, they will be directly inlined in the lowering
+        // process.
+
+        ctx.register_all(
+            globals
+                .into_iter()
+                .map(|((m, n), cnst)| (format!("{m}.{n}"), ConstantLowerer::new(c, cnst).lower())),
+        );
+
+        // Lower all the functions. First declare the things and register them with the mangled
+        // name and the unmagnled name. As we collect the iterator we ensure that all the functions
+        // are declared before we generate them. Doing so allows us to use recursion and we don't
+        // need to find a good order to define-use the functions like in C. When we latter lower
+        // the content of the functions we try to find the first error and return it.
+
+        functions.into_iter().for_each(|(module, name, function)| {
+            // Declare the thing
+            let mangled = VVRTSymbol::new(VVRTSymbolType::Function, &module, &name)
+                .expect("invalid function names")
+                .mangle();
+            let ast_function_type = function.function_type();
+            let ty = TypeLowerer::new(c, &ast_function_type).lower();
+            let value = unsafe { LLVMAddFunction(m, mangled.as_ptr(), ty) };
+
+            // Register it. When we collect the iterator.
+            let to_register = Value::Function(ast_function_type, ty, value);
+            ctx.register(mangled.to_str().expect("invalid function names"), to_register.clone());
+            ctx.register(format!("{module}.{name}"), to_register);
+
+            // We will generate it latter
+            FunctionLowerer::new(llvm, &ctx, value, function).lower();
+        });
+
+        // Cleanup and optimize the code.
+
+        unsafe {
+            LLVMDisposeBuilder(b);
+            Self::verify_and_apply_optimizations(m, 3)
+        }
+    }
+
+    /// Run the optimization passes on a module.
+    unsafe fn verify_and_apply_optimizations(m: LLVMModuleRef, lvl: u8) -> LLVMModuleRef {
+        let mut cmsg = std::ptr::null_mut();
+        if 0 != LLVMVerifyModule(m, LLVMVerifierFailureAction::LLVMPrintMessageAction, &mut cmsg) {
+            let msg = CStr::from_ptr(cmsg).to_string_lossy().to_string();
+            LLVMDisposeMessage(cmsg);
+            panic!("invalid module: {msg}");
+        }
+
+        let pbo = LLVMCreatePassBuilderOptions();
+        let pm = LLVMCreatePassManager();
+        let tm = LLVMCreateTargetMachine(
+            LLVMGetTargetFromName(LLVMGetTarget(m)),
+            LLVMGetDefaultTargetTriple(),
+            LLVMGetHostCPUName(),
+            LLVMGetHostCPUFeatures(),
+            LLVMCodeGenOptLevel::LLVMCodeGenLevelAggressive,
+            LLVMRelocMode::LLVMRelocPIC,
+            LLVMCodeModel::LLVMCodeModelDefault,
+        );
+
+        let err = LLVMRunPasses(m, cstr!("default<O{}>", lvl), tm, pbo);
+        if !err.is_null() {
+            let msg = CStr::from_ptr(LLVMGetErrorMessage(err)).to_string_lossy().to_string();
+            LLVMConsumeError(err);
+            panic!("failed to run optimizer with level O{lvl} on module: {msg}")
+        }
+
+        LLVMDisposePassBuilderOptions(pbo);
+        LLVMDisposePassManager(pm);
+        LLVMDisposeTargetMachine(tm);
+        m
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/lowerer/types.rs b/src/Rust/vvs_codegen/src/lowerer/types.rs
new file mode 100644
index 00000000..5e1b4748
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/lowerer/types.rs
@@ -0,0 +1,57 @@
+use vvs_lang::ast::*;
+use vvs_llvm::*;
+use vvs_runtime_types::{types::*, vvll::LLVMExported};
+
+pub(super) struct TypeLowerer<'a> {
+    c: LLVMContextRef,
+    vivy_type: &'a ASTType,
+}
+
+impl<'a> TypeLowerer<'a> {
+    pub(super) fn new(c: LLVMContextRef, vivy_type: &'a ASTType) -> Self {
+        Self { c, vivy_type }
+    }
+
+    fn sub_lowerer(&self, ty: &'a ASTType) -> Self {
+        Self { c: self.c, vivy_type: ty }
+    }
+
+    pub(super) fn lower(self) -> LLVMTypeRef {
+        let Self { c, vivy_type } = self;
+        match vivy_type {
+            // Easy stuff...
+            ASTType::Nil => unsafe { LLVMVoidTypeInContext(c) },
+            ASTType::Integer => unsafe { LLVMInt32TypeInContext(c) },
+            ASTType::Floating => unsafe { LLVMFloatTypeInContext(c) },
+            ASTType::Boolean => unsafe { LLVMInt1TypeInContext(c) },
+
+            // Functions
+            ASTType::Function(args, returns) => unsafe {
+                let mut args = args.iter().map(|ty| self.sub_lowerer(ty).lower()).collect::<Vec<_>>();
+                LLVMFunctionType(
+                    self.sub_lowerer(returns).lower(),
+                    args.as_mut_ptr(),
+                    args.len().try_into().expect("too many arguments"),
+                    0,
+                )
+            },
+
+            // The tuple
+            ASTType::Tuple(inner) => unsafe {
+                let mut inner = inner.iter().map(|ty| self.sub_lowerer(ty).lower()).collect::<Vec<_>>();
+                LLVMStructType(inner.as_mut_ptr(), inner.len().try_into().expect("too many elements"), 0)
+            },
+
+            // Special structs, query the runtime for that...
+            ASTType::Any => unsafe { VVRTAny::llvm_type(c) },
+            ASTType::String => unsafe { VVRTString::llvm_type(c) },
+            ASTType::Syllabe => unsafe { VVRTSyllabe::llvm_type(c) },
+            ASTType::Line => unsafe { VVRTLine::llvm_type(c) },
+            ty if ty.is_table() => unsafe { VVRTTable::llvm_type(c) },
+            ty if ty.is_variant() => unsafe { VVRTVariant::llvm_type(c) },
+            ty if ty.is_sequence() => unsafe { VVRTSeq::llvm_type(c) },
+
+            _ => unreachable!(),
+        }
+    }
+}
diff --git a/src/Rust/vvs_codegen/src/value.rs b/src/Rust/vvs_codegen/src/value.rs
new file mode 100644
index 00000000..d7302af0
--- /dev/null
+++ b/src/Rust/vvs_codegen/src/value.rs
@@ -0,0 +1,100 @@
+use crate::{cstr, lowerer};
+use vvs_lang::ast::{ASTConst, ASTType, Typed};
+use vvs_llvm::*;
+
+#[derive(Debug, Default, Clone, PartialEq, Eq)]
+pub(crate) enum Value {
+    /// Just the Nil/Null/None/nullptr value.
+    #[default]
+    Nil,
+
+    /// A constant.
+    Const(ASTType, LLVMValueRef),
+
+    /// A pointer to the stack plus the underlying type.
+    Alloca(ASTType, LLVMTypeRef, LLVMValueRef),
+
+    /// A function with its function type.
+    Function(ASTType, LLVMTypeRef, LLVMValueRef),
+}
+
+impl Value {
+    /// Try to get the name of the value. Only [Value::Nil] have no name.
+    pub fn as_str(&self) -> Option<&str> {
+        use Value::*;
+        match *self {
+            Nil => None,
+            Function(.., val) | Const(_, val) | Alloca(.., val) => unsafe {
+                let mut len = 0;
+                let str = LLVMGetValueName2(val, &mut len) as *const _;
+                Some(std::str::from_utf8_unchecked(std::slice::from_raw_parts(str, len)))
+            },
+        }
+    }
+
+    pub fn llvm_type(&self) -> Option<LLVMTypeRef> {
+        match self {
+            Value::Const(..) | Value::Nil => None,
+            Value::Alloca(_, t, _) | Value::Function(_, t, _) => Some(*t),
+        }
+    }
+
+    pub fn llvm_value(&self) -> Option<LLVMValueRef> {
+        match self {
+            Value::Nil => None,
+            Value::Const(_, v) | Value::Alloca(_, _, v) | Value::Function(_, _, v) => Some(*v),
+        }
+    }
+
+    pub fn loaded(&self, c: LLVMContextRef, b: LLVMBuilderRef) -> LLVMValueRef {
+        match self {
+            Value::Nil => lowerer::ConstantLowerer::new(c, &ASTConst::Nil).lower().loaded(c, b),
+            Value::Const(_, val) => *val,
+            Value::Alloca(_, ty, ptr) => unsafe { LLVMBuildLoad2(b, *ty, *ptr, cstr!()) },
+            Value::Function(_, _, func_ptr) => *func_ptr,
+        }
+    }
+
+    /// Get the name of the dropper function, if any!
+    pub fn get_dropper_name(&self) -> Option<&'static str> {
+        match self.get_ast_type() {
+            ty if ty.is_variant() => Some("VVRTVariant_drop"),
+            ty if ty.is_table() => Some("VVRTTable_drop"),
+            ty if ty.is_sequence() => Some("VVRTSeq_drop"),
+            ASTType::Syllabe => Some("VVRTSyllabe_drop"),
+            ASTType::String => Some("VVRTString_drop"),
+            ASTType::Line => Some("VVRTLine_drop"),
+            ASTType::Any => Some("VVRTAny_drop"),
+
+            ASTType::Function(_, _) => todo!("handle functions and clozures..."),
+            _ => None,
+        }
+    }
+
+    /// Call a function with some values. Note that this function won't create memory manage points
+    /// for the passed values (see types that are managed and the ones that are not.)
+    pub fn call<const N: usize>(&self, b: LLVMBuilderRef, mut args: [LLVMValueRef; N]) -> LLVMValueRef {
+        match self {
+            Value::Function(_, func_ty, func_val) => unsafe {
+                let args_ptr = args.as_mut_ptr();
+                let args_len = args.len().try_into().expect("too much arguments");
+                LLVMBuildCall2(b, *func_ty, *func_val, args_ptr, args_len, c"".as_ptr())
+            },
+            val => panic!("can't call a non-function value: {val:?}"),
+        }
+    }
+
+    pub fn get_ast_type(&self) -> &ASTType {
+        const NIL: ASTType = ASTType::Nil;
+        match self {
+            Value::Nil => &NIL,
+            Value::Const(ty, _) | Value::Alloca(ty, _, _) | Value::Function(ty, _, _) => ty,
+        }
+    }
+}
+
+impl Typed for Value {
+    fn get_type(&self, _: &vvs_lang::ast::ASTTypeContext) -> ASTType {
+        self.get_ast_type().clone()
+    }
+}
diff --git a/src/Rust/vvs_font/Cargo.toml b/src/Rust/vvs_font/Cargo.toml
index 838aa4cf..48c9c5fa 100644
--- a/src/Rust/vvs_font/Cargo.toml
+++ b/src/Rust/vvs_font/Cargo.toml
@@ -1,14 +1,13 @@
 [package]
-name = "vvs_font"
+name              = "vvs_font"
+description       = "The font crate for VVS"
 version.workspace = true
 authors.workspace = true
 edition.workspace = true
 license.workspace = true
-description = "The font crate for VVS"
 
 [dependencies]
-thiserror.workspace = true
-log.workspace = true
-
-ttf-parser = { version = "^0.19" }
-ab_glyph = { version = "^0.2.20" }
+thiserror.workspace  = true
+log.workspace        = true
+ttf-parser.workspace = true
+ab_glyph.workspace   = true
diff --git a/src/Rust/vvs_font/build.rs b/src/Rust/vvs_font/build.rs
index 8d38f76b..1ae42238 100644
--- a/src/Rust/vvs_font/build.rs
+++ b/src/Rust/vvs_font/build.rs
@@ -10,6 +10,8 @@ fn rerun_directory<T: AsRef<Path> + ?Sized>(dir: &T) {
     }
 }
 
+static EXCLUDED_FONTS: &[&str] = &["FiraCode"];
+
 fn main() {
     let out_dir = Path::new(&env::var_os("OUT_DIR").expect("no OUT_DIR env variable..."))
         .canonicalize()
@@ -23,8 +25,13 @@ fn main() {
         .expect("failed to read the font folder")
         .filter_map(Result::ok)
         .filter(|file| {
-            file.file_type().map(|ft| ft.is_file()).unwrap_or_default()
-                && file.path().extension().map(|e| e == "ttf").unwrap_or(false)
+            file.file_type().map(|ft| ft.is_file()).unwrap_or_default() && {
+                let path = file.path();
+                path.file_name()
+                    .map(|f| !EXCLUDED_FONTS.iter().any(|pat| f.to_string_lossy().starts_with(pat)))
+                    .unwrap_or_default()
+                    && path.extension().map(|e| e == "ttf").unwrap_or_default()
+            }
         })
         .map(|file| {
             let (path, file_name) = (file.path(), file.file_name());
diff --git a/src/Rust/vvs_font/src/font.rs b/src/Rust/vvs_font/src/font.rs
index 5fc71f22..cf17c758 100644
--- a/src/Rust/vvs_font/src/font.rs
+++ b/src/Rust/vvs_font/src/font.rs
@@ -24,6 +24,7 @@ pub struct Font<'a> {
 impl<'a> TryFrom<&'a [u8]> for Font<'a> {
     type Error = FontCreationError;
 
+    #[inline]
     fn try_from(data: &'a [u8]) -> Result<Self, Self::Error> {
         Ok(Self {
             face: ttf_parser::Face::parse(data, 0).map_err(FontCreationError::TTFParserError)?,
@@ -79,6 +80,7 @@ impl<'a> Font<'a> {
     }
 
     /// Get the number of glyphs in the font.
+    #[inline]
     pub fn number_of_glyphs(&self) -> i64 {
         self.face.number_of_glyphs() as i64
     }
diff --git a/src/Rust/vvs_font/src/rect.rs b/src/Rust/vvs_font/src/rect.rs
index 86454e17..c52bb5b5 100644
--- a/src/Rust/vvs_font/src/rect.rs
+++ b/src/Rust/vvs_font/src/rect.rs
@@ -16,14 +16,13 @@ pub struct Rect {
 
 impl Rect {
     /// Create a correctly formed [Rect] that includes the passed [Point].
+    #[inline]
     pub fn new(p1: Point, p2: Point) -> Self {
-        Self {
-            top_left_corner: Point::min(p1, p2),
-            bottom_right_corner: Point::max(p1, p2),
-        }
+        Self { top_left_corner: Point::min(p1, p2), bottom_right_corner: Point::max(p1, p2) }
     }
 
     /// Returns a new [Rect] that includes the passed rectangles.
+    #[inline]
     pub fn merge(self, other: Self) -> Self {
         Self {
             top_left_corner: Point::min(self.top_left_corner, other.top_left_corner),
@@ -32,11 +31,13 @@ impl Rect {
     }
 
     /// Get the Top Left corner, the min coordinates.
+    #[inline]
     pub fn tl_corner(&self) -> Point {
         self.top_left_corner
     }
 
     /// Get the Bottom Right corner, the max coordinates.
+    #[inline]
     pub fn br_corner(&self) -> Point {
         self.bottom_right_corner
     }
@@ -44,11 +45,13 @@ impl Rect {
 
 impl Point {
     /// Returns the min components of the two [Point].
+    #[inline]
     pub fn min(p1: Point, p2: Point) -> Point {
         Point { x: min(p1.x, p2.x), y: min(p1.y, p2.y) }
     }
 
     /// Returns the max components of the two [Point].
+    #[inline]
     pub fn max(p1: Point, p2: Point) -> Point {
         Point { x: max(p1.x, p2.x), y: max(p1.y, p2.y) }
     }
diff --git a/src/Rust/vvs_lang/Cargo.toml b/src/Rust/vvs_lang/Cargo.toml
index 0f83afca..538d8c5f 100644
--- a/src/Rust/vvs_lang/Cargo.toml
+++ b/src/Rust/vvs_lang/Cargo.toml
@@ -1,19 +1,21 @@
 [package]
-name = "vvs_lang"
+name              = "vvs_lang"
+description       = "Vivy Script Language"
 version.workspace = true
 authors.workspace = true
 edition.workspace = true
 license.workspace = true
-description = "Vivy Script Language"
 
 [dependencies]
-thiserror.workspace = true
-serde.workspace = true
-hashbrown.workspace = true
-log.workspace = true
-regex.workspace = true
-nom.workspace = true
-nom_locate.workspace = true
-anyhow.workspace = true
+thiserror.workspace   = true
+paste.workspace       = true
+serde.workspace       = true
+hashbrown.workspace   = true
+log.workspace         = true
+regex.workspace       = true
+anyhow.workspace      = true
+toml.workspace        = true
+derive_more.workspace = true
 
-vvs_utils = { path = "../vvs_utils" }
+vvs_utils.workspace  = true
+vvs_parser.workspace = true
diff --git a/src/Rust/vvs_lang/VVL.g4 b/src/Rust/vvs_lang/VVL.g4
deleted file mode 100644
index b64d20b2..00000000
--- a/src/Rust/vvs_lang/VVL.g4
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
-BSD License
-
-Copyright (c) 2013, Kazunori Sakamoto
-Copyright (c) 2016, Alexander Alexeev
-Copyright (c) 2023, Maël Martin
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-3. Neither the NAME of Rainer Schuster nor the NAMEs of its contributors may be
-   used to endorse or promote products derived from this software without
-   specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-grammar VVL;
-
-chunk:      topblock* EOF;
-visibility: ('pub')?;
-block:      stat* laststat?;
-
-topblock: visibility 'function' NAME (':' NAME)? funcbody
-        | visibility 'job'      NAME funcbody
-        | visibility 'const'    NAME opttypespec '=' exp
-        | visibility 'option'   NAME opttypespec '=' exp
-        | ('import' | 'requires') string
-        ;
-
-stat: ';'
-    | varlist '=' explist
-    | functioncall
-    | 'do' block 'end'
-    | 'while' exp 'do' block 'end'
-    | 'repeat' block 'until' exp
-    | 'if' exp 'then' block ('elseif' exp 'then' block)* ('else' block)? 'end'
-    | 'for' NAME '=' exp ',' exp (',' exp)? 'do' block 'end'
-    | 'for' namelist 'in' explist 'do' block 'end'
-    | 'let' attnamelist ('=' explist)?
-    ;
-
-attnamelist:    NAME opttypespec (',' NAME opttypespec)*;
-opttypespec:    (':' NAME)?;
-laststat:       'return' explist? | 'break' | 'continue' ';'?;
-varlist:        var (',' var)*;
-namelist:       NAME (',' NAME)*;
-explist:        (exp ',')* exp;
-
-exp: 'nil' | 'false' | 'true'
-   | number
-   | color
-   | string
-   | prefixexp
-   | tableconstructor
-   | <assoc=right> exp operatorPower exp
-   | operatorUnary exp
-   | exp operatorMulDivMod exp
-   | exp operatorAddSub exp
-   | <assoc=right> exp operatorStrcat exp
-   | exp operatorComparison exp
-   | exp operatorAnd exp
-   | exp operatorOr exp
-   | exp operatorBitwise exp
-   | '(' exp (',' exp)+ (',')? ')'
-   ;
-
-prefixexp:          varOrExp nameAndArgs*;
-functioncall:       varOrExp nameAndArgs+;
-varOrExp:           var | '(' exp ')';
-var:                (NAME | '(' exp ')' varSuffix) varSuffix*;
-varSuffix:          nameAndArgs* ('[' exp ']' | '.' NAME);
-nameAndArgs:        (':' NAME)? args;
-args:               '(' explist? ')' | tableconstructor | string;
-funcbody:           '(' parlist? ')' '->' NAME 'begin' block 'end';
-parlist:            namelist (',')?;
-tableconstructor:   '{' fieldlist? '}';
-fieldlist:          field (fieldsep field)* fieldsep?;
-field:              '[' exp ']' '=' exp | NAME '=' exp | exp;
-fieldsep:           ',' | ';';
-
-operatorOr:         'or';
-operatorAnd:        'and';
-operatorComparison: '<' | '>' | '<=' | '>=' | '~=' | '==' | '!=';
-operatorStrcat:     '..';
-operatorAddSub:     '+' | '-';
-operatorMulDivMod:  '*' | '/' | '%' | '//' | 'mod';
-operatorBitwise:    '&' | '^' | '|' | '~' | '<<' | '>>';
-operatorUnary:      'not' | '#' | '-' | '~';
-operatorPower:      '^';
-
-color:  '#(' ... ')';
-number: INT | HEX | FLOAT | HEX_FLOAT;
-string: NORMALSTRING | CHARSTRING | LONGSTRING;
-
-// LEXER
-
-NAME:           [a-zA-Z_][a-zA-Z_0-9]*;
-NORMALSTRING:   '"' ( EscapeSequence | ~('\\'|'"') )* '"';
-CHARSTRING:     '\'' ( EscapeSequence | ~('\''|'\\') )* '\'';
-LONGSTRING:     '[' NESTED_STR ']';
-
-fragment
-NESTED_STR: '=' NESTED_STR '='
-          | '[' .*? ']'
-          ;
-
-INT: Digit+;
-HEX: '0' [xX] HexDigit+;
-
-FLOAT: Digit+ '.' Digit* ExponentPart?
-     | '.' Digit+ ExponentPart?
-     | Digit+ ExponentPart
-     ;
-
-HEX_FLOAT
-    : '0' [xX] HexDigit+ '.' HexDigit* HexExponentPart?
-    | '0' [xX] '.' HexDigit+ HexExponentPart?
-    | '0' [xX] HexDigit+ HexExponentPart
-    ;
-
-fragment
-ExponentPart
-    : [eE] [+-]? Digit+
-    ;
-
-fragment
-HexExponentPart
-    : [pP] [+-]? Digit+
-    ;
-
-fragment
-EscapeSequence
-    : '\\' '\r'? '\n'
-    ;
-
-fragment
-Digit
-    : [0-9]
-    ;
-
-fragment
-HexDigit
-    : [0-9a-fA-F]
-    ;
-
-fragment
-SingleLineInputCharacter
-    : ~[\r\n\u0085\u2028\u2029]
-    ;
-
-COMMENT
-    : '--[' NESTED_STR ']' -> channel(HIDDEN)
-    ;
-
-LINE_COMMENT
-    : '--' SingleLineInputCharacter* -> channel(HIDDEN)
-    ;
-
-WS
-    : [ \t\u000C\r\n]+ -> skip
-    ;
diff --git a/src/Rust/vvs_lang/VVS.g4 b/src/Rust/vvs_lang/VVS.g4
deleted file mode 100644
index 4b82087b..00000000
--- a/src/Rust/vvs_lang/VVS.g4
+++ /dev/null
@@ -1,117 +0,0 @@
-// MIT License
-//
-// Copyright 2023 Maël MARTIN
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
-// associated documentation files (the "Software"), to deal in the Software without restriction,
-// including without limitation the rights to use, copy, modify, merge, publish, distribute,
-// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
-// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-grammar VVS;
-
-chunk: topblock* mainblock EOF;
-
-topblock: 'import' string
-        : 'set' NAME '.' NAME '=' exp
-        ;
-
-mainblock:
-    'main' NAME '{'
-        (NAME '=' NAME '.' NAME NAME ';')*
-
-        'write' '{' (NAME (',' NAME)* (,)?)? '}'
-    '}'
-;
-
-exp: 'nil' | 'false' | 'true'
-   | number
-   | color
-   | string
-   ;
-
-color:  '#(' ... ')';
-number: INT | HEX | FLOAT | HEX_FLOAT;
-string: NORMALSTRING | CHARSTRING | LONGSTRING;
-
-// LEXER
-
-NAME:           [a-zA-Z_][a-zA-Z_0-9]*;
-NORMALSTRING:   '"' ( EscapeSequence | ~('\\'|'"') )* '"';
-CHARSTRING:     '\'' ( EscapeSequence | ~('\''|'\\') )* '\'';
-LONGSTRING:     '[' NESTED_STR ']';
-
-fragment
-NESTED_STR: '=' NESTED_STR '='
-          | '[' .*? ']'
-          ;
-
-INT: Digit+;
-HEX: '0' [xX] HexDigit+;
-
-FLOAT: Digit+ '.' Digit* ExponentPart?
-     | '.' Digit+ ExponentPart?
-     | Digit+ ExponentPart
-     ;
-
-HEX_FLOAT
-    : '0' [xX] HexDigit+ '.' HexDigit* HexExponentPart?
-    | '0' [xX] '.' HexDigit+ HexExponentPart?
-    | '0' [xX] HexDigit+ HexExponentPart
-    ;
-
-fragment
-ExponentPart
-    : [eE] [+-]? Digit+
-    ;
-
-fragment
-HexExponentPart
-    : [pP] [+-]? Digit+
-    ;
-
-fragment
-EscapeSequence
-    : '\\' '\r'? '\n'
-    ;
-
-fragment
-Digit
-    : [0-9]
-    ;
-
-fragment
-HexDigit
-    : [0-9a-fA-F]
-    ;
-
-fragment
-SingleLineInputCharacter
-    : ~[\r\n\u0085\u2028\u2029]
-    ;
-
-COMMENT
-    : '--[' NESTED_STR ']' -> channel(HIDDEN)
-    ;
-
-LINE_COMMENT
-    : '--' SingleLineInputCharacter* -> channel(HIDDEN)
-    ;
-
-WS
-    : [ \t\u000C\r\n]+ -> skip
-    ;
-
-SHEBANG
-    : '#' '!' SingleLineInputCharacter* -> channel(HIDDEN)
-    ;
-
diff --git a/src/Rust/vvs_lang/samples/retime.vvl b/src/Rust/vvs_lang/samples/retime.vvl
deleted file mode 100644
index 3599efdf..00000000
--- a/src/Rust/vvs_lang/samples/retime.vvl
+++ /dev/null
@@ -1,28 +0,0 @@
--- Contains utilities to retime lines from an ASS file.
-
-
-import "math"
-
-
-option before : int = 900   --  Retime time in millisecond for the aparition of the line.
-option after  : int = 300   --  Retime time in millisecond for the disaparition of the line.
-
-
-pub job start(l: line) -> line
---  Here we set the begin of the syllabes at the begin of the line, each
---  syllabes will end when it should in fact begin.
-begin
-    for s in l do
-        s.begin = l.start - before
-    end
-end
-
-
-pub job finish(l: line) -> line
---  Here we set the end of the syllabes at the end of the line, each
--- syllabes will begin when it should in fact end.
-begin
-    for s in l do
-        s.finish = l.finish - after
-    end
-end
diff --git a/src/Rust/vvs_lang/samples/test.vvs b/src/Rust/vvs_lang/samples/test.vvs
deleted file mode 100644
index 3b3c9a60..00000000
--- a/src/Rust/vvs_lang/samples/test.vvs
+++ /dev/null
@@ -1,24 +0,0 @@
-import "retime"
-import "utils"
-import "tag"
-
-
--- Set some options.
-set retime.before = 900
-set retime.after  = 400
-
-set outline.border = 4
-set outline.color = #(rgb: 0, 0, 0)
-
-
--- What we want to do for this script, and how we name the initial value.
-main INIT {
-    BEFORE = retime.start  INIT;
-    AFTER  = retime.finish INIT;
-
-    OUTLINED = utils.outline BEFORE, INIT, AFTER;
-    TAGGED   = tag.syl_modulo<3> OUTLINED; -- Here we tag some objects...
-
-    -- What we want to write in the file, in order.
-    write { OUTLINED }
-}
diff --git a/src/Rust/vvs_lang/src/ast/constant.rs b/src/Rust/vvs_lang/src/ast/constant.rs
new file mode 100644
index 00000000..22af5e6b
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/constant.rs
@@ -0,0 +1,134 @@
+use crate::ast::*;
+use anyhow::{anyhow, ensure, Context};
+
+/// A constant expr.
+#[derive(Debug, PartialEq, Clone)]
+pub enum ASTConst {
+    Nil,
+    False,
+    True,
+    Tuple(Vec<ASTConst>),
+    Color(ASTVariant<ASTConst>),
+    String(ASTString),
+    Integer(ASTInteger),
+    Floating(ASTFloating),
+    Table(ASTTable<ASTConst>),
+}
+
+/// Get the type for a const table, returns the more specialized type ([ASTType::UniformTable], etc)
+fn get_const_table_type(table: &ASTTable<ASTConst>) -> ASTType {
+    let integer_keys = table.keys().all(|key| key.parse::<i64>().is_ok());
+    let mut uniform_values = table.values().map(|val| val.get_const_type()).collect::<Vec<_>>();
+    let uniform_values = uniform_values
+        .pop()
+        .map(|ty| uniform_values.into_iter().all(|a| ty.eq(&a)).then_some(ty));
+    match (integer_keys, uniform_values) {
+        (true, Some(Some(ty))) => ASTType::Sequence(Box::new(ty)),
+        _ => ASTType::Table(
+            table
+                .iter()
+                .map(|(key, value)| (key.clone(), value.get_const_type()))
+                .collect(),
+        ),
+    }
+}
+
+impl Typed for ASTConst {
+    #[inline]
+    fn get_type(&self, _: &ASTTypeContext) -> ASTType {
+        self.get_const_type()
+    }
+}
+
+impl std::fmt::Display for ASTConst {
+    #[inline]
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            ASTConst::Nil => f.write_str("nil"),
+            ASTConst::False => f.write_str("false"),
+            ASTConst::True => f.write_str("true"),
+            ASTConst::Color(ASTVariant { variant, args }) => write!(f, "color#{variant}{args:?}"),
+            ASTConst::String(str) => write!(f, "{str:?}"),
+            ASTConst::Integer(int) => write!(f, "{int}"),
+            ASTConst::Floating(flt) => write!(f, "{flt}"),
+            ASTConst::Table(table) => write_ast_table(f, table),
+            ASTConst::Tuple(tuple) => write_ast_tuple(f, tuple),
+        }
+    }
+}
+
+impl MaybeConstExpr for ASTConst {
+    #[inline]
+    fn is_const_expr(&self) -> bool {
+        true
+    }
+
+    #[inline]
+    fn eval_const_expr(&self) -> Option<ASTConst> {
+        Some(self.clone())
+    }
+}
+
+impl ASTConst {
+    #[inline]
+    pub fn get_const_type(&self) -> ASTType {
+        match self {
+            ASTConst::Nil => ASTType::Nil,
+            ASTConst::True | ASTConst::False => ASTType::Boolean,
+            ASTConst::Color(..) => ASTType::Color,
+            ASTConst::String(_) => ASTType::String,
+            ASTConst::Integer(_) => ASTType::Integer,
+            ASTConst::Floating(_) => ASTType::Floating,
+            ASTConst::Tuple(inner) => ASTType::Tuple(inner.iter().map(|expr| expr.get_const_type()).collect()),
+            ASTConst::Table(content) => get_const_table_type(content),
+        }
+    }
+
+    /// Try to create an [ASTConst] from a [toml::Value]. We verify that the value is valid, i.e.
+    /// we don't have nested tables and such.
+    ///
+    /// NOTE: For now we can't construct colors and/or movements from toml values...
+    pub fn from_toml_value(cache: &ASTStringCacheHandle, value: toml::Value) -> anyhow::Result<Self> {
+        use toml::Value as TomlValue;
+
+        fn table_from_toml_value(
+            cache: &ASTStringCacheHandle,
+            mut values: impl Iterator<Item = (ASTString, TomlValue)>,
+        ) -> anyhow::Result<ASTConst> {
+            let (lower, upper) = values.size_hint();
+            let table = ASTTable::with_capacity(upper.unwrap_or(lower));
+            let table = values.try_fold(table, |mut table, (key, value)| {
+                let value = ASTConst::from_toml_value(cache, value)?;
+                ensure!(!matches!(value, ASTConst::Table(_)), "forbiden nested tables");
+                table
+                    .insert(key, value)
+                    .map(|_| Err(anyhow!("redefinition of a value in the table")))
+                    .unwrap_or(Ok(table))
+            })?;
+            Ok(ASTConst::Table(table))
+        }
+
+        match value {
+            TomlValue::Datetime(date) => Ok(ASTConst::String(cache.get(date.to_string()))),
+            TomlValue::String(str) => Ok(ASTConst::String(cache.get(str))),
+
+            TomlValue::Float(num) => Ok(ASTConst::Floating(num as f32)),
+            TomlValue::Integer(num) => Ok(ASTConst::Integer(num.try_into().context("integer overflow")?)),
+            TomlValue::Boolean(true) => Ok(ASTConst::True),
+            TomlValue::Boolean(false) => Ok(ASTConst::False),
+
+            TomlValue::Array(values) => {
+                ensure!(values.len() < i32::MAX as usize, "too many elements in array");
+                let values = values
+                    .into_iter()
+                    .enumerate()
+                    .map(|(k, v)| (cache.get(k.to_string()), v));
+                table_from_toml_value(cache, values)
+            }
+            TomlValue::Table(values) => {
+                ensure!(values.len() < i32::MAX as usize, "too many elements in table");
+                table_from_toml_value(cache, values.into_iter().map(|(k, v)| (cache.get(k), v)))
+            }
+        }
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/expression.rs b/src/Rust/vvs_lang/src/ast/expression.rs
new file mode 100644
index 00000000..79d482fb
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/expression.rs
@@ -0,0 +1,441 @@
+use crate::ast::*;
+use std::ops::{Deref, DerefMut};
+
+#[macro_export]
+macro_rules! anon_expression {
+    (const     $variant: ident $($args: tt)?) => { $crate::anon_expression!(Const (ASTConst::$variant $($args)?)) };
+    (box const $variant: ident $($args: tt)?) => { Box::new($crate::anon_expression!(Const (ASTConst::$variant $($args)?))) };
+    (box       $variant: ident $($args: tt)?) => { Box::new($crate::anon_expression!($variant $($args)?)) };
+
+    ($variant: ident $($args: tt)?) => {
+        ASTExpr {
+            span: Default::default(),
+            content: ASTExprVariant::$variant $($args)?,
+        }
+    };
+}
+
+#[macro_export]
+macro_rules! expression {
+    ($span: expr, $variant: ident $($args: tt)?) => {
+        ASTExpr {
+            span: $span.into(),
+            content: ASTExprVariant::$variant $($args)?,
+        }
+    };
+}
+
+/// Binops, sorted by precedence.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum ASTBinop {
+    /// Assoc: right
+    Power,
+
+    Mul,
+    Div,
+    Mod,
+    Add,
+    Sub,
+
+    /// Assoc: right
+    StrCat,
+
+    CmpLE,
+    CmpLT,
+    CmpGE,
+    CmpGT,
+    CmpEQ,
+    CmpNE,
+
+    LogicAnd,
+    LogicXor,
+    LogicOr,
+
+    BitAnd,
+    BitXor,
+    BitOr,
+    BitShiftLeft,
+    BitShiftRight,
+}
+
+/// Unops.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum ASTUnop {
+    LogicNot,
+    BitNot,
+    Len,
+    Neg,
+}
+
+/// Expressions. For the partial equality we skip the span field to be able to test efficiently the
+/// parsing.
+#[derive(Debug, Clone, Default)]
+pub struct ASTExpr {
+    pub content: ASTExprVariant,
+    pub span: ASTSpan,
+}
+
+/// Expressions.
+#[derive(Debug, PartialEq, Clone)]
+pub enum ASTExprVariant {
+    /// A table, like in Lua
+    Table(ASTTable<ASTExpr>),
+
+    /// A binary operation, like in most of languages.
+    Binop(Box<ASTExpr>, ASTBinop, Box<ASTExpr>),
+
+    /// A unary operation, like in most of languages.
+    Unop(ASTUnop, Box<ASTExpr>),
+
+    /// A call to a function.
+    FuncCall(Box<ASTExpr>, Vec<ASTExpr>),
+
+    /// A function where the first arguments are binded.
+    FuncBind(Box<ASTExpr>, Vec<ASTExpr>),
+
+    /// Invocation of a method. To call a function from a table, we don't use the
+    /// [ASTExprVariant::MethodInvok] thing, but a [ASTExprVariant::FuncCall] where the first
+    /// element is the dereferencing of the table. Here the name of the method must be known and be
+    /// like: `{ty}::{method}`.
+    MethodInvok(Box<ASTExpr>, ASTString, Vec<ASTExpr>),
+
+    /// We access fields from an expression.
+    Suffixed(Box<ASTExpr>, Vec<ASTField>),
+
+    /// A non-constant expression color.
+    Color(ASTVariant<ASTExpr>),
+
+    /// Represents a movement for a line or syllabe. We don't have a constant variant for this
+    /// representation because movements are very dynamic (it depends on the resolution of the
+    /// video...) and thus doesn't make much sense to have a constant movement.
+    ///
+    /// NOTE: See if other people agree to that, there can be some arguments for having a constant
+    ///       movement or an optional one.
+    Movement(ASTVariant<ASTExpr>),
+
+    /// A tuple, Lua don't have ones but because we won't be stack based we can't do the multiple
+    /// return thing without a tuple...
+    Tuple(Vec<ASTExpr>),
+
+    /// A variable load.
+    Var(ASTVar),
+
+    /// A constant expression.
+    Const(ASTConst),
+
+    /// The default value for a type.
+    Default(ASTType),
+}
+
+/// Fields indexes can be expressions or identifiers
+#[derive(Debug, PartialEq, Clone)]
+pub enum ASTField {
+    /// We index by a string or an integer...
+    Expr(ASTSpan, ASTExprVariant),
+
+    /// A name field.
+    Identifier(ASTSpan, ASTString),
+}
+
+impl PartialEq for ASTExpr {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        self.content == other.content
+    }
+}
+
+/// Get the type for a table, returns the more specialized type ([ASTType::UniformTable], etc)
+fn get_table_type<T: Typed>(table: &ASTTable<T>, ctx: &ASTTypeContext) -> ASTType {
+    let integer_keys = table.keys().all(|key| key.parse::<i64>().is_ok());
+    let mut uniform_values = table.values().map(|val| val.get_type(ctx)).collect::<Vec<_>>();
+    let uniform_values = uniform_values
+        .pop()
+        .map(|ty| uniform_values.into_iter().all(|a| ty.eq(&a)).then_some(ty));
+    match (integer_keys, uniform_values) {
+        (true, Some(Some(ty))) => ASTType::Sequence(Box::new(ty)),
+        _ => ASTType::Table(
+            table
+                .iter()
+                .map(|(key, value)| (key.clone(), value.get_type(ctx)))
+                .collect(),
+        ),
+    }
+}
+
+fn get_table_deref_type(ctx: &ASTTypeContext, table: ASTType, fields: &[ASTField]) -> ASTType {
+    let (first, tail) = match fields {
+        [] => return table,
+        [first, tail @ ..] => (first, tail),
+    };
+
+    match table {
+        ASTType::Tuple(_) => todo!(),
+
+        ASTType::AnyTable => ASTType::Any,
+        ASTType::Table(_) => todo!(),
+        ASTType::UniformTable(_) => todo!(),
+
+        ty @ ASTType::Syllabe | ty @ ASTType::Line => match first {
+            ASTField::Expr(..) => ASTType::Nil,
+            ASTField::Identifier(_, field) => {
+                let ty = crate::ast::get_field_extensions(ctx, ty)
+                    .find_map(|(key, ty)| key.eq(&field.as_ref()).then_some(ty.clone()))
+                    .unwrap_or(ASTType::Nil);
+                get_table_deref_type(ctx, ty, tail)
+            }
+        },
+
+        _ => ASTType::Nil,
+    }
+}
+
+impl Typed for ASTExprVariant {
+    fn get_type(&self, ctx: &ASTTypeContext) -> ASTType {
+        use crate::ast::{ASTBinop::*, ASTUnop::*};
+        match self {
+            ASTExprVariant::FuncBind(_, _) => todo!(),
+
+            ASTExprVariant::MethodInvok(_, _, _) => todo!(),
+
+            ASTExprVariant::FuncCall(_, _) => todo!(),
+
+            ASTExprVariant::Default(ty) => ty.clone(),
+            ASTExprVariant::Color(_) => ASTType::Color,
+            ASTExprVariant::Movement(_) => ASTType::Movement,
+            ASTExprVariant::Const(r#const) => r#const.get_type(ctx),
+
+            ASTExprVariant::Var(var) => match var.get_specified_type() {
+                Some(ty) => ty.clone(),
+                None => ctx.get(var),
+            },
+
+            ASTExprVariant::Tuple(tuple) => ASTType::Tuple(tuple.iter().map(|expr| expr.get_type(ctx)).collect()),
+            ASTExprVariant::Table(table) => get_table_type(table, ctx),
+            ASTExprVariant::Suffixed(expr, fields) => get_table_deref_type(ctx, expr.get_type(ctx), fields),
+
+            ASTExprVariant::Unop(op, inner) => {
+                use ASTType::*;
+                match (op, inner.get_type(ctx)) {
+                    (BitNot | LogicNot, ty @ Integer | ty @ Boolean) => ty,
+                    (Neg, ty @ Floating | ty @ Integer | ty @ Boolean) => ty,
+                    (
+                        Len,
+                        String | Tuple(_) | Syllabe | Line | AnyTable | UniformTable(_) | AnySequence | Table(_)
+                        | Sequence(_),
+                    ) => Integer,
+                    _ => Nil,
+                }
+            }
+
+            ASTExprVariant::Binop(left, op, right) => {
+                use ASTType::*;
+                let (left, right) = (left.get_type(ctx), right.get_type(ctx));
+                match op {
+                    Power => match (left, right) {
+                        (ty @ Integer | ty @ Floating, Integer) => ty,
+                        _ => Nil,
+                    },
+
+                    Mul | Div | Add | Sub => match (left, right) {
+                        (ty @ Integer, Integer) | (ty @ Floating, Floating) => ty,
+                        _ => Nil,
+                    },
+
+                    Mod => match (left, right) {
+                        (Integer, Integer) => Integer,
+                        _ => Nil,
+                    },
+
+                    StrCat => match (left, right) {
+                        (String, String) => String,
+                        _ => Nil,
+                    },
+
+                    CmpLE | CmpLT | CmpGE | CmpGT => match (left, right) {
+                        (Integer, Integer) | (Floating, Floating) => Boolean,
+                        _ => Nil,
+                    },
+
+                    CmpEQ | CmpNE => match right.coercible_to(&left) {
+                        true => Boolean,
+                        false => Nil,
+                    },
+
+                    LogicAnd | LogicXor | LogicOr => match (left, right) {
+                        (Boolean, Boolean) => Boolean,
+                        _ => Nil,
+                    },
+
+                    BitAnd | BitXor | BitOr => match (left, right) {
+                        (Integer, Integer) => Integer,
+                        (Boolean, Boolean) => Boolean,
+                        _ => Nil,
+                    },
+
+                    BitShiftLeft | BitShiftRight => match (left, right) {
+                        (Integer, Integer) => Integer,
+                        _ => Nil,
+                    },
+                }
+            }
+        }
+    }
+}
+
+impl Deref for ASTExpr {
+    type Target = ASTExprVariant;
+    #[inline]
+    fn deref(&self) -> &Self::Target {
+        &self.content
+    }
+}
+
+impl DerefMut for ASTExpr {
+    #[inline]
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.content
+    }
+}
+
+impl VariantName for ASTExpr {
+    #[inline]
+    fn variant_name(&self) -> &'static str {
+        self.content.variant_name()
+    }
+}
+
+impl VariantName for ASTExprVariant {
+    #[inline]
+    fn variant_name(&self) -> &'static str {
+        match self {
+            ASTExprVariant::Movement(_) => "movement",
+            ASTExprVariant::Color(_) => "color",
+            ASTExprVariant::Table(_) => "table",
+            ASTExprVariant::Binop(_, _, _) => "binary operation",
+            ASTExprVariant::Unop(_, _) => "unary operation",
+            ASTExprVariant::FuncCall(_, _) => "function call",
+            ASTExprVariant::FuncBind(_, _) => "function bind",
+            ASTExprVariant::MethodInvok(_, _, _) => "method invokation",
+            ASTExprVariant::Suffixed(_, _) => "prefixed expression",
+            ASTExprVariant::Tuple(_) => "tuple",
+            ASTExprVariant::Var(_) => "variable",
+            ASTExprVariant::Const(_) => "constant",
+            ASTExprVariant::Default(_) => "default",
+        }
+    }
+}
+
+impl ASTField {
+    #[inline]
+    pub fn span(&self) -> ASTSpan {
+        match self {
+            ASTField::Expr(span, _) | ASTField::Identifier(span, _) => *span,
+        }
+    }
+}
+
+impl MaybeConstExpr for ASTExprVariant {
+    fn is_const_expr(&self) -> bool {
+        use ASTExprVariant::*;
+        match self {
+            // We don't do constant method invokation for now.
+            FuncCall(_, _) | MethodInvok(_, _, _) | FuncBind(_, _) => false,
+
+            // Depends on the content.
+            Binop(l, _, r) => l.is_const_expr() && r.is_const_expr(),
+            Unop(_, inner) => inner.is_const_expr(),
+            Tuple(inner) => inner.iter().all(|expr| expr.is_const_expr()),
+            Color(variant) | Movement(variant) => variant.is_const_expr(),
+            Suffixed(table, suffixes) => table.is_const_expr() && suffixes.iter().all(|field| field.is_const_expr()),
+            Default(ty) => ty.is_const_constructible(),
+
+            // Well, it depend, for now we will say that it's not compile time evaluable.
+            Table(_) => false,
+            Var(_) => false,
+
+            // Obviously
+            Const(_) => true,
+        }
+    }
+
+    fn eval_const_expr(&self) -> Option<ASTConst> {
+        use ASTExprVariant::*;
+        match self {
+            Const(r#const) => Some(r#const.clone()),
+
+            Binop(_, _, _) => todo!(),
+            Unop(_, _) => todo!(),
+
+            Default(ty) if ty.is_const_constructible() => Some(match ty {
+                ASTType::Nil | ASTType::Any => ASTConst::Nil,
+                ASTType::Integer => ASTConst::Integer(0),
+                ASTType::Floating => ASTConst::Floating(0.),
+                ASTType::Boolean => ASTConst::False,
+                _ => unreachable!(),
+            }),
+
+            Color(ASTVariant { variant, args }) => Some(ASTConst::Color(ASTVariant {
+                variant: variant.clone(),
+                args: args
+                    .iter()
+                    .map(|expr| expr.eval_const_expr().ok_or(()))
+                    .collect::<Result<Vec<_>, _>>()
+                    .ok()?,
+            })),
+
+            Tuple(inner) => Some(ASTConst::Tuple(
+                inner
+                    .iter()
+                    .map(|expr| expr.eval_const_expr().ok_or(()))
+                    .collect::<Result<Vec<_>, _>>()
+                    .ok()?,
+            )),
+
+            Suffixed(_, _)
+            | FuncCall(_, _)
+            | FuncBind(_, _)
+            | MethodInvok(_, _, _)
+            | Table(_)
+            | Movement(_)
+            | Default(_)
+            | Var(_) => None,
+        }
+    }
+}
+
+impl Typed for ASTField {
+    #[inline]
+    fn get_type(&self, ctx: &ASTTypeContext) -> ASTType {
+        match self {
+            ASTField::Expr(_, expr) => expr.get_type(ctx),
+            ASTField::Identifier(sp, name) => {
+                let var = ASTVar::new(ctx.strings()).span(sp).name(name.clone()).build();
+                ctx.get(&var)
+            }
+        }
+    }
+}
+
+impl MaybeConstExpr for ASTField {
+    #[inline]
+    fn is_const_expr(&self) -> bool {
+        match self {
+            ASTField::Expr(_, expr) => expr.is_const_expr(),
+            ASTField::Identifier(_, _) => false,
+        }
+    }
+
+    #[inline]
+    fn eval_const_expr(&self) -> Option<ASTConst> {
+        match self {
+            ASTField::Identifier(..) => None,
+            ASTField::Expr(_, expr) => expr.eval_const_expr(),
+        }
+    }
+}
+
+impl Default for ASTExprVariant {
+    fn default() -> Self {
+        ASTExprVariant::Const(ASTConst::Nil)
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/extension.rs b/src/Rust/vvs_lang/src/ast/extension.rs
new file mode 100644
index 00000000..3cf13f38
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/extension.rs
@@ -0,0 +1,11 @@
+use crate::ast::{ASTType, ASTTypeContext};
+
+#[inline]
+pub fn get_field_extensions(_: &ASTTypeContext, ass_type: ASTType) -> impl Iterator<Item = &(&'static str, ASTType)> {
+    log::error!("todo: add user options for each item");
+    match ass_type {
+        ASTType::Syllabe => [("start", ASTType::Integer), ("finish", ASTType::Integer)].iter(),
+        ASTType::Line => [("start", ASTType::Integer), ("finish", ASTType::Integer)].iter(),
+        _ => unreachable!(),
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/function.rs b/src/Rust/vvs_lang/src/ast/function.rs
new file mode 100644
index 00000000..6c20bc5b
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/function.rs
@@ -0,0 +1,36 @@
+use crate::ast::*;
+
+/// A function. Can also represent a job.
+#[derive(Debug, Clone)]
+pub struct ASTFunction {
+    pub name: ASTString,
+    pub returns: ASTType,
+    pub arguments: Vec<ASTVar>,
+    pub content: ASTInstr,
+
+    pub span: ASTSpan,
+}
+
+/// The signature of a callable thing in Vivy Script.
+pub type ASTFunctionSignature = (Vec<ASTType>, ASTType);
+
+impl ASTFunction {
+    /// Get the signature of a function.
+    #[inline]
+    pub fn signature(&self) -> ASTFunctionSignature {
+        let args = self
+            .arguments
+            .iter()
+            .flat_map(ASTVar::get_specified_type)
+            .cloned()
+            .collect();
+        (args, self.returns.clone())
+    }
+
+    /// Get the type of this function, as a function tpe.
+    #[inline]
+    pub fn function_type(&self) -> ASTType {
+        let (args, returns) = self.signature();
+        ASTType::Function(args, Box::new(returns))
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/identifier.rs b/src/Rust/vvs_lang/src/ast/identifier.rs
new file mode 100644
index 00000000..4cc9e144
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/identifier.rs
@@ -0,0 +1,57 @@
+use crate::ast::*;
+
+#[derive(Debug, Default, PartialEq, Eq, Clone)]
+pub enum ASTIdentifier {
+    /// We ignore the value, like in ocaml and rust, this is the '_'.
+    #[default]
+    Joker,
+
+    /// A normal identifier, one that can be used by the user.
+    String(ASTString),
+
+    /// If an identifier begins by '_' and is followed other things then it is reserved by the
+    /// parser, the generator, and other things. Those identifiers can't be used by a user and they
+    /// should never see one.
+    Reserved(ASTString),
+}
+
+impl std::fmt::Display for ASTIdentifier {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.write_str(self.as_ref())
+    }
+}
+
+impl AsRef<str> for ASTIdentifier {
+    fn as_ref(&self) -> &str {
+        use ASTIdentifier::*;
+        match self {
+            Joker => "_",
+            String(str) | Reserved(str) => str.as_ref(),
+        }
+    }
+}
+
+impl ASTIdentifier {
+    /// Create a new identifier. The passed string will be trimed. If the string is empty or
+    /// contains non ascii-alphanumeric-underscored characters then an error will be raised.
+    pub fn new(cache: ASTStringCacheHandle, identifier: impl AsRef<str>) -> Result<Self, String> {
+        let identifier = identifier.as_ref().trim();
+        match identifier
+            .char_indices()
+            .find(|(_, c)| '_'.ne(c) && !c.is_ascii_alphanumeric())
+        {
+            Some((idx, char)) => Err(format!("found invalid character '{char}' in identifier at index {idx}")),
+            None => {
+                if identifier.is_empty() {
+                    Err("an identifier can't be empty".to_string())
+                } else if identifier.starts_with('_') && identifier.len() == 1 {
+                    Ok(Self::Joker)
+                } else if identifier.starts_with('_') {
+                    Ok(Self::Reserved(cache.get(identifier.trim_start_matches('_'))))
+                } else {
+                    Ok(Self::Reserved(cache.get(identifier)))
+                }
+            }
+        }
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/import.rs b/src/Rust/vvs_lang/src/ast/import.rs
new file mode 100644
index 00000000..f538506d
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/import.rs
@@ -0,0 +1,77 @@
+use crate::ast::{ASTModule, ASTModulePtr, ASTString};
+use hashbrown::HashMap;
+use std::{
+    cell::RefCell,
+    path::{Path, PathBuf},
+    rc::Rc,
+};
+
+/// Structure used to resolve module imports.
+///
+/// By default, includes the current working dir.
+#[derive(Debug)]
+pub struct ImportResolver {
+    path: Vec<PathBuf>,
+    cache: Rc<RefCell<HashMap<ASTString, ASTModulePtr>>>,
+}
+
+pub(crate) enum ResolveResult {
+    Path(PathBuf),
+    Module(ASTModulePtr),
+}
+
+impl FromIterator<PathBuf> for ImportResolver {
+    #[inline]
+    fn from_iter<T: IntoIterator<Item = PathBuf>>(iter: T) -> Self {
+        Self { path: iter.into_iter().collect(), cache: Default::default() }
+    }
+}
+
+impl Default for ImportResolver {
+    /// Get the default import resolver, always includes the current working dir...
+    #[inline]
+    fn default() -> Self {
+        Self { path: vec![std::env::current_dir().expect("failed to get the CWD")], cache: Default::default() }
+    }
+}
+
+impl ImportResolver {
+    /// Create a new empty resolver. Note that it's different from the default resolver that uses
+    /// the current working directory (CWD, PWD, etc...)
+    #[inline]
+    pub fn empty() -> Self {
+        Self { path: vec![], cache: Default::default() }
+    }
+
+    pub(crate) fn resolve(&self, module: impl AsRef<str>) -> Option<ResolveResult> {
+        let find = |prefix| Self::get_file_path(prefix, module.as_ref()).map(ResolveResult::Path);
+        self.cache
+            .borrow()
+            .get(module.as_ref())
+            .cloned()
+            .map(ResolveResult::Module)
+            .or_else(|| self.path.iter().find_map(find))
+    }
+
+    #[inline]
+    pub(crate) fn cache_module(&self, name: ASTString, module: ASTModulePtr) {
+        if let Some(module) = self.cache.borrow_mut().insert(name, module) {
+            log::error!("re-cache module `{}`", ASTModule::get(&module).name())
+        }
+    }
+
+    fn get_file_path(prefix: impl AsRef<Path>, module: impl AsRef<str>) -> Option<PathBuf> {
+        let mut file = prefix.as_ref().join(module.as_ref());
+        file.set_extension("vvl");
+        file.canonicalize()
+            .map_err(|err| match err.kind() {
+                std::io::ErrorKind::NotFound => (),
+                err => log::error!(
+                    "failed to lookup for `{}` in `{}`: {err}",
+                    module.as_ref(),
+                    prefix.as_ref().to_string_lossy()
+                ),
+            })
+            .ok()
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/instruction.rs b/src/Rust/vvs_lang/src/ast/instruction.rs
new file mode 100644
index 00000000..57e64ffa
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/instruction.rs
@@ -0,0 +1,187 @@
+use crate::ast::*;
+use std::ops::{Deref, DerefMut};
+
+#[macro_export]
+macro_rules! anon_instruction {
+    ($variant: ident $($args: tt)?) => {
+        ASTInstr {
+            span: Default::default(),
+            content: ASTInstrVariant::$variant $($args)?,
+        }
+    };
+}
+
+#[macro_export]
+macro_rules! instruction {
+    ($span: expr, $variant: ident $($args: tt)?) => {
+        ASTInstr {
+            span: $span.into(),
+            content: ASTInstrVariant::$variant $($args)?,
+        }
+    };
+}
+
+/// Instructions.
+#[derive(Debug, Clone)]
+pub struct ASTInstr {
+    pub content: ASTInstrVariant,
+    pub span: ASTSpan,
+}
+
+/// Instructions.
+#[derive(Debug, PartialEq, Clone)]
+pub enum ASTInstrVariant {
+    /// Declare variables with something inside.
+    Decl(Vec<ASTVar>, Vec<ASTExpr>),
+
+    /// Assign into variables.
+    Assign(Vec<ASTExpr>, Vec<ASTExpr>),
+
+    /// A function call.
+    FuncCall(Box<ASTExpr>, Vec<ASTExpr>),
+
+    /// A method invokation.
+    MethodInvok(Box<ASTExpr>, ASTString, Vec<ASTExpr>),
+
+    /// Begin a block.
+    Block(Vec<ASTInstr>),
+
+    /// A WhileDo instruction.
+    WhileDo(ASTCondition, Box<ASTInstr>),
+
+    /// Conditionals, contract the elseid blocks.
+    Cond { if_blocks: Vec<(ASTCondition, ASTInstr)>, else_block: Option<Box<ASTInstr>> },
+
+    /// For loop, the classic one:
+    /// ```vvs
+    /// for elem = 1, 3, 1 do print(elem) end
+    /// ```
+    ForLoop { var: ASTVar, lower: ASTExpr, upper: ASTExpr, step: Option<ASTInteger>, body: Box<ASTInstr> },
+
+    /// For loop with an iterable expression (table):
+    /// ```vvs
+    /// for elem in { 1, 2, 3 } do print(elem) end
+    /// for elem in ( 1, 2, 3 ) do print(elem) end
+    /// for elem in my_table    do print(elem) end
+    /// ```
+    ForInto { var: ASTVar, list: ASTExpr, body: Box<ASTInstr> },
+
+    /// Just a noop.
+    Noop,
+
+    /// Final thing: break from block.
+    Break,
+
+    /// Final thing: continue to next iteration.
+    Continue,
+
+    /// Final thing: return something.
+    Return(ASTExpr),
+}
+
+impl PartialEq for ASTInstr {
+    fn eq(&self, other: &Self) -> bool {
+        self.content == other.content
+    }
+}
+
+fn get_instruction_slice_type(ctx: &ASTTypeContext, block: &[ASTInstr]) -> ASTType {
+    let Some((last, instructions)) = block.split_last() else {
+        return ASTType::Nil;
+    };
+    let coerce_type = |from: ASTType, var: &ASTVar| {
+        let (span, ty, name) = (var.span(), var.get_specified_type().unwrap_or(&from), var.name());
+        let strings = ctx.strings();
+        let var = ASTVar::new(strings).span(span).name(name.clone());
+        if from.coercible_to(ty) {
+            var.with_type(from).build()
+        } else {
+            log::error!(target: "cc", "{span}; try to assign value of type `{from}` into `{name}: {ty}`");
+            var.with_type(ASTType::Nil).build()
+        }
+    };
+    let fold_declaration = |mut ctx, (var, from): (&ASTVar, &ASTExpr)| {
+        let var = coerce_type(from.get_type(&ctx), var);
+        let (_, var_ty) = (var.span(), var.get_type(&ctx));
+        ctx.declare(var, var_ty);
+        ctx
+    };
+    let fold_on_declaration = |ctx, instruction: &ASTInstr| match &instruction.content {
+        ASTInstrVariant::Decl(vars, froms) => vars.iter().zip(froms.iter()).fold(ctx, fold_declaration),
+        _ => ctx,
+    };
+    last.get_type(&instructions.iter().fold(ctx.for_scope(), fold_on_declaration))
+}
+
+impl Typed for ASTInstrVariant {
+    fn get_type(&self, ctx: &ASTTypeContext) -> ASTType {
+        match self {
+            ASTInstrVariant::Decl(_, _)
+            | ASTInstrVariant::Noop
+            | ASTInstrVariant::Assign(_, _)
+            | ASTInstrVariant::Break
+            | ASTInstrVariant::Continue => ASTType::Nil,
+
+            ASTInstrVariant::WhileDo(_, _) | ASTInstrVariant::ForLoop { .. } | ASTInstrVariant::ForInto { .. } => {
+                ASTType::Nil
+            }
+
+            ASTInstrVariant::Return(expr) => expr.get_type(ctx),
+            ASTInstrVariant::Block(block) => get_instruction_slice_type(ctx, block),
+            ASTInstrVariant::Cond { if_blocks, else_block } => {
+                let mut types = else_block
+                    .as_ref()
+                    .map(|i| i.get_type(ctx))
+                    .into_iter()
+                    .chain(if_blocks.iter().map(|(_, i)| i.get_type(ctx)));
+                types
+                    .next()
+                    .and_then(|ty| types.all(|other| ty.eq(&other)).then_some(ty))
+                    .unwrap_or_default()
+            }
+
+            ASTInstrVariant::MethodInvok(_, _, _) | ASTInstrVariant::FuncCall(_, _) => todo!("implement clozures"),
+        }
+    }
+}
+
+impl Deref for ASTInstr {
+    type Target = ASTInstrVariant;
+
+    fn deref(&self) -> &Self::Target {
+        &self.content
+    }
+}
+
+impl DerefMut for ASTInstr {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.content
+    }
+}
+
+impl VariantName for ASTInstr {
+    fn variant_name(&self) -> &'static str {
+        self.content.variant_name()
+    }
+}
+
+impl VariantName for ASTInstrVariant {
+    fn variant_name(&self) -> &'static str {
+        match self {
+            ASTInstrVariant::Decl(_, _) => "variable declaration",
+            ASTInstrVariant::Assign(_, _) => "variable assignation",
+            ASTInstrVariant::FuncCall(_, _) => "function call",
+            ASTInstrVariant::MethodInvok(_, _, _) => "method invokation",
+            ASTInstrVariant::Block(_) => "instruction block",
+            ASTInstrVariant::WhileDo(_, _) => "while loop",
+            ASTInstrVariant::Cond { .. } => "conditionals",
+            ASTInstrVariant::ForLoop { step: Some(_), .. } => "for loop with step",
+            ASTInstrVariant::ForLoop { step: None, .. } => "for loop",
+            ASTInstrVariant::ForInto { .. } => "for into loop",
+            ASTInstrVariant::Noop => "noop",
+            ASTInstrVariant::Break => "break statement",
+            ASTInstrVariant::Continue => "continue statement",
+            ASTInstrVariant::Return(_) => "return statement",
+        }
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/maybe_const_expr.rs b/src/Rust/vvs_lang/src/ast/maybe_const_expr.rs
new file mode 100644
index 00000000..d0e05e45
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/maybe_const_expr.rs
@@ -0,0 +1,26 @@
+use crate::ast::*;
+use std::ops::Deref;
+
+/// Trait for objects that are typed and may be values known at compile time.
+///
+/// As long a a type can be dereferenced into a [MaybeConstExpr] thing, it is [MaybeConstExpr].
+pub trait MaybeConstExpr: Typed {
+    /// Tells whether the thing is a constant expression or not.
+    fn is_const_expr(&self) -> bool;
+
+    /// Evaluate the expression, if it is indeed a constant expression then returns the result,
+    /// otherwise return [None].
+    fn eval_const_expr(&self) -> Option<ASTConst>;
+}
+
+impl<S: MaybeConstExpr, T: Deref<Target = S>> MaybeConstExpr for T {
+    #[inline]
+    fn is_const_expr(&self) -> bool {
+        self.deref().is_const_expr()
+    }
+
+    #[inline]
+    fn eval_const_expr(&self) -> Option<ASTConst> {
+        self.deref().eval_const_expr()
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/mod.rs b/src/Rust/vvs_lang/src/ast/mod.rs
index 99fe75f8..8da5d32a 100644
--- a/src/Rust/vvs_lang/src/ast/mod.rs
+++ b/src/Rust/vvs_lang/src/ast/mod.rs
@@ -1,7 +1,64 @@
+//! Module used to store all the definition of the AST used for parsing VVS/VVL files.
+
+mod constant;
+mod expression;
+mod extension;
+mod function;
+mod identifier;
+mod import;
+mod instruction;
+mod maybe_const_expr;
 mod module;
+mod options;
+mod pattern;
 mod program;
 mod span;
 mod string;
-mod tree;
+mod type_context;
+mod typed;
+mod types;
+mod variable;
+mod variant;
+mod visibility;
+
+use hashbrown::HashMap;
+use std::rc::Rc;
+
+pub use self::{
+    constant::*, expression::*, extension::*, function::*, identifier::*, import::*, instruction::*,
+    maybe_const_expr::*, module::*, options::*, pattern::*, program::*, span::*, string::*, type_context::*, typed::*,
+    types::*, variable::*, variant::*, visibility::*,
+};
+
+pub type ASTString = Rc<str>;
+pub type ASTFloating = f32;
+pub type ASTInteger = i32;
+pub type ASTTable<T> = HashMap<ASTString, T>;
+
+pub fn write_ast_table<T: std::fmt::Display>(f: &mut std::fmt::Formatter<'_>, table: &ASTTable<T>) -> std::fmt::Result {
+    f.write_str("{")?;
+    if let Some((key, value)) = table.iter().next() {
+        write!(f, " {key} = {value}")?;
+    }
+    for (key, value) in table.iter().skip(1) {
+        write!(f, ", {key} = {value}")?;
+    }
+    f.write_str(" }")
+}
+
+pub fn write_ast_tuple<T: std::fmt::Display>(f: &mut std::fmt::Formatter<'_>, tuple: &[T]) -> std::fmt::Result {
+    f.write_str("(")?;
+    if let Some(value) = tuple.iter().next() {
+        write!(f, " {value}")?;
+    }
+    for value in tuple.iter().skip(1) {
+        write!(f, ", {value}")?;
+    }
+    f.write_str(" )")
+}
 
-pub use self::{module::*, program::*, span::*, string::*, tree::*};
+/// Trait that allows to get a variant name out of an enum or a struct containing an enum.
+pub(crate) trait VariantName {
+    /// Get the name out of the value.
+    fn variant_name(&self) -> &'static str;
+}
diff --git a/src/Rust/vvs_lang/src/ast/module.rs b/src/Rust/vvs_lang/src/ast/module.rs
index 335c8b9a..d7eba73a 100644
--- a/src/Rust/vvs_lang/src/ast/module.rs
+++ b/src/Rust/vvs_lang/src/ast/module.rs
@@ -1,82 +1,201 @@
-use super::{tree::*, ASTStringCacheHandle};
+use crate::ast::*;
 use hashbrown::{HashMap, HashSet};
-use std::{cell::RefCell, rc::Rc};
+use std::{
+    cell::UnsafeCell,
+    rc::{Rc, Weak},
+};
 
 /// A VVL module of a Vivy Script
-pub struct Module {
-    functions: HashMap<ASTString, ASTFunction>,
-    jobs: HashMap<ASTString, ASTJob>,
-    consts: HashMap<ASTString, (ASTVar, ASTConst)>,
+#[derive(Debug, Clone)]
+pub struct ASTModule {
+    /// The name of the module, should be a valid identifier.
+    name: ASTString,
+
+    /// Checks if we want to put it into the type context or not...
+    variants: HashMap<ASTString, ASTVariantRules>,
+
+    functions: HashMap<ASTString, (ASTVisibility, ASTFunction)>,
+    jobs: HashMap<ASTString, (ASTVisibility, ASTFunction)>,
+    consts: HashMap<ASTString, (ASTVisibility, ASTVar, ASTConst)>,
     options: HashMap<ASTString, (ASTVar, ASTConst)>,
-    imports: HashSet<ASTString>,
+    imports: HashMap<ASTString, (ASTSpan, ASTModulePtr)>,
+
+    /// Contains all the symbols available in the module, to be sure that options, constants,
+    /// functions and jobs doesn't enter in collision.
+    symbols: HashSet<ASTString>,
 
-    /// Caching for strings, identified by theyr hash and reuse the same memory location to reduce
+    /// Caching for strings, identified by their hash and reuse the same memory location to reduce
     /// memory footprint. Use the .finish function from the hasher to get the key.
-    strings: Rc<RefCell<HashMap<u64, ASTString>>>,
+    strings: ASTStringCacheHandle,
+
+    /// Type context intern to the module. This is self-referencing. Under the hood we use a weak
+    /// pointer and a lazy initialize thingy for the type context.
+    tyctx: ASTTypeContext,
 }
 
-/// Here, all the getters...
-impl Module {
+pub type ASTModulePtr = Rc<UnsafeCell<ASTModule>>;
+pub type ASTModuleWeakPtr = Weak<UnsafeCell<ASTModule>>;
+
+impl ASTModule {
+    /// Create a new empty module.
+    #[inline]
+    pub fn new(name: ASTString, strings: ASTStringCacheHandle) -> ASTModulePtr {
+        Rc::new_cyclic(|ptr| {
+            let colors_rules = ASTVariantRules::new_colors(strings.clone());
+            let movement_rules = ASTVariantRules::new_movements(strings.clone());
+            UnsafeCell::new(Self {
+                name,
+                strings,
+                tyctx: ASTTypeContext::new(ptr.clone()),
+                variants: HashMap::from_iter([
+                    (colors_rules.name(), colors_rules),
+                    (movement_rules.name(), movement_rules),
+                ]),
+                symbols: Default::default(),
+                functions: Default::default(),
+                jobs: Default::default(),
+                consts: Default::default(),
+                options: Default::default(),
+                imports: Default::default(),
+            })
+        })
+    }
+
+    /// Get all the variant rules.
+    #[inline]
+    pub fn all_variant_rules(&self) -> &HashMap<ASTString, ASTVariantRules> {
+        &self.variants
+    }
+
+    /// Get a set of rule for a specified variant if it exists in a mutable way. We only expose
+    /// this function to this crate because it's the only place where we want to be able to mutate
+    /// the module.
+    #[inline]
+    pub(crate) fn variant_rules_mut(&mut self, rule: impl AsRef<str>) -> Option<&mut ASTVariantRules> {
+        self.variants.get_mut(rule.as_ref())
+    }
+
+    /// Get the type context in a constant way.
+    #[inline]
+    pub fn tyctx(&self) -> &ASTTypeContext {
+        &self.tyctx
+    }
+
+    /// Get the type context in a mutable way. Only possible if we have a mutable reference to the
+    /// module anyway. If there are multiple strong references to the module it won't be correct...
+    #[inline]
+    pub fn tyctx_mut(&mut self) -> &mut ASTTypeContext {
+        &mut self.tyctx
+    }
+
+    /// Get the name of the module.
+    #[inline]
+    pub fn name(&self) -> ASTString {
+        self.name.clone()
+    }
+
+    /// Get a specific option if it exists.
+    #[inline]
+    pub fn option(&self, option: impl AsRef<str>) -> Option<&(ASTVar, ASTConst)> {
+        self.options.get(option.as_ref())
+    }
+
+    /// Get a job by its name, returns [None] if the job was not defined.
+    #[inline]
+    pub fn job(&self, name: impl AsRef<str>) -> Option<&ASTFunction> {
+        self.jobs.get(name.as_ref()).map(|(_, job)| job)
+    }
+
+    /// Get a function by its name, returns [None] if the function was not defined.
+    #[inline]
+    pub fn function(&self, name: impl AsRef<str>) -> Option<&ASTFunction> {
+        self.functions.get(name.as_ref()).map(|(_, function)| function)
+    }
+
+    /// Get all the options... All the options are public by design so no visibility rule is
+    /// necessary to query them.
+    #[inline]
+    pub fn options(&self) -> impl Iterator<Item = (&ASTVar, &ASTConst)> {
+        self.options.values().map(|(a, b): &(_, _)| (a, b))
+    }
+
+    /// Get all the constants with the specified visibility rule.
+    #[inline]
+    pub fn consts(&self, rule: ASTVisibilityRule) -> impl Iterator<Item = (&ASTVar, &ASTConst)> {
+        self.consts
+            .values()
+            .filter_map(move |(v, var, value)| (rule.allows(*v)).then_some((var, value)))
+    }
+
+    /// Get all the functions from the module with the specified visibility rule.
+    #[inline]
+    pub fn functions(&self, rule: ASTVisibilityRule) -> impl Iterator<Item = (ASTString, &ASTFunction)> {
+        self.functions
+            .values()
+            .filter_map(move |(v, f)| rule.allows(*v).then_some((f.name.clone(), f)))
+    }
+
+    /// Get all the jobs from the module with the specified visibility rule.
+    #[inline]
+    pub fn jobs(&self, rule: ASTVisibilityRule) -> impl Iterator<Item = (ASTString, &ASTFunction)> {
+        self.jobs
+            .values()
+            .filter_map(move |(v, f)| rule.allows(*v).then_some((f.name.clone(), f)))
+    }
+
+    /// Get all the callable items from the module with the specified visibility rule. This
+    /// includes jobs and functions.
+    pub(crate) fn callables(&self, rule: ASTVisibilityRule) -> impl Iterator<Item = (ASTString, &ASTFunction)> {
+        self.functions(rule).chain(self.jobs(rule))
+    }
+
+    /// Get all the jobs from a module in a mutable way, with the specified visibility rule.
+    pub(crate) fn jobs_mut(&mut self, rule: ASTVisibilityRule) -> impl Iterator<Item = (ASTString, &mut ASTFunction)> {
+        self.jobs
+            .values_mut()
+            .filter_map(move |(v, f)| rule.allows(*v).then_some((f.name.clone(), f)))
+    }
+
+    /// Get all the fonctions from a module in a mutable way, with the specified visibility rule.
+    pub(crate) fn functions_mut(
+        &mut self,
+        rule: ASTVisibilityRule,
+    ) -> impl Iterator<Item = (ASTString, &mut ASTFunction)> {
+        self.functions
+            .values_mut()
+            .filter_map(move |(v, f)| rule.allows(*v).then_some((f.name.clone(), f)))
+    }
+
+    /// Get the imported modules, required by the current module.
+    #[inline]
+    pub fn imports(&self) -> impl Iterator<Item = &ASTModule> + '_ {
+        self.imports.iter().map(|(_, (_, module))| ASTModule::get(module))
+    }
+
+    /// Get the import location of a module, for debug purpose.
+    #[inline]
+    pub fn get_import_location(&self, import: &ASTString) -> Option<ASTSpan> {
+        self.imports
+            .iter()
+            .find_map(|(module, (span, _))| import.eq(module).then_some(*span))
+    }
+
     /// Get a handle to the string cache.
-    pub fn strings(&mut self) -> ASTStringCacheHandle {
-        ASTStringCacheHandle::new(self.strings.borrow_mut())
+    #[inline]
+    pub fn strings(&self) -> &ASTStringCacheHandle {
+        &self.strings
     }
-}
 
-/// Here all the setters, we try to have pure functions.
-impl Module {
-    /// Declare a new function.
-    ///
-    /// TODO: Use the entry thingy which should be better...
-    pub fn declare_function(mut self, name: ASTString, function: ASTFunction) -> Self {
-        if self.functions.contains_key(&name) {
-            log::warn!(target: "cc", ";re-definition of function {name} at {}", function.span);
-        }
-        self.functions.insert(name, function);
-        self
-    }
-
-    /// Declare a new job.
-    ///
-    /// TODO: Use the entry thingy which should be better...
-    pub fn declare_job(mut self, name: ASTString, job: ASTJob) -> Self {
-        if self.jobs.contains_key(&name) {
-            log::warn!(target: "cc", ";re-definition of job {name} at {}", job.span);
-        }
-        self.jobs.insert(name, job);
-        self
-    }
-
-    /// Declare a new option.
-    ///
-    /// TODO: Use the entry thingy which should be better...
-    pub fn declare_option(self, var: ASTVar, value: ASTConst) -> Self {
-        todo!()
-    }
-
-    /// Declare a new constant.
-    ///
-    /// TODO: Use the entry thingy which should be better...
-    pub fn declare_const(self, var: ASTVar, value: ASTConst) -> Self {
-        todo!()
-    }
-
-    /// Declare a new import.
-    ///
-    /// TODO: Use the entry thingy which should be better...
-    pub fn declare_import(self, import: ASTString) -> Self {
-        todo!()
+    /// Get a const reference to the module. As long as you don't use the [ASTModule::get_mut]
+    /// function, this one should be Ok.
+    #[inline]
+    pub(crate) fn get(this: &ASTModulePtr) -> &ASTModule {
+        unsafe { &*this.as_ref().get() }
     }
-}
 
-impl std::fmt::Debug for Module {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        f.debug_struct("Module")
-            .field("functions", &self.functions)
-            .field("jobs", &self.jobs)
-            .field("consts", &self.consts)
-            .field("options", &self.options)
-            .field("imports", &self.imports)
-            .finish()
+    /// Get a mutable reference to the module... Unsafe!
+    #[inline]
+    pub(crate) fn get_mut(this: &ASTModulePtr) -> *mut ASTModule {
+        this.as_ref().get()
     }
 }
diff --git a/src/Rust/vvs_lang/src/ast/options.rs b/src/Rust/vvs_lang/src/ast/options.rs
new file mode 100644
index 00000000..13d45a6f
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/options.rs
@@ -0,0 +1,64 @@
+use crate::ast::*;
+use anyhow::{bail, Context};
+use hashbrown::HashMap;
+
+/// Options for a program, represent the thing that is red from a file.
+pub struct OptionTable {
+    modules: HashMap<ASTString, ASTTable<ASTConst>>,
+}
+
+impl OptionTable {
+    pub fn new(cache: &ASTStringCacheHandle, values: toml::Table) -> anyhow::Result<Self> {
+        let modules = HashMap::with_capacity(values.len());
+        let modules = values.into_iter().try_fold(modules, |mut modules, (name, values)| {
+            use hashbrown::hash_map::EntryRef::*;
+            let toml::Value::Table(values) = values else {
+                bail!("expected a table for `{name}`")
+            };
+            let table = modules
+                .entry(cache.get(&name))
+                .or_insert(ASTTable::with_capacity(values.len()));
+            values
+                .into_iter()
+                .try_for_each(|(option, value)| match table.entry_ref(option.as_str()) {
+                    Occupied(_) => bail!("redefinition of option `{option}` in module `{name}`"),
+                    Vacant(entry) => {
+                        entry.insert(ASTConst::from_toml_value(cache, value)?);
+                        Ok(())
+                    }
+                })?;
+            if table.is_empty() {
+                modules.remove(name.as_str());
+            }
+            Ok(modules)
+        });
+        Ok(Self { modules: modules.context("invalid toml file")? })
+    }
+}
+
+impl Iterator for OptionTable {
+    type Item = ((ASTString, ASTString), ASTConst);
+
+    fn next(&mut self) -> Option<Self::Item> {
+        let Self { modules } = self;
+        let module = modules.keys().next()?.clone();
+
+        let values = match modules.get_mut(&module) {
+            Some(values) => values,
+            None => {
+                modules.remove(&module);
+                return None;
+            }
+        };
+
+        let (option, value) = match values.keys().next().cloned() {
+            Some(option) => values.remove_entry(&option)?,
+            None => {
+                modules.remove(&module);
+                return None;
+            }
+        };
+
+        Some(((module, option), value))
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/pattern.rs b/src/Rust/vvs_lang/src/ast/pattern.rs
new file mode 100644
index 00000000..5b3707d4
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/pattern.rs
@@ -0,0 +1,39 @@
+//! In this file we declare things needed to do the pattern matching or boolean check for
+//! conditionals.
+//!
+//! Note that we can only pattern match variants.
+
+use crate::ast::*;
+
+/// A condition, two expression must be equal, or should we try to match a thing.
+#[derive(Debug, PartialEq, Clone)]
+pub enum ASTCondition {
+    /// Usual if check.
+    BooleanTrue(ASTExpr),
+
+    /// Does the expression can be pattern-matched or not. This is only for variants.
+    BindVariant { as_type: ASTType, variant: ASTString, pattern: Vec<ASTPatternElement>, source: ASTVar },
+
+    /// Tells whever a variable is coercible into a type or not.
+    CoercibleInto { new: ASTVar, as_type: ASTType, source: ASTVar },
+}
+
+/// When we match a pattern, we can do conditionals on the value of elements, or we can bind
+/// variables that will be visible in the if/elseif/if-let statement.
+#[derive(Debug, PartialEq, Clone)]
+pub enum ASTPatternElement {
+    /// Must be equal to this thing.
+    Const(ASTConst),
+
+    /// Expose this field of the struct in the block if the struct matched.
+    Var(ASTVar),
+}
+
+impl ASTPatternElement {
+    pub fn span(&self) -> Option<ASTSpan> {
+        match self {
+            ASTPatternElement::Const(_) => None,
+            ASTPatternElement::Var(var) => Some(var.span()),
+        }
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/program.rs b/src/Rust/vvs_lang/src/ast/program.rs
index c0691a0c..67088e1e 100644
--- a/src/Rust/vvs_lang/src/ast/program.rs
+++ b/src/Rust/vvs_lang/src/ast/program.rs
@@ -1,19 +1,15 @@
-use crate::{ast::*, parser::*};
-use hashbrown::{HashMap, HashSet};
-use std::{cell::RefCell, rc::Rc};
+use crate::ast::*;
+use hashbrown::HashMap;
 
 /// The first element of the tuple is the destination variable, the second is the tuple to describe
 /// the job picked from a module, the last is the list of variables to use as input for this job.
-pub type ProgramOperation = (ASTString, (ASTString, ASTString), Vec<ASTString>);
+pub type ProgramOperation = (ASTSpan, ASTString, (ASTString, ASTString), Option<Vec<ASTConst>>, Vec<ASTString>);
 
 /// The main VVS file/program.
-pub struct Program {
-    modules: HashMap<ASTString, Module>,
-
-    /// Options specified in the VVL module. All options must be constants.
-    ///
-    /// TODO: Remove that, use the options from the modules directly...
-    options: Vec<((ASTString, ASTVar), ASTConst)>,
+#[derive(Debug)]
+pub struct ASTProgram {
+    /// The list of all the modules used in the program, with their import location.
+    modules: HashMap<ASTString, (ASTSpan, ASTModulePtr)>,
 
     /// The setted options, from the VVS file.
     setted: Vec<((ASTString, ASTString), ASTConst)>,
@@ -29,104 +25,116 @@ pub struct Program {
 
     /// Caching for strings, identified by theyr hash and reuse the same memory location to reduce
     /// memory footprint. Use the .finish function from the hasher to get the key.
-    strings: Rc<RefCell<HashMap<u64, ASTString>>>,
+    strings: ASTStringCacheHandle,
 }
 
-/// Here we have all the getters...
-impl Program {
+impl ASTProgram {
+    pub fn new(strings: ASTStringCacheHandle) -> Self {
+        Self {
+            initial_var: strings.get("INIT"),
+            setted: Default::default(),
+            writes: Default::default(),
+            modules: Default::default(),
+            operations: Default::default(),
+            strings,
+        }
+    }
+
+    /// Iterate over all the modules in the program.
+    #[inline]
+    pub fn modules(&self) -> impl Iterator<Item = &ASTModule> + '_ {
+        self.modules.values().map(|(_, module)| ASTModule::get(module))
+    }
+
     /// Get a handle to the string cache.
-    pub fn strings(&mut self) -> ASTStringCacheHandle {
-        ASTStringCacheHandle::new(self.strings.borrow_mut())
+    #[inline]
+    pub fn strings(&self) -> &ASTStringCacheHandle {
+        &self.strings
     }
 
     /// Get a const reference to a module.
-    pub fn module(&self, name: impl AsRef<str>) -> Option<&Module> {
-        self.modules.get(name.as_ref())
+    pub fn module(&self, name: impl AsRef<str>) -> Option<&ASTModule> {
+        self.modules
+            .get(name.as_ref())
+            .map(|(_, module)| ASTModule::get(module))
+    }
+
+    /// Get the pointer to a module. Returns [None] if the module was not present in the program.
+    ///
+    /// # Safety
+    /// With this function we create the possibility to make multiple mutable references to the
+    /// same module down the line, so we mark it as an unsafe operation for now...
+    pub(crate) unsafe fn module_ptr(&self, name: impl AsRef<str>) -> Option<ASTModulePtr> {
+        self.modules.get(name.as_ref()).map(|(_, ptr)| ptr.clone())
+    }
+
+    /// Get all the available options for this program, with their default value.
+    pub fn available_options(&self) -> impl Iterator<Item = (ASTString, &ASTVar, &ASTConst)> {
+        self.modules()
+            .flat_map(|module| module.options().map(|(var, def)| (module.name(), var, def)))
     }
 
-    /// Get a mutable reference to a module.
-    pub fn module_mut(&mut self, name: impl AsRef<str>) -> Option<&mut Module> {
-        self.modules.get_mut(name.as_ref())
+    /// Get all the setted options from the program.
+    #[inline]
+    pub fn setted_options(&self) -> &[((ASTString, ASTString), ASTConst)] {
+        self.setted.as_ref()
     }
 
     /// Get the value for an option. For the resolution: we first take the value from the setted
     /// list before the default value. Note that if we set an option that was never declared we
     /// don't return it here, it should have raised a warning and should not be used in the code
     /// anyway.
-    pub fn options(&self, module: &ASTString, name: &ASTString) -> Option<&ASTConst> {
+    pub fn option(&self, module: &ASTString, name: &ASTString) -> Option<ASTConst> {
         let default = self
-            .options
-            .iter()
-            .find_map(|((mm, var), val)| (*module == *mm && *name == *var.name()).then_some(val))?;
+            .module(module)?
+            .options()
+            .find_map(|(var, val)| var.name().eq(name).then_some(val))?
+            .clone();
         let setted = self
             .setted
             .iter()
             .find_map(|((mm, var), val)| (*module == *mm && *name == *var).then_some(val));
-        Some(setted.unwrap_or(default))
+        Some(setted.cloned().unwrap_or(default))
     }
-}
 
-/// Here we have all the setters... We always take the [Program] and return a new one for the
-/// functions to be pure.
-impl Program {
-    /// Get the operations and the variables to write. Can return an error if a variable was
-    /// assigned multiple times or if a variable to write was never assigned.
-    pub fn into_operations(self) -> VVResult<(ASTString, Vec<ProgramOperation>, Vec<ASTString>)> {
-        let assigned = HashSet::<ASTString>::from_iter(
-            self.operations
-                .iter()
-                .map(|(dest, ..)| dest.clone())
-                .chain([self.initial_var.clone()]),
-        );
-        if let Some(unwritten) = self.writes.1.iter().find(|var| !assigned.contains(*var)) {
-            return Err(VVError::ErrorMsg(
-                self.writes.0,
-                format!("variable `{unwritten}` can't be saved because it was never assigned"),
-            ));
-        }
-        let res = (self.initial_var, self.writes);
-        todo!("add the verified operations to {res:?}")
+    /// Get the operations and the variables to write. Note that no check is done here.
+    pub fn as_operations(&self) -> (ASTString, Vec<ProgramOperation>, Vec<ASTString>) {
+        (self.initial_var.clone(), self.operations.clone(), self.writes.1.clone())
+    }
+
+    #[inline]
+    pub(crate) fn writes_span(&self) -> ASTSpan {
+        self.writes.0
     }
 
     /// Set an option in the [Program], if the option was already set or was not declared in a
     /// [Module] we raise a warning.
     pub fn set_option(mut self, module: ASTString, name: ASTString, value: ASTConst) -> Self {
         if self
-            .options
-            .iter()
-            .any(|((mm, nn), _)| *mm == module && name == *nn.name())
+            .module(&module)
+            .map(|module| module.options().any(|(var, _)| var.name().eq(&name)))
+            .unwrap_or_default()
         {
             log::warn!(target: "cc", ";set option {module}.{name} which was not declared");
-        }
-        if self.setted.iter().any(|((mm, nn), _)| *mm == module && name == *nn) {
+        } else if self.setted.iter().any(|((mm, nn), _)| *mm == module && name == *nn) {
             log::warn!(target: "cc", ";re-set option {module}.{name}");
         }
         self.setted.push(((module, name), value));
         self
     }
 
-    /// Add an option to the module. We try to expose a functional semantic for the usage of the
-    /// [Program] struct to help the parsing implementation.
-    pub fn declare_option(mut self, module: ASTString, var: ASTVar, value: ASTConst) -> VVResult<Self> {
-        let key = (module, var);
-        if let Some(old) = self.options.iter().find_map(|(k, _)| key.eq(k).then_some(k.1 .0)) {
-            Err(VVError::OptionRedefined(old, key.0, key.1))
-        } else {
-            self.options.push((key, value));
-            Ok(self)
+    /// Import a module into the program.
+    #[inline]
+    pub(crate) fn import_module(mut self, name: ASTString, span: ASTSpan, module: ASTModulePtr) -> Self {
+        if let Some((_, module)) = self.modules.insert(name, (span, module)) {
+            log::warn!(target: "cc", ";re-import of module `{}`", ASTModule::get(&module).name())
         }
+        self
     }
-}
 
-impl std::fmt::Debug for Program {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        f.debug_struct("Program")
-            .field("modules", &self.modules)
-            .field("options", &self.options)
-            .field("setted", &self.setted)
-            .field("operations", &self.operations)
-            .field("writes", &self.writes)
-            .field("initial_var", &self.initial_var)
-            .finish()
+    /// Use options from a toml file to set things in the program and simplify a bit said
+    /// program...
+    pub fn with_options(self, _options: OptionTable) -> Self {
+        self
     }
 }
diff --git a/src/Rust/vvs_lang/src/ast/span.rs b/src/Rust/vvs_lang/src/ast/span.rs
index 25c56237..512ad50d 100644
--- a/src/Rust/vvs_lang/src/ast/span.rs
+++ b/src/Rust/vvs_lang/src/ast/span.rs
@@ -16,6 +16,7 @@ impl std::fmt::Display for ASTSpan {
 impl ASTSpan {
     /// Create the span out of a line and column and an offset. The lines and
     /// columns begeins at 1. The offset begins at 0.
+    #[inline]
     pub fn new(line: u64, column: u64, offset: u64) -> Self {
         assert!(line >= 1);
         assert!(column >= 1);
@@ -23,16 +24,19 @@ impl ASTSpan {
     }
 
     /// Get the column of the span. The column starts at 1
+    #[inline]
     pub fn line(&self) -> u64 {
         self.line
     }
 
     /// Get the column of the span. The column starts at 1
+    #[inline]
     pub fn column(&self) -> u64 {
         self.column
     }
 
     /// Get the offset of the span.
+    #[inline]
     pub fn offset(&self) -> u64 {
         self.offset
     }
@@ -40,6 +44,7 @@ impl ASTSpan {
     /// Merge two spans. For now we just take the first one (the one with the
     /// lesser offset, i.e. the minimal one). In the future we will update the
     /// length field (when it's added to the structure...)
+    #[inline]
     pub fn merge(s1: Self, s2: Self) -> Self {
         if PartialOrd::gt(&s1, &s2) {
             s2
@@ -49,17 +54,22 @@ impl ASTSpan {
     }
 }
 
-impl From<nom_locate::LocatedSpan<&str>> for ASTSpan {
-    fn from(span: nom_locate::LocatedSpan<&str>) -> Self {
-        Self {
-            line: span.location_line() as u64,
-            column: span.naive_get_utf8_column() as u64,
-            offset: span.location_offset() as u64,
-        }
+impl From<&ASTSpan> for ASTSpan {
+    #[inline]
+    fn from(value: &ASTSpan) -> Self {
+        *value
+    }
+}
+
+impl From<&mut ASTSpan> for ASTSpan {
+    #[inline]
+    fn from(value: &mut ASTSpan) -> Self {
+        *value
     }
 }
 
 impl PartialOrd for ASTSpan {
+    #[inline]
     fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
         PartialOrd::partial_cmp(&self.offset, &other.offset)
     }
diff --git a/src/Rust/vvs_lang/src/ast/string.rs b/src/Rust/vvs_lang/src/ast/string.rs
index acd94e43..acec81a7 100644
--- a/src/Rust/vvs_lang/src/ast/string.rs
+++ b/src/Rust/vvs_lang/src/ast/string.rs
@@ -1,19 +1,15 @@
 use super::ASTString;
 use hashbrown::HashMap;
-use std::{cell::RefMut, collections::hash_map::DefaultHasher, hash::Hasher};
+use std::{cell::RefCell, collections::hash_map::DefaultHasher, hash::Hasher, rc::Rc};
 
 /// Used when iterating into the module with mut access, we might need to access the string
 /// cache...
-#[derive(Debug)]
-pub struct ASTStringCacheHandle<'a> {
-    strings: RefMut<'a, HashMap<u64, ASTString>>,
+#[derive(Debug, Clone, Default)]
+pub struct ASTStringCacheHandle {
+    strings: Rc<RefCell<HashMap<u64, ASTString>>>,
 }
 
-impl<'a> ASTStringCacheHandle<'a> {
-    pub(crate) fn new(strings: RefMut<'a, HashMap<u64, ASTString>>) -> Self {
-        Self { strings }
-    }
-
+impl ASTStringCacheHandle {
     /// Get the id of a string.
     fn get_id(str: impl AsRef<str>) -> u64 {
         let mut hasher = DefaultHasher::new();
@@ -21,21 +17,12 @@ impl<'a> ASTStringCacheHandle<'a> {
         hasher.finish()
     }
 
-    /// Get a string from the cache, fail if not present.
-    pub fn get(&mut self, str: impl AsRef<str>) -> Option<ASTString> {
-        self.strings.get(&Self::get_id(str.as_ref())).cloned()
-    }
-
     /// Get or create a string in the cache.
-    pub fn get_or_insert(&mut self, str: impl AsRef<str>) -> ASTString {
-        let id = Self::get_id(str.as_ref());
-        match self.strings.get(&id) {
-            Some(str) => str.clone(),
-            None => {
-                let str = ASTString::from(str.as_ref());
-                self.strings.insert(id, str.clone());
-                str
-            }
-        }
+    pub fn get(&self, str: impl AsRef<str>) -> ASTString {
+        self.strings
+            .borrow_mut()
+            .entry(Self::get_id(str.as_ref()))
+            .or_insert_with(|| ASTString::from(str.as_ref()))
+            .clone()
     }
 }
diff --git a/src/Rust/vvs_lang/src/ast/tree.rs b/src/Rust/vvs_lang/src/ast/tree.rs
deleted file mode 100644
index e9934ae3..00000000
--- a/src/Rust/vvs_lang/src/ast/tree.rs
+++ /dev/null
@@ -1,266 +0,0 @@
-use super::ASTSpan;
-use hashbrown::HashMap;
-use std::rc::Rc;
-
-pub type ASTString = Rc<str>;
-pub type ASTFloating = f32;
-pub type ASTInteger = i32;
-pub type ASTTable<T> = HashMap<ASTString, T>;
-
-#[macro_export]
-macro_rules! anon_expression {
-    ($variant: ident $($args: tt)?) => {
-        ASTExpr {
-            span: Default::default(),
-            content: ASTExprVariant::$variant $($args)?,
-        }
-    };
-}
-
-#[macro_export]
-macro_rules! expression {
-    ($span: expr, $variant: ident $($args: tt)?) => {
-        ASTExpr {
-            span: $span.into(),
-            content: ASTExprVariant::$variant $($args)?,
-        }
-    };
-}
-
-#[macro_export]
-macro_rules! anon_instruction {
-    ($variant: ident $($args: tt)?) => {
-        ASTInstr {
-            span: Default::default(),
-            content: ASTInstrVariant::$variant $($args)?,
-        }
-    };
-}
-
-#[macro_export]
-macro_rules! instruction {
-    ($span: expr, $variant: ident $($args: tt)?) => {
-        ASTInstr {
-            span: $span.into(),
-            content: ASTInstrVariant::$variant $($args)?,
-        }
-    };
-}
-
-/// Job to execute on a line, syllabe, list of lines, etc.
-#[derive(Debug)]
-pub struct ASTJob {
-    pub name: ASTString,
-    pub returns: ASTType,
-    pub arguments: Vec<ASTVar>,
-    pub content: Vec<ASTInstr>,
-
-    pub span: ASTSpan,
-}
-
-/// A function.
-#[derive(Debug)]
-pub struct ASTFunction {
-    pub name: ASTString,
-    pub arguments: Vec<ASTVar>,
-    pub content: Vec<ASTInstr>,
-
-    pub span: ASTSpan,
-}
-
-/// Instructions.
-#[derive(Debug)]
-pub struct ASTInstr {
-    pub content: ASTInstrVariant,
-    pub span: ASTSpan,
-}
-
-/// Instructions.
-#[derive(Debug, PartialEq)]
-pub enum ASTInstrVariant {
-    /// Declare variables.
-    Decl(Vec<ASTVar>, Vec<ASTExpr>),
-
-    /// Assign into variables.
-    Assign(Vec<ASTExpr>, Vec<ASTExpr>),
-
-    /// FunctionCall.
-    FuncCall(ASTString, Vec<ASTExpr>),
-
-    /// Begin a block.
-    Block(Vec<ASTInstr>),
-
-    /// A WhileDo instruction.
-    WhileDo(ASTExpr, Vec<ASTInstr>),
-
-    /// A DoWhile instruction.
-    RepeatUntil(ASTExpr, Vec<ASTInstr>),
-
-    /// Conditionals, contract the elseid blocks.
-    Cond {
-        cond: ASTExpr,
-        then_block: Vec<ASTInstr>,
-        elseif_blocks: Vec<(ASTExpr, Vec<ASTInstr>)>,
-        else_block: Option<Vec<ASTInstr>>,
-    },
-
-    /// For loop, the classic one:
-    /// ```vvs
-    /// for elem = 1, 3, 1 do print(elem) end
-    /// ```
-    ForLoop {
-        var: ASTVar,
-        lower: ASTInteger,
-        upper: ASTInteger,
-        step: Option<ASTInteger>,
-    },
-
-    /// For loop with an iterable expression (table):
-    /// ```vvs
-    /// for elem in { 1, 2, 3 } do print(elem) end
-    /// for elem in ( 1, 2, 3 ) do print(elem) end
-    /// for elem in my_table    do print(elem) end
-    /// ```
-    ForInto { var: ASTVar, list: ASTExpr },
-
-    /// Final thing: break from block.
-    Break,
-
-    /// Final thing: continue to next iteration.
-    Continue,
-
-    /// Final thing: return something.
-    Return(ASTExpr),
-}
-
-/// Binops, sorted by precedence.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum ASTBinop {
-    /// Assoc: right
-    Power,
-
-    Mul,
-    Div,
-    Mod,
-    Add,
-    Sub,
-
-    /// Assoc: right
-    StrCat,
-
-    CmpLE,
-    CmpLT,
-    CmpGE,
-    CmpGT,
-    CmpEQ,
-    CmpNE,
-
-    LogicAnd,
-    LogicXor,
-    LogicOr,
-
-    BitAnd,
-    BitXor,
-    BitOr,
-    BitShiftLeft,
-    BitShiftRight,
-}
-
-/// Unops.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum ASTUnop {
-    LogicNot,
-    BitNot,
-    Len,
-    Neg,
-}
-
-/// Expressions. For the partial equality we skip the span field to be able to test efficiently the
-/// parsing.
-#[derive(Debug)]
-pub struct ASTExpr {
-    pub content: ASTExprVariant,
-    pub span: ASTSpan,
-}
-
-/// Expressions.
-#[derive(Debug, PartialEq)]
-pub enum ASTExprVariant {
-    Nil,
-    False,
-    True,
-    Integer(ASTInteger),
-    Floating(ASTFloating),
-    String(ASTString),
-    Table(ASTTable<ASTExpr>),
-    Binop(Box<ASTExpr>, ASTBinop, Box<ASTExpr>),
-    Unop(ASTUnop, Box<ASTExpr>),
-    FuncCall(Box<ASTExpr>, Vec<ASTExpr>),
-    MethodInvok(Box<ASTExpr>, ASTString, Vec<ASTExpr>),
-    PrefixExpr(Box<ASTExpr>, Vec<ASTField>),
-    Tuple(Vec<ASTExpr>),
-    Var(ASTVar),
-    Const(ASTConst),
-}
-
-/// Fields indexes can be expressions or identifiers
-#[derive(Debug, PartialEq)]
-pub enum ASTField {
-    Expr(ASTSpan, ASTExprVariant),
-    Identifier(ASTSpan, ASTString),
-}
-
-/// Variable thing. Have a name, a where-it-is-defined span and optionally a type. Having to no
-/// type means that the type was not already found.
-#[derive(Debug, PartialEq, Eq)]
-pub struct ASTVar(pub ASTSpan, pub ASTString, pub Option<ASTType>);
-
-/// A constant expr.
-#[derive(Debug, PartialEq)]
-pub enum ASTConst {
-    Color(ASTInteger),
-    String(ASTString),
-    Integer(ASTInteger),
-    Floating(ASTFloating),
-    Table(ASTTable<ASTConst>),
-}
-
-/// Types.
-#[derive(Debug, PartialEq, Eq)]
-pub enum ASTType {
-    Integer,
-    Floating,
-    String,
-    Color,
-    Line,
-    Syllabe,
-    Table(ASTTable<ASTType>),
-}
-
-impl PartialEq for ASTExpr {
-    fn eq(&self, other: &Self) -> bool {
-        self.content == other.content
-    }
-}
-
-impl PartialEq for ASTInstr {
-    fn eq(&self, other: &Self) -> bool {
-        self.content == other.content
-    }
-}
-
-impl ASTVar {
-    pub fn span(&self) -> ASTSpan {
-        self.0
-    }
-
-    pub fn name(&self) -> &ASTString {
-        &self.1
-    }
-}
-
-impl std::fmt::Display for ASTVar {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        f.write_str(self.1.as_ref())
-    }
-}
diff --git a/src/Rust/vvs_lang/src/ast/type_context.rs b/src/Rust/vvs_lang/src/ast/type_context.rs
new file mode 100644
index 00000000..829dcc0b
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/type_context.rs
@@ -0,0 +1,180 @@
+use crate::ast::*;
+use core::cell::OnceCell;
+
+/// Match any item, private or public.
+const RULE_ANY: ASTVisibilityRule = ASTVisibilityRule::AtLeast(ASTVisibility::Private);
+const RULE_PUB: ASTVisibilityRule = ASTVisibilityRule::Only(ASTVisibility::Public);
+
+/// The ast context for storing types. Any use of the module must be delayed because when we create
+/// the type context for a module, we do it with a cyclic thingy, so the [Rc] is not already
+/// constructed (no strong reference), so all we have is a [std::rc::Weak].
+#[derive(Debug, Clone)]
+pub struct ASTTypeContext {
+    module: ASTModuleWeakPtr,
+    content: OnceCell<ASTTypeContextContent>,
+}
+
+/// The content of the [ASTTypeContext] must be lazyly initialized because of cyclic references
+/// with the module and it's type context.
+type ASTTypeContextContent = (
+    HashMap<ASTString, ASTType>,         // Variables
+    HashMap<ASTString, ASTVariantRules>, // Variants
+    ASTStringCacheHandle,                // String cache
+    Vec<ASTString>,                      // Name of imported modules
+);
+
+impl ASTTypeContext {
+    fn init_content(&self) -> ASTTypeContextContent {
+        let ptr = self.module.upgrade().expect("no more strong references to module...");
+        let module = ASTModule::get(&ptr);
+
+        // We need to import things from the current module and from the imported modules. But for
+        // imported modules we must prepend the constant/option/callable name by the module name
+        // with a dot, to call those things like in lua.
+        let modules = [(None, module)]
+            .into_iter()
+            .chain(module.imports().map(|module| (Some(module.name()), module)));
+
+        let scope = modules.flat_map(|(mname, module)| {
+            let rule = if mname.is_some() { RULE_PUB } else { RULE_ANY };
+            let (mname1, mname2, mname3) = (mname.clone(), mname.clone(), mname);
+
+            let options = module.options().map(move |(var, _)| {
+                let name = mname1
+                    .as_ref()
+                    .map(|n| module.strings().get(format!("{n}.{}", var.name())))
+                    .unwrap_or_else(|| var.name());
+                (name, var.get_specified_type_or_nil())
+            });
+
+            let consts = module.consts(rule).map(move |(var, _)| {
+                let name = mname2
+                    .as_ref()
+                    .map(|n| module.strings().get(format!("{n}.{}", var.name())))
+                    .unwrap_or_else(|| var.name());
+                (name, var.get_specified_type_or_nil())
+            });
+
+            let funcs = module.callables(rule).map(move |(name, func)| {
+                let name = mname3
+                    .as_ref()
+                    .map(|n| module.strings().get(format!("{n}.{name}")))
+                    .unwrap_or(name);
+
+                let arguments = func.arguments.iter().map(|arg| arg.get_specified_type_or_nil());
+                let func_type = ASTType::Function(arguments.collect(), Box::new(func.returns.clone()));
+
+                (name, func_type)
+            });
+
+            options.chain(consts).chain(funcs)
+        });
+
+        let strings = module.strings().clone();
+        let variants = module.all_variant_rules().clone();
+        let imports = module.imports().map(|module| module.name()).collect();
+        (scope.collect(), variants, strings, imports)
+    }
+
+    fn content(&self) -> &ASTTypeContextContent {
+        self.content.get_or_init(|| self.init_content())
+    }
+
+    fn content_mut(&mut self) -> &mut ASTTypeContextContent {
+        self.content();
+        self.content.get_mut().expect("should be initialized")
+    }
+
+    #[inline]
+    pub fn new(module: ASTModuleWeakPtr) -> Self {
+        Self { module, content: OnceCell::new() }
+    }
+
+    /// Try to map rules to a pattern. Returns the matching [Some] variables with their destination
+    /// types or [None] if the matching is not possible to do. Because all rules must be kown at
+    /// compile time we can now statically if a variant mapping is correct or not!
+    pub fn variant_try_map_rule(
+        &self,
+        rule: impl AsRef<str>,
+        to: &[ASTPatternElement],
+    ) -> Option<Vec<(ASTVar, ASTType)>> {
+        // Get the rule-set.
+        let rule = self.content().1.get(rule.as_ref())?;
+
+        // The first thing must be a constant string or identifier with the name of the sub-rule.
+        use ASTPatternElement::*;
+        let (rule, content) = match to {
+            [Const(ASTConst::String(sub_rule)), content @ ..] => (rule.rule(sub_rule)?, content),
+            [Var(var), content @ ..] => {
+                debug_assert!(
+                    var.get_specified_type().is_none(),
+                    "got a specified type for `{var}`, expected just an identifier"
+                );
+                (rule.rule(var.name())?, content)
+            }
+            _ => return None,
+        };
+
+        // Be sure that we capture everything in that rule. We don't have the `..` like in rust...
+        if rule.len() != content.len() {
+            return None;
+        }
+
+        Some(
+            // Do the matching for the sub-rule.
+            rule.iter().zip(content).map(|(rule, pat)| match pat {
+                // If a constant is provided we must ensure that the types are compatible!
+                Const(pat) => rule.coercible_to(&pat.get_const_type()).then_some(None).ok_or(()),
+                // If a variable is declared then we will return it. If the variable has a
+                // specified type, we must ensure that the element in the variant can be coerced
+                // into this specified type.
+                Var(var) => match var.get_specified_type() {
+                    Some(ty) => rule.coercible_to(ty).then(|| Some((var.clone(), rule.clone()))).ok_or(()),
+                    None => Ok(Some((var.clone(), rule.clone()))),
+                },
+            })
+            // Get ride of any errors because of impossible mappings.
+            .collect::<Result<Vec<Option<(ASTVar, ASTType)>>, ()>>().ok()?
+            // We collect the successful bindings into a vector, we don't care when a constant
+            // mapped with an element of the variant.
+            .into_iter().flatten().collect(),
+        )
+    }
+
+    /// Get a set of rule for a specified variant if it exists.
+    pub fn variant_complies_with_rule<T: Typed>(&self, rule: impl AsRef<str>, variant: &ASTVariant<T>) -> bool {
+        let rules = self.content().1.get(rule.as_ref());
+        rules.map_or(false, |rules| rules.complies(self, variant))
+    }
+
+    /// Create a new context, don't clone as we want to do other things...
+    #[inline]
+    pub fn for_scope(&self) -> Self {
+        self.clone()
+    }
+
+    /// Get the type of a variable by its name.
+    pub fn get(&self, name: &ASTVar) -> ASTType {
+        let (scope, ..) = self.content();
+        scope.get(name.name().as_ref()).unwrap().clone()
+    }
+
+    /// Declare a new variable. Returns an error on redefinition.
+    pub fn declare(&mut self, var: ASTVar, ty: ASTType) {
+        if var.is_joker() {
+            log::debug!("can't declare the joker as a variable at {}", var.span());
+        } else if self.content_mut().0.insert(var.name(), ty).is_some() {
+            panic!()
+        }
+    }
+
+    pub fn has_import(&self, import: impl AsRef<str>) -> bool {
+        self.content().3.iter().any(|scoped| scoped.as_ref() == import.as_ref())
+    }
+
+    /// Get the string cache out of the module pointer stored in the context.
+    #[inline]
+    pub fn strings(&self) -> &ASTStringCacheHandle {
+        &self.content().2
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/typed.rs b/src/Rust/vvs_lang/src/ast/typed.rs
new file mode 100644
index 00000000..d2f8b537
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/typed.rs
@@ -0,0 +1,17 @@
+use crate::ast::*;
+use std::ops::Deref;
+
+/// Trait for objects that are types.
+///
+/// As long a a type can be dereferenced into a [Typed] thing, it is [Typed].
+pub trait Typed {
+    /// Get the type of the object.
+    fn get_type(&self, ctx: &ASTTypeContext) -> ASTType;
+}
+
+impl<S: Typed, T: Deref<Target = S>> Typed for T {
+    #[inline]
+    fn get_type(&self, ctx: &ASTTypeContext) -> ASTType {
+        self.deref().get_type(ctx)
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/types.rs b/src/Rust/vvs_lang/src/ast/types.rs
new file mode 100644
index 00000000..cb231531
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/types.rs
@@ -0,0 +1,226 @@
+use crate::ast::*;
+
+/// Types. Every object that can be manipulated by the user has a type. We have base types and
+/// collection types and special ASS types.
+///
+/// Some coercion is possible between collection types...
+#[derive(Debug, PartialEq, Eq, Clone, Default)]
+pub enum ASTType {
+    /// Null, unit, nullptr, etc. This is the default type
+    #[default]
+    Nil,
+
+    /// An integer
+    Integer,
+
+    /// A floating point number
+    Floating,
+
+    /// A string.
+    String,
+
+    /// A boolean, true/false.
+    Boolean,
+
+    /// A color
+    Color,
+
+    /// A movement of a syllabe or line.
+    Movement,
+
+    /// A variant, can be a color or a movement.
+    Variant,
+
+    /// A tuple
+    Tuple(Vec<ASTType>),
+
+    /// Special ASS type, a syllabe. A simple syllabe.
+    Syllabe,
+
+    /// Special ASS type, a line. It's a collection of [ASTType::Syllabe] with extra steps, can
+    /// iterate over it.
+    Line,
+
+    /// A table where the content is not really defined. Because we don't know the keys we can't
+    /// iterate over it.
+    AnyTable,
+
+    /// A table where everything inside is defined, a struct. We can't iterate over it but we
+    /// statically know the keys of the table.
+    Table(ASTTable<ASTType>),
+
+    /// A uniform table, where all the values has the same types, like a sequence but which string
+    /// keys.
+    UniformTable(Box<ASTType>),
+
+    /// A sequence where the content is not really defined, like the any table but with sequences.
+    AnySequence,
+
+    /// A sequence where every value has the same type. We can iterate over it, like a uniform
+    /// table, but with integer and continuous keys.
+    Sequence(Box<ASTType>),
+
+    /// A function type, needs the arguments and the return value.
+    Function(Vec<ASTType>, Box<ASTType>),
+
+    /// A type that is not known at compile time, the user must check its type with a switch case.
+    Any,
+}
+
+impl ASTType {
+    /// Try to see if a type can be pattern matched and if it's the case, returns [Some] bindings
+    /// to add them to the type context, otherwise return [None].
+    pub fn try_match(&self, mctx: &ASTTypeContext, to: &[ASTPatternElement]) -> Option<Vec<(ASTVar, ASTType)>> {
+        self.get_variant_rule()
+            .and_then(|rule| mctx.variant_try_map_rule(rule, to))
+    }
+
+    /// Tells wether the type is buildable in a const context or not.
+    #[inline]
+    pub fn is_const_constructible(&self) -> bool {
+        matches!(self, ASTType::Nil | ASTType::Tuple(_) | ASTType::Any)
+            || self.is_numeric()
+            || self.is_table()
+            || self.is_sequence()
+    }
+
+    /// Tells wether the type is numeric or not.
+    #[inline]
+    pub fn is_numeric(&self) -> bool {
+        matches!(self, ASTType::Boolean | ASTType::Integer | ASTType::Floating)
+    }
+
+    /// Tells whether the type is any sort of sequence or not.
+    #[inline]
+    pub fn is_sequence(&self) -> bool {
+        matches!(self, ASTType::Sequence(_) | ASTType::AnySequence)
+    }
+
+    /// Tells whether the type is any sort of table or not.
+    #[inline]
+    pub fn is_table(&self) -> bool {
+        matches!(self, ASTType::UniformTable(_) | ASTType::Table(_) | ASTType::AnyTable)
+    }
+
+    /// Tells whether the type is any sort of variant or not.
+    #[inline]
+    pub fn is_variant(&self) -> bool {
+        matches!(self, ASTType::Variant | ASTType::Color | ASTType::Movement)
+    }
+
+    /// Get the name of the rules to follow for this variant if it's really a variant.
+    #[inline]
+    pub fn get_variant_rule(&self) -> Option<&'static str> {
+        match self {
+            ASTType::Color => Some("color"),
+            ASTType::Movement => Some("movement"),
+            _ => None,
+        }
+    }
+
+    /// Tells whether a type is trivially copiable, i.e. this type won't be managed.
+    #[inline]
+    pub fn is_trivialy_copiable(&self) -> bool {
+        use ASTType::*;
+        matches!(self, Nil | Integer | Floating | Boolean | Tuple(_))
+    }
+
+    pub fn coercible_to(&self, to: &ASTType) -> bool {
+        use ASTType::*;
+        match (self, to) {
+            // Equals...
+            (x, y)
+                if (x == y)
+                    || (x.is_table() && matches!(y, AnyTable))
+                    || (x.is_sequence() && matches!(y, AnySequence))
+                    || (x.is_variant() && y.is_variant()) =>
+            {
+                true
+            }
+
+            // Nil things
+            (_, Nil) | (Nil, Integer | Floating | Boolean) => true,
+            (Nil, to) => to.is_table() || to.is_sequence(),
+
+            // Integer things
+            (Integer, Floating | Boolean) | (Boolean, Integer | Floating) | (Floating, Integer) => true,
+
+            // Sequence / ASS things
+            (String, Sequence(ty)) | (Sequence(ty), String) => matches!(&**ty, String),
+            (Sequence(x), Line) | (Line, Sequence(x)) => matches!(&**x, Syllabe),
+            (Syllabe, Sequence(x)) => matches!(&**x, String),
+
+            // Table / Sequence things
+            (from, AnyTable) => from.is_sequence() || from.is_table() || from.is_variant(),
+            (Sequence(to), UniformTable(from)) | (UniformTable(from), Sequence(to)) => from.coercible_to(to),
+            (Table(table), Sequence(ty)) => {
+                let integer_keys = table.keys().all(|key| key.parse::<i64>().is_ok());
+                let mut uniform_values = table.values().collect::<Vec<_>>();
+                let uniform_values = uniform_values
+                    .pop()
+                    .map(|ty| uniform_values.into_iter().all(|a| ty.eq(a)).then_some(ty));
+                integer_keys && matches!(uniform_values, Some(Some(table_ty)) if table_ty.eq(ty))
+            }
+
+            _ => false,
+        }
+    }
+}
+
+impl Typed for ASTType {
+    #[inline]
+    fn get_type(&self, _: &ASTTypeContext) -> ASTType {
+        self.clone()
+    }
+}
+
+impl std::fmt::Display for ASTType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            ASTType::Nil => f.write_str("nil"),
+            ASTType::Any => f.write_str("any"),
+
+            ASTType::Integer => f.write_str("integer"),
+            ASTType::Floating => f.write_str("float"),
+            ASTType::String => f.write_str("string"),
+            ASTType::Boolean => f.write_str("boolean"),
+            ASTType::Color => f.write_str("color"),
+            ASTType::Variant => f.write_str("variant"),
+            ASTType::Movement => f.write_str("movement"),
+
+            ASTType::Function(args, ret) => {
+                f.write_str("function (")?;
+                if let Some(ty) = args.iter().next() {
+                    write!(f, " {ty}")?;
+                }
+                for ty in args.iter().skip(1) {
+                    write!(f, ", {ty}")?;
+                }
+                write!(f, " ) -> {ret}")
+            }
+
+            ASTType::Tuple(tuple) => {
+                f.write_str("(")?;
+                if let Some(ty) = tuple.iter().next() {
+                    write!(f, " {ty}")?;
+                }
+                for ty in tuple.iter().skip(1) {
+                    write!(f, ", {ty}")?;
+                }
+                f.write_str(" )")
+            }
+
+            ASTType::Line => f.write_str("line"),
+            ASTType::Syllabe => f.write_str("syllabe"),
+            ASTType::AnySequence => f.write_str("sequence { any }"),
+            ASTType::Sequence(ty) => write!(f, "sequence {{ {ty} }}"),
+
+            ASTType::AnyTable => f.write_str("table { any }"),
+            ASTType::UniformTable(inner) => write!(f, "table {{ {inner} }}"),
+            ASTType::Table(table) => {
+                f.write_str("table ")?;
+                write_ast_table(f, table)
+            }
+        }
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/variable.rs b/src/Rust/vvs_lang/src/ast/variable.rs
new file mode 100644
index 00000000..3cb53833
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/variable.rs
@@ -0,0 +1,119 @@
+use crate::ast::*;
+use std::sync::atomic::{AtomicU64, Ordering};
+
+/// Variable thing. Have a name, a where-it-is-defined span and optionally a type. Having to no
+/// type means that the type was not already found.
+///
+/// To get the type of a variable, it is either present in the context type hashmap, then we check
+/// the specified type, if all failed we return the [ASTType::Nil] type.
+#[derive(Debug, Clone)]
+pub struct ASTVar(ASTSpan, ASTString, Option<ASTType>);
+
+#[derive(Debug, Clone)]
+pub struct ASTVarBuilder<'a> {
+    span: ASTSpan,
+    cache: &'a ASTStringCacheHandle,
+    name: Option<ASTString>,
+    specified_ty: Option<ASTType>,
+}
+
+impl<'a> ASTVarBuilder<'a> {
+    pub fn build(self) -> ASTVar {
+        let name = self.name.unwrap_or_else(|| {
+            static ANON: AtomicU64 = AtomicU64::new(0);
+            self.cache.get(format!("_{}", ANON.fetch_add(1, Ordering::SeqCst)))
+        });
+        ASTVar(self.span, name, self.specified_ty)
+    }
+
+    pub fn span(mut self, span: impl Into<ASTSpan>) -> Self {
+        self.span = span.into();
+        self
+    }
+
+    pub fn with_type(mut self, ty: ASTType) -> Self {
+        self.specified_ty = Some(ty);
+        self
+    }
+
+    pub fn name_from(mut self, name: impl AsRef<str>) -> Self {
+        self.name = Some(self.cache.get(name.as_ref()));
+        self
+    }
+
+    pub fn name(mut self, name: ASTString) -> Self {
+        self.name = Some(name);
+        self
+    }
+}
+
+impl PartialEq for ASTVar {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        self.1 == other.1 && self.2 == other.2
+    }
+}
+
+impl ASTVar {
+    #[inline]
+    #[allow(clippy::new_ret_no_self)]
+    pub fn new(cache: &ASTStringCacheHandle) -> ASTVarBuilder {
+        ASTVarBuilder { span: Default::default(), cache, name: None, specified_ty: None }
+    }
+
+    #[inline]
+    pub fn span(&self) -> ASTSpan {
+        self.0
+    }
+
+    /// Get the specified type if any.
+    #[inline]
+    pub fn get_specified_type(&self) -> Option<&ASTType> {
+        self.2.as_ref()
+    }
+
+    /// Get the specified type. If no type is specified then we say that we return [ASTType::Nil].
+    #[inline]
+    pub fn get_specified_type_or_nil(&self) -> ASTType {
+        self.get_specified_type().cloned().unwrap_or_default()
+    }
+
+    /// Set the specified type.
+    #[inline]
+    pub fn set_specified_type(&mut self, ty: ASTType) {
+        self.2 = Some(ty);
+    }
+
+    /// Get the name.
+    #[inline]
+    pub fn name(&self) -> ASTString {
+        self.1.clone()
+    }
+
+    /// Tells wether the variable is the joker or not. We can assign into the joker, in this case
+    /// we yeet the result, but we can never read it.
+    pub fn is_joker(&self) -> bool {
+        self.1.as_ref().eq("_")
+    }
+}
+
+impl From<&ASTVar> for ASTSpan {
+    #[inline]
+    fn from(value: &ASTVar) -> Self {
+        value.span()
+    }
+}
+
+impl std::fmt::Display for ASTVar {
+    #[inline]
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.write_str(self.1.as_ref())
+    }
+}
+
+impl Typed for ASTVar {
+    #[inline]
+    fn get_type(&self, ctx: &ASTTypeContext) -> ASTType {
+        ctx.get(self)
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/variant.rs b/src/Rust/vvs_lang/src/ast/variant.rs
new file mode 100644
index 00000000..d6e6da7f
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/variant.rs
@@ -0,0 +1,192 @@
+use crate::ast::*;
+
+/// A trait to describes types that are variants. Can be used to handle colors and movements in a
+/// generic way.
+///
+/// Represents a color in the AST. A color can be:
+/// - `#(rgb 0, 0, 0)` for black
+/// - `#(green)` for green
+/// - etc...
+///
+/// Represents a movement in the AST, a movement can be:
+/// - `#[pos 500, 500]`
+/// - `#[cmove 0, 0, 100, 50, 30]`
+/// - etc...
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct ASTVariant<T: Typed> {
+    pub(crate) variant: ASTString,
+    pub(crate) args: Vec<T>,
+}
+
+pub(crate) struct ASTFmtColor<'a, T: Typed>(&'a ASTVariant<T>, &'a ASTTypeContext);
+pub(crate) struct ASTFmtMovement<'a, T: Typed>(&'a ASTVariant<T>, &'a ASTTypeContext);
+
+impl<T: Typed> ASTVariant<T> {
+    #[inline]
+    pub fn variant(&self) -> ASTString {
+        self.variant.clone()
+    }
+
+    #[inline]
+    pub fn args(&self) -> &[T] {
+        &self.args
+    }
+
+    #[inline]
+    pub fn args_mut(&mut self) -> &mut [T] {
+        &mut self.args
+    }
+
+    #[inline]
+    pub fn args_len(&self) -> usize {
+        self.args.len()
+    }
+}
+
+impl ASTVariant<ASTExpr> {
+    #[inline]
+    pub fn is_const_expr(&self) -> bool {
+        self.args.iter().all(|expr| expr.is_const_expr())
+    }
+}
+
+impl ASTVariant<ASTConst> {
+    #[inline]
+    pub fn is_const_expr(&self) -> bool {
+        true
+    }
+}
+
+impl<'a, T: Typed> ASTFmtColor<'a, T> {
+    pub(crate) fn new(variant: &'a ASTVariant<T>, ctx: &'a ASTTypeContext) -> Self {
+        Self(variant, ctx)
+    }
+}
+
+impl<'a, T: Typed> ASTFmtMovement<'a, T> {
+    pub(crate) fn new(variant: &'a ASTVariant<T>, ctx: &'a ASTTypeContext) -> Self {
+        Self(variant, ctx)
+    }
+}
+
+impl<'a, T: Typed> std::fmt::Display for ASTFmtColor<'a, T> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let Self(ASTVariant { variant, args }, ctx) = self;
+        write!(f, "#({variant}")?;
+        if let Some(arg) = args.iter().next() {
+            write!(f, " {}", arg.get_type(ctx))?;
+        }
+        for arg in args.iter().skip(1) {
+            write!(f, ", {}", arg.get_type(ctx))?;
+        }
+        f.write_str(" )")
+    }
+}
+
+impl<'a, T: Typed> std::fmt::Display for ASTFmtMovement<'a, T> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let Self(ASTVariant { variant, args }, ctx) = self;
+        write!(f, "#[{variant}")?;
+        if let Some(arg) = args.iter().next() {
+            write!(f, " {}", arg.get_type(ctx))?;
+        }
+        for arg in args.iter().skip(1) {
+            write!(f, ", {}", arg.get_type(ctx))?;
+        }
+        f.write_str(" ]")
+    }
+}
+
+/// Describes a set of rules for a variant.
+#[derive(Debug, Clone)]
+pub struct ASTVariantRules {
+    family: ASTString,
+    rules: HashMap<ASTString, Vec<ASTType>>,
+}
+
+macro_rules! rule {
+    ($cache: expr, $name: literal) => { ($cache.get($name), vec![]) };
+    ($cache: expr, $name: literal -> [$($arg: ident),*]) => { ($cache.get($name), vec![$(ASTType::$arg,)*]) };
+}
+
+impl ASTVariantRules {
+    /// Default empty ruleset.
+    #[inline]
+    pub fn new(name: ASTString) -> Self {
+        Self { family: name, rules: Default::default() }
+    }
+
+    /// Get the name of the family of variants.
+    #[inline]
+    pub fn name(&self) -> ASTString {
+        self.family.clone()
+    }
+
+    /// Get all the rules of this family.
+    #[inline]
+    pub fn rules(&self) -> impl Iterator<Item = (&ASTString, &Vec<ASTType>)> {
+        self.rules.iter()
+    }
+
+    /// Get a specific rule if present.
+    #[inline]
+    pub fn rule(&self, variant: impl AsRef<str>) -> Option<&[ASTType]> {
+        self.rules.get(variant.as_ref()).map(|vec| vec.as_ref())
+    }
+
+    /// Create a new rule set for colors, the default one.
+    #[inline]
+    pub fn new_colors(cache: ASTStringCacheHandle) -> Self {
+        Self {
+            family: cache.get("color"),
+            rules: HashMap::from_iter([
+                rule!(cache, "rgb"  -> [Integer, Integer, Integer]),
+                rule!(cache, "rgba" -> [Integer, Integer, Integer, Integer]),
+                rule!(cache, "black"),
+                rule!(cache, "white"),
+                rule!(cache, "grey"),
+                rule!(cache, "red"),
+                rule!(cache, "green"),
+                rule!(cache, "blue"),
+            ]),
+        }
+    }
+
+    /// Create a new rule set for movements, the default one.
+    #[inline]
+    pub fn new_movements(cache: ASTStringCacheHandle) -> Self {
+        Self {
+            family: cache.get("movement"),
+            rules: HashMap::from_iter([
+                rule![cache, "implicit"],
+                rule!(cache, "fixed"       -> [Integer, Integer]),
+                rule!(cache, "linear"      -> [Integer, Integer, Integer, Integer]),
+                rule!(cache, "accelerated" -> [Integer, Integer, Integer, Integer, Floating]),
+            ]),
+        }
+    }
+
+    /// Insert a new rule in the ruleset, returns [true] if the rule was inserted successfully,
+    /// [false] otherwise.
+    #[must_use]
+    #[inline]
+    pub fn insert_rule(&mut self, name: ASTString, types: Vec<ASTType>) -> bool {
+        self.rules.insert(name, types).is_none()
+    }
+
+    /// Returns wether a variant complies with the set of allowed one.
+    #[must_use]
+    #[inline]
+    pub fn complies<T: Typed>(&self, ctx: &ASTTypeContext, variant: &ASTVariant<T>) -> bool {
+        match self.rules.get(&variant.variant) {
+            None => false,
+            Some(rule) => {
+                (rule.len() == variant.args.len())
+                    && rule
+                        .iter()
+                        .zip(variant.args.iter().map(|arg| arg.get_type(ctx)))
+                        .all(|(rule, arg)| arg.coercible_to(rule))
+            }
+        }
+    }
+}
diff --git a/src/Rust/vvs_lang/src/ast/visibility.rs b/src/Rust/vvs_lang/src/ast/visibility.rs
new file mode 100644
index 00000000..5d5c88f5
--- /dev/null
+++ b/src/Rust/vvs_lang/src/ast/visibility.rs
@@ -0,0 +1,77 @@
+#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
+pub enum ASTVisibility {
+    #[default]
+    Private,
+    Public,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub enum ASTVisibilityRule {
+    Only(ASTVisibility),
+    AtLeast(ASTVisibility),
+}
+
+impl ASTVisibilityRule {
+    /// Checks if the rule allows to show an item with the specified visibility [ASTVisibility].
+    /// Used to factorize the functions in [crate::ast::ASTModule] and [crate::ast::ASTProgram].
+    #[inline]
+    pub fn allows(&self, vis: ASTVisibility) -> bool {
+        match self {
+            ASTVisibilityRule::Only(this) => vis.eq(this),
+            ASTVisibilityRule::AtLeast(this) => PartialOrd::le(this, &vis),
+        }
+    }
+
+    /// Allows all the visibilities.
+    #[inline]
+    pub fn any() -> Self {
+        Self::AtLeast(ASTVisibility::Private)
+    }
+}
+
+impl Default for ASTVisibilityRule {
+    fn default() -> Self {
+        Self::Only(ASTVisibility::Private)
+    }
+}
+
+impl ASTVisibility {
+    #[inline]
+    pub fn as_str(&self) -> &str {
+        match self {
+            ASTVisibility::Private => "private",
+            ASTVisibility::Public => "public",
+        }
+    }
+}
+
+impl AsRef<str> for ASTVisibility {
+    #[inline]
+    fn as_ref(&self) -> &str {
+        self.as_str()
+    }
+}
+
+#[test]
+fn test_visibility() {
+    assert!(ASTVisibility::Private < ASTVisibility::Public);
+}
+
+#[test]
+fn test_visibility_rules() {
+    use ASTVisibility::*;
+    use ASTVisibilityRule::*;
+
+    assert!(Only(Private).allows(Private));
+    assert!(!Only(Private).allows(Public));
+    assert!(Only(Public).allows(Public));
+    assert!(!Only(Public).allows(Private));
+
+    assert!(AtLeast(Private).allows(Public));
+    assert!(AtLeast(Private).allows(Private));
+    assert!(AtLeast(Public).allows(Public));
+    assert!(!AtLeast(Public).allows(Private));
+
+    assert!(ASTVisibilityRule::any().allows(Public));
+    assert!(ASTVisibilityRule::any().allows(Private));
+}
diff --git a/src/Rust/vvs_lang/src/lib.rs b/src/Rust/vvs_lang/src/lib.rs
index a310c76d..97947b62 100644
--- a/src/Rust/vvs_lang/src/lib.rs
+++ b/src/Rust/vvs_lang/src/lib.rs
@@ -1,2 +1,4 @@
+#![allow(dead_code)]
+
+// Old code, will be purged
 pub mod ast;
-pub mod parser;
diff --git a/src/Rust/vvs_lang/src/parser/error.rs b/src/Rust/vvs_lang/src/parser/error.rs
deleted file mode 100644
index c6a25176..00000000
--- a/src/Rust/vvs_lang/src/parser/error.rs
+++ /dev/null
@@ -1,124 +0,0 @@
-use crate::{ast::ASTSpan, parser::*};
-pub(crate) use nom::error::{ContextError as NomContextError, ParseError as NomParseError};
-use thiserror::Error;
-
-#[macro_export]
-macro_rules! nom_err_error {
-    (vvs: $code: ident $args: tt) => {
-        Err(nom::Err::Error($crate::parser::error::VVError::$code $args))
-    };
-
-    (vvs bare: $code: ident $args: tt) => {
-        nom::Err::Error($crate::parser::error::VVError::$code $args)
-    };
-
-    (nom: $i: expr, $code: ident) => {
-        Err(nom::Err::Error(VVError::from_error_kind(
-            $i,
-            nom::error::ErrorKind::$code,
-        )))
-    };
-
-    (nom bare: $i: expr, $code: ident) => {
-        VVError::from_error_kind($i, nom::error::ErrorKind::$code)
-    };
-}
-pub(crate) use nom_err_error;
-
-#[macro_export]
-macro_rules! nom_err_failure {
-    (vvs: $code: ident $args: tt) => {
-        Err(nom::Err::Failure($crate::parser::error::VVError::$code $args))
-    };
-
-    (vvs bare: $code: ident $args: tt) => {
-        nom::Err::Failure($crate::parser::error::VVError::$code $args)
-    };
-
-    (nom: $i: expr, $code: ident) => {
-        Err(nom::Err::Failure(VVError::from_error_kind(
-            $i,
-            nom::error::ErrorKind::$code,
-        )))
-    };
-
-    (nom bare: $i: expr, $code: ident) => {
-        VVError::from_error_kind($i, nom::error::ErrorKind::$code)
-    };
-}
-pub(crate) use nom_err_failure;
-
-#[derive(Debug, Error, PartialEq, Eq)]
-pub enum VVError {
-    #[error("got an error from nom at {0}: {1:?}")]
-    Nom(ASTSpan, nom::error::ErrorKind),
-
-    #[error("got a nom error needed error at {0}: {1:?}")]
-    NomNeeded(ASTSpan, nom::Needed),
-
-    #[error("got multiple errors:\n{0:?}")]
-    Multiple(Vec<VVError>),
-
-    #[error("failed to parse an integer at {0}: {1}")]
-    ParseIntError(ASTSpan, std::num::ParseIntError),
-
-    #[error("failed to parse a floating number at {0}: {1}")]
-    ParseFloatError(ASTSpan, std::num::ParseFloatError),
-
-    #[error("failed to get tag `{1}` at {0}")]
-    FailedToGetTag(ASTSpan, &'static str),
-
-    #[error("not an identifier at {0}")]
-    NotAnIdentifier(ASTSpan),
-
-    #[error("table index `{1}` redefined at {0}")]
-    TableIndexRedefined(ASTSpan, ASTString),
-
-    #[error("option `{1}.{2}` at line {} redefined, first definition at {0}", .2.span())]
-    OptionRedefined(ASTSpan, ASTString, ASTVar),
-
-    #[error("error at {0}: {1}")]
-    ErrorMsg(ASTSpan, String),
-}
-
-pub type VVParserError<'a, T> = IResult<PSpan<'a>, T, VVError>;
-pub type VVResult<T> = Result<T, VVError>;
-
-impl<'a> NomContextError<PSpan<'a>> for VVError {}
-
-impl<'a> NomParseError<PSpan<'a>> for VVError {
-    fn from_error_kind(input: PSpan, kind: nom::error::ErrorKind) -> Self {
-        Self::Nom(input.into(), kind)
-    }
-
-    fn append(input: PSpan, kind: nom::error::ErrorKind, other: Self) -> Self {
-        VVError::Multiple(match other {
-            VVError::Multiple(mut other) => {
-                other.push(Self::from_error_kind(input, kind));
-                other
-            }
-            other => vec![other, Self::from_error_kind(input, kind)],
-        })
-    }
-}
-
-impl<'a> nom::error::FromExternalError<PSpan<'a>, std::num::ParseIntError> for VVError {
-    fn from_external_error(input: PSpan<'a>, _: nom::error::ErrorKind, e: std::num::ParseIntError) -> Self {
-        Self::ParseIntError(input.into(), e)
-    }
-}
-
-impl<'a> nom::error::FromExternalError<PSpan<'a>, std::num::ParseFloatError> for VVError {
-    fn from_external_error(input: PSpan<'a>, _: nom::error::ErrorKind, e: std::num::ParseFloatError) -> Self {
-        Self::ParseFloatError(input.into(), e)
-    }
-}
-
-impl<'a> nom::error::FromExternalError<PSpan<'a>, nom::Err<VVError>> for VVError {
-    fn from_external_error(i: PSpan, _: nom::error::ErrorKind, e: nom::Err<VVError>) -> Self {
-        match e {
-            nom::Err::Incomplete(e) => Self::NomNeeded(i.into(), e),
-            nom::Err::Error(e) | nom::Err::Failure(e) => e,
-        }
-    }
-}
diff --git a/src/Rust/vvs_lang/src/parser/mod.rs b/src/Rust/vvs_lang/src/parser/mod.rs
deleted file mode 100644
index 89d575c3..00000000
--- a/src/Rust/vvs_lang/src/parser/mod.rs
+++ /dev/null
@@ -1,110 +0,0 @@
-//! Module responsible to parse the user's code, composed of .VVL files where the jobs are defined
-//! and .VVS files where the global workflow is written explicitly. Some parsing functions are
-//! common between the two parser, those things are expressed here.
-
-mod error;
-mod string;
-mod types;
-
-pub mod vvl;
-pub mod vvs;
-
-use crate::ast::*;
-
-pub(crate) use crate::parser::{error::*, string::string, types::types};
-pub(crate) use nom::{
-    branch::alt,
-    bytes::complete::{is_not, tag, take_while, take_while_m_n},
-    character::{
-        complete::{alpha1, alphanumeric1, char, digit1, multispace0, multispace1},
-        is_alphanumeric,
-    },
-    combinator::{cut, map, map_opt, map_res, opt, peek, recognize, value, verify},
-    error::context,
-    multi::{fold_many0, many0, many0_count, separated_list0, separated_list1},
-    sequence::{delimited, pair, preceded, separated_pair, terminated, tuple},
-    IResult, Parser as NomParser,
-};
-pub(crate) use nom_locate::LocatedSpan;
-pub(crate) use std::{cell::RefCell, rc::Rc};
-
-/// A parser span. Will be converted into an AST span latter.
-type PSpan<'a> = LocatedSpan<&'a str>;
-
-pub(crate) fn with_span<'a, T>(
-    mut cb: impl NomParser<PSpan<'a>, T, VVError>,
-) -> impl FnMut(PSpan<'a>) -> VVParserError<'a, (PSpan<'a>, T)> {
-    move |input: PSpan<'a>| {
-        let (input, _) = multispace0(input)?;
-        let (i, res) = cb.parse(input)?;
-        Ok((i, (input, res)))
-    }
-}
-
-pub(crate) fn spaced_tag<'a>(str: &'static str) -> impl FnMut(PSpan<'a>) -> VVParserError<'a, ()> {
-    delimited(multispace0, map(tag(str), |_| ()), multispace0)
-}
-
-pub(crate) fn keyword<'a>(kw: &'static str) -> impl FnMut(PSpan<'a>) -> VVParserError<'a, ()> {
-    delimited(multispace0, plain_tag(kw), multispace0)
-}
-
-pub(crate) fn plain_tag<'a>(t: &'static str) -> impl FnMut(PSpan<'a>) -> VVParserError<'a, ()> {
-    move |i| {
-        let (input, remain) = take_while(|x| is_alphanumeric(x as u8))(tag(t)(i)?.0)?;
-        remain
-            .is_empty()
-            .then_some((input, ()))
-            .ok_or_else(|| nom_err_error!(vvs bare: FailedToGetTag (i.into(), t)))
-    }
-}
-
-pub(crate) fn number(i: PSpan) -> VVParserError<ASTInteger> {
-    alt((
-        map_res(preceded(opt(tag("+")), digit1), |digit_str: PSpan| {
-            digit_str.parse::<ASTInteger>()
-        }),
-        map_res(preceded(tag("-"), digit1), |digit_str: PSpan| {
-            digit_str.parse::<ASTInteger>().map(|x| -x)
-        }),
-    ))(i)
-}
-
-pub(crate) fn float(i: PSpan) -> VVParserError<ASTFloating> {
-    map(
-        pair(
-            opt(alt((tag("+"), tag("-")))),
-            map_res(recognize(tuple((digit1, tag("."), digit1))), |f: PSpan| {
-                f.fragment().parse::<f32>()
-            }),
-        ),
-        |(sign, value)| {
-            sign.map(|s| if s.starts_with('-') { -value } else { value })
-                .unwrap_or(value)
-        },
-    )(i)
-}
-
-pub(crate) fn identifier(input: PSpan) -> VVParserError<&str> {
-    let (input, _) = multispace0(input)?;
-    let (i, id) = match recognize(pair(
-        alt((alpha1::<PSpan, VVError>, tag("_"))),
-        many0_count(alt((alphanumeric1, tag("_")))),
-    ))(input)
-    {
-        Ok(ok) => ok,
-        Err(_) => return nom_err_error!(vvs: NotAnIdentifier (input.into())),
-    };
-    Ok((i, *id.fragment()))
-}
-
-#[test]
-fn test_floats_and_numbers() {
-    assert_eq!(number("1".into()).unwrap().1, 1);
-    assert_eq!(number("0".into()).unwrap().1, 0);
-    assert_eq!(number("-1".into()).unwrap().1, -1);
-    assert_eq!(float("1.0".into()).unwrap().1, 1.0);
-    assert_eq!(float("0.0".into()).unwrap().1, 0.0);
-    assert_eq!(float("-1.0".into()).unwrap().1, -1.0);
-    assert!(float("1.".into()).is_err());
-}
diff --git a/src/Rust/vvs_lang/src/parser/string.rs b/src/Rust/vvs_lang/src/parser/string.rs
deleted file mode 100644
index 5adb03ff..00000000
--- a/src/Rust/vvs_lang/src/parser/string.rs
+++ /dev/null
@@ -1,99 +0,0 @@
-use super::*;
-
-/// Parse a unicode sequence, of the form u{XXXX}, where XXXX is 1 to 6
-/// hexadecimal numerals. We will combine this later with parse_escaped_char
-/// to parse sequences like \u{00AC}.
-fn parse_unicode(input: PSpan) -> VVParserError<char> {
-    let parse_hex = take_while_m_n(1, 6, |c: char| c.is_ascii_hexdigit());
-    let parse_delimited_hex = preceded(char('u'), delimited(char('{'), parse_hex, char('}')));
-    let parse_u32 = map_res(parse_delimited_hex, move |hex: PSpan| {
-        u32::from_str_radix(hex.fragment(), 16)
-    });
-    map_opt(parse_u32, std::char::from_u32)(input)
-}
-
-/// Parse an escaped character: \n, \t, \r, \u{00AC}, etc.
-fn parse_escaped_char(input: PSpan) -> VVParserError<char> {
-    preceded(
-        char('\\'),
-        alt((
-            parse_unicode,
-            value('\n', char('n')),
-            value('\r', char('r')),
-            value('\t', char('t')),
-            value('\u{08}', char('b')),
-            value('\u{0C}', char('f')),
-            value('\\', char('\\')),
-            value('/', char('/')),
-            value('"', char('"')),
-        )),
-    )
-    .parse(input)
-}
-
-/// Parse a backslash, followed by any amount of whitespace. This is used later
-/// to discard any escaped whitespace.
-fn parse_escaped_whitespace(input: PSpan) -> VVParserError<&str> {
-    let (i, str) = preceded(char('\\'), multispace1)(input)?;
-    Ok((i, str.fragment()))
-}
-
-/// Parse a non-empty block of text that doesn't include \ or "
-fn parse_literal(input: PSpan) -> VVParserError<&str> {
-    verify(map(is_not("\"\\"), |str: PSpan| *str.fragment()), |s: &str| {
-        !s.is_empty()
-    })(input)
-}
-
-/// A string fragment contains a fragment of a string being parsed: either
-/// a non-empty Literal (a series of non-escaped characters), a single
-/// parsed escaped character, or a block of escaped whitespace.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-enum StringFragment<'a> {
-    Literal(&'a str),
-    EscapedChar(char),
-    EscapedWS,
-}
-
-/// Combine parse_literal, parse_escaped_whitespace, and parse_escaped_char
-/// into a StringFragment.
-fn parse_fragment(input: PSpan) -> VVParserError<StringFragment> {
-    alt((
-        map(parse_literal, StringFragment::Literal),
-        map(parse_escaped_char, StringFragment::EscapedChar),
-        value(StringFragment::EscapedWS, parse_escaped_whitespace),
-    ))
-    .parse(input)
-}
-
-/// Parse a string. Use a loop of parse_fragment and push all of the fragments
-/// into an output string.
-pub(crate) fn string(input: PSpan) -> VVParserError<String> {
-    let build_string = fold_many0(parse_fragment, String::new, |mut string, fragment| {
-        match fragment {
-            StringFragment::Literal(s) => string.push_str(s),
-            StringFragment::EscapedChar(c) => string.push(c),
-            StringFragment::EscapedWS => {}
-        }
-        string
-    });
-    delimited(char('"'), build_string, char('"')).parse(input)
-}
-
-#[test]
-fn test_parse_string() {
-    use vvs_utils::assert_err;
-    let data = "\"abc\"";
-    let result = string(data.into());
-    assert_eq!(result.unwrap().1, String::from("abc"));
-
-    let data = "\"tab:\\tafter tab, newline:\\nnew line, quote: \\\", emoji: \\u{1F602}, newline:\\nescaped whitespace: \\    abc\"";
-    let result = string(data.into());
-    assert_eq!(
-        result.unwrap().1,
-        String::from("tab:\tafter tab, newline:\nnew line, quote: \", emoji: 😂, newline:\nescaped whitespace: abc")
-    );
-
-    // Don't do single quotes for now.
-    assert_err!(string("\'abc\'".into()));
-}
diff --git a/src/Rust/vvs_lang/src/parser/types.rs b/src/Rust/vvs_lang/src/parser/types.rs
deleted file mode 100644
index dffdfff7..00000000
--- a/src/Rust/vvs_lang/src/parser/types.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-use super::*;
-
-pub(crate) fn types(input: PSpan) -> VVParserError<ASTType> {
-    todo!()
-}
diff --git a/src/Rust/vvs_lang/src/parser/vvl.rs b/src/Rust/vvs_lang/src/parser/vvl.rs
deleted file mode 100644
index 4ca6daba..00000000
--- a/src/Rust/vvs_lang/src/parser/vvl.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-//! Module responsible to parse .VVL files, the files where the code is defined.
-
-mod expr;
-mod inst;
-mod tabl;
-mod tupl;
-
-use self::{expr::expr, inst::instruction, tabl::table, tupl::any_tuple};
-use crate::{ast::*, parser::*};
diff --git a/src/Rust/vvs_lang/src/parser/vvl/expr.rs b/src/Rust/vvs_lang/src/parser/vvl/expr.rs
deleted file mode 100644
index cd7fbfe7..00000000
--- a/src/Rust/vvs_lang/src/parser/vvl/expr.rs
+++ /dev/null
@@ -1,237 +0,0 @@
-use crate::{ast::*, expression, parser::vvl::*};
-use vvs_utils::either;
-
-#[allow(dead_code)]
-pub(crate) fn expr<'a, 'b>(
-    cache: Rc<RefCell<ASTStringCacheHandle<'b>>>,
-) -> impl Fn(PSpan<'a>) -> VVParserError<'a, ASTExpr> + 'b
-where
-    'b: 'a,
-{
-    macro_rules! expr {
-        // No binary expression, parse a unary expression or something else, here we have reached
-        // the leaf of the tree. We are parsing some things, but we still need to handle more things:
-        // - tuples
-        // Stil need to write some tests!
-        () => {
-            |cache: Rc<RefCell<ASTStringCacheHandle<'b>>>| { move |input| -> VVParserError<'a, ASTExpr> {
-                let (input, _) = multispace0(input)?;
-                let (i, (rvalue, indices, method, args)) = context("expr leaf", tuple((
-                    // Final leaf for the expression tree.
-                    alt((
-                        delimited(spaced_tag("("), expr(cache.clone()), spaced_tag(")")),
-                        map(with_span(preceded(tag("$"), number)),                     |(sp, c)| expression! { sp, Const(ASTConst::Color(c)) }),
-                        map(with_span(keyword("true")),                                |(sp, _)| expression! { sp, True  }),
-                        map(with_span(keyword("false")),                               |(sp, _)| expression! { sp, False }),
-                        map(with_span(keyword("nil")),                                 |(sp, _)| expression! { sp, Nil   }),
-                        map(with_span(preceded(keyword("not"),  expr(cache.clone()))), |(sp, e)| expression! { sp, Unop(ASTUnop::LogicNot, Box::new(e)) }),
-                        map(with_span(preceded(spaced_tag("#"), expr(cache.clone()))), |(sp, e)| expression! { sp, Unop(ASTUnop::Len,      Box::new(e)) }),
-                        map(with_span(preceded(spaced_tag("-"), expr(cache.clone()))), |(sp, e)| expression! { sp, Unop(ASTUnop::Neg,      Box::new(e)) }),
-                        map(with_span(preceded(spaced_tag("~"), expr(cache.clone()))), |(sp, e)| expression! { sp, Unop(ASTUnop::BitNot,   Box::new(e)) }),
-                        map(with_span(identifier),                                     |(sp, n)| expression! { sp, Var(ASTVar(sp.into(), cache.borrow_mut().get_or_insert(n), None)) }),
-                        map(with_span(string),                                         |(sp, s)| expression! { sp, Const(ASTConst::String(cache.borrow_mut().get_or_insert(s)))      }),
-                        map(with_span(float),                                          |(sp, f)| expression! { sp, Const(ASTConst::Floating(f)) }),
-                        map(with_span(number),                                         |(sp, i)| expression! { sp, Const(ASTConst::Integer(i))  }),
-                        map(with_span(table(cache.clone())),                           |(sp, t)| expression! { sp, Table(t) }),
-                        map(with_span(any_tuple(cache.clone())),                       |(sp, t)| expression! { sp, Tuple(t) }),
-                    )),
-                    // Do we need to index into the thing?
-                    many0(alt((
-                        map(delimited(spaced_tag("["), expr(cache.clone()), spaced_tag("]")), |expr| ASTField::Expr(expr.span, expr.content)),
-                        map(with_span(preceded(spaced_tag("."), identifier)), |(span, field)| ASTField::Identifier(span.into(), cache.borrow_mut().get_or_insert(field))),
-                    ))),
-                    // Function call and method invoking stuff
-                    opt(preceded(spaced_tag(":"), identifier)),
-                    opt(delimited(spaced_tag("("), separated_list0(spaced_tag(","), expr(cache.clone())), spaced_tag(")"))),
-                )))(input)?;
-                // Build an expression from the rvalue
-                let expr = either!(!indices.is_empty()
-                    => expression! { input, PrefixExpr(Box::new(rvalue), indices) }
-                    ;  rvalue
-                );
-                // Some logic to handle the call function/method thing
-                let expr = match (method, args) {
-                    (Some(func), Some(args)) => expression! { input, MethodInvok(Box::new(expr), cache.borrow_mut().get_or_insert(func), args) },
-                    (None,       Some(args)) => expression! { input, FuncCall(Box::new(expr), args) },
-                    (Some(_),    None) => todo!("a method invokation without arguments, should return the function with the first argument bounded"),
-                    (None,       None) => expr,
-                };
-                Ok((i, expr))
-            }}
-        };
-
-        // We are in a node of a binary expression. The binary operator can be a keyword or a
-        // symbol list, need to handle those two cases differently.
-        ( $(($str: literal, $op: ident)),+
-          $(; $(($strs: literal, $ops: ident)),+)*
-          $(;)?
-        ) => {
-            |cache: Rc<RefCell<ASTStringCacheHandle<'b>>>| { move |i| -> VVParserError<'a, ASTExpr> {
-                let (input, _) = multispace0(i)?;
-                let next_clozure = expr!($($(($strs, $ops)),+);*);
-                let next_clozure = next_clozure(cache.clone());
-                let (i, initial) = next_clozure(input)?;
-                let (i, _) = multispace0(i)?;
-                let (i, remainder) = many0(alt(($(
-                    |i| -> VVParserError<(ASTBinop, ASTExpr)> {
-                        let (i, item) = either! { $str.chars().next().unwrap().is_ascii_alphabetic()
-                            => preceded(keyword($str), preceded(multispace0, next_clozure.clone()))(i)?
-                            ;  preceded(tag($str),     preceded(multispace0, next_clozure.clone()))(i)?
-                        };
-                        Ok((i, (ASTBinop::$op, item)))
-                    }
-                ),+,)))(i)?;
-                Ok((i, remainder.into_iter().fold(initial, |acc, (oper, expr)| expression! {
-                    ASTSpan::merge(acc.span, expr.span),
-                    Binop(Box::new(acc), oper, Box::new(expr))
-                })))
-            }}
-        };
-    }
-
-    let expr = expr! [ /* 12 */ ("|",   BitOr)
-                     ; /* 11 */ ("^",   BitXor)
-                     ; /* 10 */ ("&",   BitAnd)
-                     ; /* 09 */ ("or",  LogicOr)
-                     ; /* 08 */ ("xor", LogicXor)
-                     ; /* 07 */ ("and", LogicAnd)
-                     ; /* 06 */ ("==",  CmpEQ), ("~=", CmpNE), ("!=", CmpNE)
-                     ; /* 05 */ ("<=",  CmpLE), ("<",  CmpLT), (">=", CmpGE), (">", CmpGT)
-                     ; /* 04 */ ("..",  StrCat)
-                     ; /* 03 */ ("<<",  BitShiftLeft), (">>", BitShiftRight)
-                     ; /* 02 */ ("+",   Add), ("-", Sub)
-                     ; /* 01 */ ("*",   Mul), ("/", Div), ("%", Mod), ("mod", Mod)
-                     ; /* 00 */ ("**",  Power)
-    ];
-
-    expr(cache)
-}
-
-#[test]
-fn test_arithmetic() {
-    use crate::{anon_expression, ast::ASTBinop::*};
-    use hashbrown::HashMap;
-    let strings = Rc::<RefCell<HashMap<u64, ASTString>>>::default();
-    let expr = expr(Rc::new(RefCell::new(ASTStringCacheHandle::new(strings.borrow_mut()))));
-    let expr = move |str: &'static str| expr(str.into());
-
-    assert_eq!(
-        expr("1+2*3").unwrap().1,
-        anon_expression!(Binop(
-            Box::new(anon_expression!(Const(ASTConst::Integer(1)))),
-            Add,
-            Box::new(anon_expression!(Binop(
-                Box::new(anon_expression!(Const(ASTConst::Integer(2)))),
-                Mul,
-                Box::new(anon_expression!(Const(ASTConst::Integer(3))))
-            )))
-        ))
-    );
-    assert_eq!(
-        expr("2*3+1").unwrap().1,
-        anon_expression!(Binop(
-            Box::new(anon_expression!(Binop(
-                Box::new(anon_expression!(Const(ASTConst::Integer(2)))),
-                Mul,
-                Box::new(anon_expression!(Const(ASTConst::Integer(3))))
-            ))),
-            Add,
-            Box::new(anon_expression!(Const(ASTConst::Integer(1)))),
-        ))
-    );
-}
-
-#[test]
-fn test_valid_table() {
-    use crate::{anon_expression, ast::*};
-    use hashbrown::HashMap;
-    use vvs_utils::{assert_ok, assert_some};
-    let strings = Rc::<RefCell<HashMap<u64, ASTString>>>::default();
-    let table = expr(Rc::new(RefCell::new(ASTStringCacheHandle::new(strings.borrow_mut()))));
-    let table = move |str: &'static str| table(str.into());
-    let table = assert_ok!(table(
-        r#"{ toto = "tata", foo = 3.14, ["bar"] = 42, titi = {}, oupsy = nil }"#
-    ));
-
-    let table = match table.1.content {
-        ASTExprVariant::Table(table) => table,
-        expr => panic!("should be a table, got {expr:#?}"),
-    };
-
-    assert_eq!(
-        assert_some!(table.get("toto")).content,
-        anon_expression!(Const(ASTConst::String("tata".into()))).content
-    );
-
-    assert_eq!(
-        assert_some!(table.get("foo")).content,
-        anon_expression!(Const(ASTConst::Floating(3.14))).content
-    );
-
-    assert_eq!(
-        assert_some!(table.get("bar")).content,
-        anon_expression!(Const(ASTConst::Integer(42))).content
-    );
-
-    assert_eq!(
-        assert_some!(table.get("titi")).content,
-        anon_expression!(Table(HashMap::default())).content
-    );
-
-    assert_eq!(
-        assert_some!(table.get("oupsy")).content,
-        anon_expression!(Nil).content
-    );
-}
-
-#[test]
-fn test_redefined_key_table() {
-    use crate::ast::*;
-    use hashbrown::HashMap;
-    use vvs_utils::assert_err;
-    let strings = Rc::<RefCell<HashMap<u64, ASTString>>>::default();
-    let table = expr(Rc::new(RefCell::new(ASTStringCacheHandle::new(strings.borrow_mut()))));
-    let table = move |str: &'static str| table(str.into());
-    assert_err!(table(r#"{ toto = "tata", toto = nil }"#));
-}
-
-#[test]
-fn test_tuple_invalid() {
-    use crate::ast::*;
-    use hashbrown::HashMap;
-    use vvs_utils::assert_err;
-    let strings = Rc::<RefCell<HashMap<u64, ASTString>>>::default();
-    let expr = expr(Rc::new(RefCell::new(ASTStringCacheHandle::new(strings.borrow_mut()))));
-    let expr = move |str: &'static str| expr(str.into());
-    match expr(r#""a", "b", "c""#) {
-        Ok((i, expr)) if i.is_empty() => panic!("successfully parsed {expr:#?}"),
-        _ => {}
-    }
-    assert_err!(expr("(1,)"));
-}
-
-#[test]
-fn test_tuple() {
-    use crate::{anon_expression, ast::*};
-    use hashbrown::HashMap;
-    use vvs_utils::assert_ok;
-    let strings = Rc::<RefCell<HashMap<u64, ASTString>>>::default();
-    let expr = expr(Rc::new(RefCell::new(ASTStringCacheHandle::new(strings.borrow_mut()))));
-    let expr = move |str: &'static str| expr(str.into());
-    assert_eq!(
-        assert_ok!(expr("(1, 2, 3, 4)")).1,
-        anon_expression!(Tuple(vec![
-            anon_expression!(Const(ASTConst::Integer(1))),
-            anon_expression!(Const(ASTConst::Integer(2))),
-            anon_expression!(Const(ASTConst::Integer(3))),
-            anon_expression!(Const(ASTConst::Integer(4))),
-        ]))
-    );
-    assert_eq!(
-        assert_ok!(expr("(1, 2,)")).1,
-        anon_expression!(Tuple(vec![
-            anon_expression!(Const(ASTConst::Integer(1))),
-            anon_expression!(Const(ASTConst::Integer(2))),
-        ]))
-    );
-}
diff --git a/src/Rust/vvs_lang/src/parser/vvl/inst.rs b/src/Rust/vvs_lang/src/parser/vvl/inst.rs
deleted file mode 100644
index 4699bcaf..00000000
--- a/src/Rust/vvs_lang/src/parser/vvl/inst.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-use crate::{ast::*, instruction, parser::vvl::*};
-
-pub(crate) fn do_end_block<'a, 'b>(
-    r#do: &'static str,
-    end: &'static str,
-    cache: Rc<RefCell<ASTStringCacheHandle<'b>>>,
-) -> impl Fn(PSpan<'a>) -> VVParserError<'a, Vec<ASTInstr>> + 'b
-where
-    'b: 'a,
-{
-    move |input| {
-        let (input, _) = multispace0(input)?;
-        delimited(keyword(r#do), many0(instruction(cache.clone())), keyword(end))(input)
-    }
-}
-
-#[allow(dead_code)]
-pub(crate) fn instruction<'a, 'b>(
-    cache: Rc<RefCell<ASTStringCacheHandle<'b>>>,
-) -> impl Fn(PSpan<'a>) -> VVParserError<'a, ASTInstr> + 'b
-where
-    'b: 'a,
-{
-    move |input| {
-        let (input, _) = multispace0(input)?;
-        terminated(
-            alt((
-                // Break/Continue loops
-                map(with_span(keyword("break")), |(sp, _)| instruction!(sp, Break)),
-                map(with_span(keyword("continue")), |(sp, _)| instruction!(sp, Continue)),
-                // Variable assignation. Don't do the destructuring for now.
-                map(
-                    with_span(separated_pair(
-                        expr(cache.clone()),
-                        spaced_tag("="),
-                        expr(cache.clone()),
-                    )),
-                    |(sp, (dest, src))| instruction!(sp, Assign(vec![dest], vec![src])),
-                ),
-                // Variable declaration. Don't do the destructuring for now.
-                map(
-                    with_span(tuple((
-                        keyword("let"),
-                        identifier,
-                        opt(types),
-                        spaced_tag("="),
-                        expr(cache.clone()),
-                    ))),
-                    |(sp, (_, name, ty, _, decl))| {
-                        let var = ASTVar(sp.into(), cache.borrow_mut().get_or_insert(name), ty);
-                        instruction!(sp, Decl(vec![var], vec![decl]))
-                    },
-                ),
-                // A do-end block with a list of instructions inside it.
-                map(with_span(do_end_block("do", "end", cache.clone())), |(sp, body)| {
-                    instruction!(sp, Block(body))
-                }),
-                // While loop.
-                map(
-                    with_span(pair(
-                        preceded(keyword("while"), expr(cache.clone())),
-                        do_end_block("do", "end", cache.clone()),
-                    )),
-                    |(sp, (cond, body))| instruction!(sp, WhileDo(cond, body)),
-                ),
-                // A DoWhile block (or a reapeat until in lua...)
-                map(
-                    with_span(pair(do_end_block("do", "until", cache.clone()), expr(cache.clone()))),
-                    |(sp, (body, cond))| instruction!(sp, RepeatUntil(cond, body)),
-                ),
-            )),
-            // We may terminate with a semicolon
-            opt(spaced_tag(";")),
-        )(input)
-    }
-}
diff --git a/src/Rust/vvs_lang/src/parser/vvl/tabl.rs b/src/Rust/vvs_lang/src/parser/vvl/tabl.rs
deleted file mode 100644
index 25f8d36d..00000000
--- a/src/Rust/vvs_lang/src/parser/vvl/tabl.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-use super::*;
-use hashbrown::HashMap;
-
-/// Parses the keys in tables or returns an error. Keys can be identifiers or a string between
-/// square braquets: `[`, `]`.
-fn key<'a, 'b>(cache: Rc<RefCell<ASTStringCacheHandle<'b>>>) -> impl Fn(PSpan<'a>) -> VVParserError<'a, ASTString> + 'b
-where
-    'b: 'a,
-{
-    move |input: PSpan| -> VVParserError<ASTString> {
-        let (input, _) = multispace0(input)?;
-        alt((
-            map(delimited(spaced_tag("["), string, spaced_tag("]")), |str| {
-                cache.borrow_mut().get_or_insert(str)
-            }),
-            map(identifier, |str| cache.borrow_mut().get_or_insert(str)),
-        ))(input)
-    }
-}
-
-/// Parses a separator for key value pairs for the table parser. In Lua separators can be `,` or
-/// `;` for some reasons...
-fn separator(input: PSpan) -> VVParserError<()> {
-    alt((spaced_tag(","), spaced_tag(";")))(input)
-}
-
-/// Parses a table or returns an error.
-pub(crate) fn table<'a, 'b>(
-    cache: Rc<RefCell<ASTStringCacheHandle<'b>>>,
-) -> impl Fn(PSpan<'a>) -> VVParserError<'a, ASTTable<ASTExpr>> + 'b
-where
-    'b: 'a,
-{
-    move |input| {
-        let (input, _) = multispace0(input)?;
-        let table_key_value_pair = separated_pair(key(cache.clone()), spaced_tag("="), expr(cache.clone()));
-        let (i, content) = context(
-            "table",
-            delimited(
-                spaced_tag("{"),
-                separated_list0(separator, table_key_value_pair),
-                preceded(opt(separator), spaced_tag("}")),
-            ),
-        )(input)?;
-        let hashmap = HashMap::with_capacity(content.len());
-        let hashmap = content.into_iter().try_fold(hashmap, |mut hashmap, (key, value)| {
-            if hashmap.contains_key(&key) {
-                nom_err_error!(vvs: TableIndexRedefined (value.span, key))
-            } else {
-                hashmap.insert(key, value);
-                Ok(hashmap)
-            }
-        })?;
-        Ok((i, hashmap))
-    }
-}
diff --git a/src/Rust/vvs_lang/src/parser/vvl/tupl.rs b/src/Rust/vvs_lang/src/parser/vvl/tupl.rs
deleted file mode 100644
index 9bd32b63..00000000
--- a/src/Rust/vvs_lang/src/parser/vvl/tupl.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-use super::*;
-
-/// Unlike Lua, we require parens (`(` `)`) around tuples.
-pub(crate) fn any_tuple<'a, 'b>(
-    cache: Rc<RefCell<ASTStringCacheHandle<'b>>>,
-) -> impl Fn(PSpan<'a>) -> VVParserError<'a, Vec<ASTExpr>> + 'b
-where
-    'b: 'a,
-{
-    move |input| {
-        let (input, _) = multispace0(input)?;
-        let (i, (head, mut tail)) = delimited(
-            spaced_tag("("),
-            separated_pair(
-                expr(cache.clone()),
-                spaced_tag(","),
-                separated_list1(spaced_tag(","), expr(cache.clone())),
-            ),
-            preceded(opt(spaced_tag(",")), spaced_tag(")")),
-        )(input)?;
-        tail.insert(0, head);
-        Ok((i, tail))
-    }
-}
diff --git a/src/Rust/vvs_lang/src/parser/vvs.rs b/src/Rust/vvs_lang/src/parser/vvs.rs
deleted file mode 100644
index 72701747..00000000
--- a/src/Rust/vvs_lang/src/parser/vvs.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-//! Module responsible to parse .VVS files, the files where jobs from .VVS files are composed and
-//! where the global workflow of the script is written by the user.
-
-use std::path::Path;
-
-use crate::{ast::*, parser::*};
-
-/// Parses the content of a file.
-pub fn parse_vvs<'a>(_: impl AsRef<str> + 'a) -> VVParserError<'a, Program> {
-    todo!()
-}
-
-/// Parses a file.
-pub fn parse_vvs_file(_: impl AsRef<Path>) -> VVResult<Program> {
-    todo!()
-}
diff --git a/src/Rust/vvs_lib/Cargo.toml b/src/Rust/vvs_lib/Cargo.toml
new file mode 100644
index 00000000..0285744a
--- /dev/null
+++ b/src/Rust/vvs_lib/Cargo.toml
@@ -0,0 +1,22 @@
+[package]
+name              = "vvs_lib"
+description       = "A C library to expose functionalities to C/C++"
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+
+[lib]
+name       = "vivy"
+crate-type = ["staticlib"]
+
+[dependencies]
+log.workspace        = true
+serde.workspace      = true
+hashbrown.workspace  = true
+serde_json.workspace = true
+
+vvs_ass.workspace = true
+
+[build-dependencies]
+cbindgen.workspace = true
diff --git a/src/Rust/vvs_lib/build.rs b/src/Rust/vvs_lib/build.rs
new file mode 100644
index 00000000..66862fd6
--- /dev/null
+++ b/src/Rust/vvs_lib/build.rs
@@ -0,0 +1,24 @@
+use cbindgen::{Braces, Language, Style};
+
+fn main() {
+    cbindgen::Builder::new()
+        .with_crate(std::env::var("CARGO_MANIFEST_DIR").unwrap())
+        .with_parse_deps(true)
+        .with_parse_include(&["vvs_ass"])
+        .with_documentation(true)
+        .with_header("/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */")
+        .with_language(Language::C)
+        .with_no_includes()
+        .with_sys_include("inttypes.h")
+        .with_include_version(true)
+        .with_line_length(120)
+        .with_style(Style::Both)
+        .with_cpp_compat(true)
+        .with_pragma_once(true)
+        .with_namespaces(&["VVLib", "C"])
+        .with_tab_width(4)
+        .with_braces(Braces::NextLine)
+        .generate()
+        .expect("Failed to generate config")
+        .write_to_file("../VVLib.h");
+}
diff --git a/src/Rust/vvs_lib/src/ass_elements.rs b/src/Rust/vvs_lib/src/ass_elements.rs
new file mode 100644
index 00000000..aed62993
--- /dev/null
+++ b/src/Rust/vvs_lib/src/ass_elements.rs
@@ -0,0 +1,191 @@
+//! Contains wrappers for the container, the line, syllabes, etc...
+#![allow(clippy::missing_safety_doc)]
+
+use crate::{AuxTable, StringSlice};
+use alloc::{boxed::Box, vec::Vec};
+use core::{
+    ffi::{c_char, CStr},
+    mem,
+    ptr::{self, NonNull},
+};
+use vvs_ass::{ass_container_from_file, ASSStyle};
+
+/// Wraps the container that holds all the content of the ASS file / Vivy file.
+pub struct ASSContainer(vvs_ass::ASSContainer<AuxTable>);
+
+/// Wraps a line in an ASS file.
+pub struct ASSLine(vvs_ass::ASSLine<AuxTable>);
+
+/// Wraps syllabes, contained in lines in ASS files.
+pub struct ASSSyllabe(vvs_ass::ASSSyllabe<AuxTable>);
+
+/// Get the number of lines in the container.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSContainerGetLinesCount(this: *const ASSContainer) -> i32 { (*this).0.lines.len() as i32 }
+
+/// Get the number of syllabes in the line.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSLineGetSyllabesCount(this: *const ASSLine) -> i32 { (*this).0.content.len() as i32 }
+
+/// Get a line by its number in the container.
+#[no_mangle]
+pub unsafe extern "C" fn ASSContainerGetLineAt(this: *mut ASSContainer, idx: i32) -> *mut ASSLine {
+    let line = (*this).0.lines.get_mut(idx as usize).map(|l| l as *mut _ as *mut _);
+    line.unwrap_or_else(|| {
+        log::error!("failed to get line n°{idx}");
+        core::ptr::null_mut()
+    })
+}
+
+/// Get a syllabe in a line by its index.
+#[no_mangle]
+pub unsafe extern "C" fn ASSLineGetSyllabeAt(this: *mut ASSLine, idx: i32) -> *mut ASSSyllabe {
+    let syl = (*this).0.content.get_mut(idx as usize).map(|s| s as *mut _ as *mut _);
+    syl.unwrap_or_else(|| {
+        log::error!("failed to get syllabe n°{idx}");
+        core::ptr::null_mut()
+    })
+}
+
+/// Tells whever a line is commented or not.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSLineIsCommented(this: *const ASSLine) -> bool { (*this).0.is_comment }
+
+/// Gets the style of the line, or 'Default' if it was not found/specified.
+#[no_mangle]
+pub unsafe extern "C" fn ASSLineGetStyle<'a>(this: *const ASSLine) -> StringSlice<'a> {
+    match (*this).0.aux.0.get("style") {
+        Some(str) => StringSlice::from(str),
+        _ => StringSlice::from("Default"),
+    }
+}
+
+/// Get the content of a syllabe.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSSyllabeGetContent<'a>(this: *const ASSSyllabe) -> StringSlice<'a> { StringSlice::from(&(*this).0.content) }
+
+/// Get the duration of a syllabe.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSSyllabeGetDuration(this: *const ASSSyllabe) -> i32 { (*this).0.fini.saturating_sub((*this).0.start) }
+
+/// Get the start of a syllabe.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSSyllabeGetStartTime(this: *const ASSSyllabe) -> i32 { (*this).0.start }
+
+/// Get the end time of a syllabe.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSSyllabeGetFiniTime(this: *const ASSSyllabe) -> i32 { (*this).0.fini }
+
+/// Set the duration of a syllabe.
+#[no_mangle]
+pub unsafe extern "C" fn ASSSyllabeSetDuration(this: *mut ASSSyllabe, duration: i32) {
+    (*this).0.fini = (*this).0.start.saturating_add(duration);
+}
+
+/// Set the start of a syllabe.
+#[no_mangle]
+pub unsafe extern "C" fn ASSSyllabeSetStartTime(this: *mut ASSSyllabe, time: i32) {
+    (*this).0.start = time;
+    (*this).0.fini = (*this).0.fini.max(time);
+}
+
+/// Set the end of a syllabe.
+#[no_mangle]
+pub unsafe extern "C" fn ASSSyllabeSetFiniTime(this: *mut ASSSyllabe, time: i32) {
+    (*this).0.fini = time;
+    (*this).0.start = (*this).0.fini.min(time);
+}
+
+/// Load the ASS from a file, returns nullptr if an error was encountred.
+#[no_mangle]
+pub unsafe extern "C" fn ASSContainerFromFile(path: NonNull<c_char>) -> *mut ASSContainer {
+    let container = CStr::from_ptr(path.as_ptr() as *const _).to_str().map(|path| {
+        ass_container_from_file(path)
+            .map(|ass: vvs_ass::ASSContainer<AuxTable>| Box::into_raw(Box::new(ass)) as *mut ASSContainer)
+            .map_err(|err| log::error!("failed to load file: {err}"))
+    });
+    match container.inspect_err(|err| log::error!("invalid utf8 filename: {err}")) {
+        Ok(Ok(container)) => container,
+        _ => ptr::null_mut(),
+    }
+}
+
+/// Get a style out of the container by its name.
+#[no_mangle]
+pub unsafe extern "C" fn ASSContainerGetStyleByName(this: *mut ASSContainer, name: StringSlice) -> *mut ASSStyle {
+    let style = (*this).0.styles.get_mut(name.as_str()).map(|s| s as *mut _);
+    style.unwrap_or_else(|| {
+        log::error!("no sytle `{}` in ass container", name.as_str());
+        core::ptr::null_mut()
+    })
+}
+
+/// Get the name of a style by its position.
+#[no_mangle]
+pub unsafe extern "C" fn ASSContainerGetStyleNameAt<'a>(this: *const ASSContainer, idx: i32) -> StringSlice<'a> {
+    let mut keys: Vec<_> = (*this).0.styles.keys().collect();
+    keys.sort();
+    keys.get(idx as usize)
+        .map(StringSlice::from)
+        .unwrap_or_else(|| StringSlice::from("Default"))
+}
+
+/// Get the number of styles in the container.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSContainerGetStylesCount(this: *const ASSContainer) -> i32 { (*this).0.styles.len() as i32 }
+
+/// Set the start time of the line.
+#[no_mangle]
+pub unsafe extern "C" fn ASSLineSetStartTime(this: *mut ASSLine, time: i32) {
+    (*this).0.start = time;
+    (*this).0.fini = (*this).0.fini.max(time);
+    for syl in &mut (*this).0.content {
+        syl.start = syl.start.max(time);
+        syl.fini = syl.fini.max(time);
+    }
+}
+
+/// Set the end time of a line.
+#[no_mangle]
+pub unsafe extern "C" fn ASSLineSetFiniTime(this: *mut ASSLine, time: i32) {
+    (*this).0.fini = time;
+    (*this).0.start = (*this).0.start.min(time);
+    for syl in &mut (*this).0.content {
+        syl.start = syl.start.min(time);
+        syl.fini = syl.fini.min(time);
+    }
+}
+
+/// Get the duration of a line.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSLineGetDuration(this: *const ASSLine) -> i32 { (*this).0.fini.saturating_sub((*this).0.start) }
+
+/// Set the duration of a line.
+#[no_mangle]
+pub unsafe extern "C" fn ASSLineSetDuration(this: *mut ASSLine, duration: i32) {
+    (*this).0.fini = (*this).0.start.saturating_add(duration);
+}
+
+/// Get the start time of a line.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSLineGetStartTime(this: *const ASSLine) -> i32 { (*this).0.start }
+
+/// Get the end time of a line.
+#[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ASSLineGetFiniTime(this: *const ASSLine) -> i32 { (*this).0.fini }
+
+/// Drop the container. It is file to pass a null pointer to this function.
+#[no_mangle]
+pub unsafe extern "C" fn ASSContainerDrop(this: *mut ASSContainer) {
+    #[allow(dead_code)]
+    const ASSERT_STRUCT_SIZES: () = {
+        macro_rules! assert_sizes {
+            ($ty: ident) => {
+                assert!(
+                    mem::size_of::<$ty>() == mem::size_of::<vvs_ass::$ty<AuxTable>>(),
+                    concat!("invalid sizes for ", stringify!($ty), " wrapper")
+                );
+                assert!(
+                    mem::align_of::<$ty>() == mem::align_of::<vvs_ass::$ty<AuxTable>>(),
+                    concat!("invalid alignements for ", stringify!($ty), " wrapper")
+                );
+            };
+        }
+        assert_sizes!(ASSContainer);
+        assert_sizes!(ASSLine);
+        assert_sizes!(ASSSyllabe);
+    };
+
+    if !this.is_null() {
+        drop(unsafe { Box::from_raw(this) });
+    }
+}
diff --git a/src/Rust/vvs_lib/src/ass_style.rs b/src/Rust/vvs_lib/src/ass_style.rs
new file mode 100644
index 00000000..a67fbdbd
--- /dev/null
+++ b/src/Rust/vvs_lib/src/ass_style.rs
@@ -0,0 +1,13 @@
+//! Contains wrappers for the styles.
+
+use crate::StringSlice;
+use vvs_ass::ASSStyle;
+
+/// Get the name of the style.
+///
+/// # Safety
+/// It is up to the user to ensure that the style is not dropped before the returned pointer.
+#[no_mangle]
+pub extern "C" fn ASSStyleGetName(this: &ASSStyle) -> StringSlice {
+    StringSlice::from(&this.name)
+}
diff --git a/src/Rust/vvs_lib/src/aux_table.rs b/src/Rust/vvs_lib/src/aux_table.rs
new file mode 100644
index 00000000..f5f853dc
--- /dev/null
+++ b/src/Rust/vvs_lib/src/aux_table.rs
@@ -0,0 +1,10 @@
+use alloc::string::String;
+
+#[derive(Debug, Clone, Default, PartialEq)]
+pub struct AuxTable(pub(crate) hashbrown::HashMap<String, String>);
+
+impl vvs_ass::AuxTable for AuxTable {
+    fn deep_clone(&self) -> Self {
+        Self(self.0.clone())
+    }
+}
diff --git a/src/Rust/vvs_lib/src/lib.rs b/src/Rust/vvs_lib/src/lib.rs
new file mode 100644
index 00000000..e1e35aa4
--- /dev/null
+++ b/src/Rust/vvs_lib/src/lib.rs
@@ -0,0 +1,49 @@
+//! Here we define the things that will be exported to C/C++ code. We use PascalCase as it is not
+//! very common and getters must be of the form `{StructName}{Get,Set}{TheField}` and methods of
+//! the form `{StructName}{FunctionName}`. For free functions we use `{TheCrate}{FunctionName}`.
+
+#![allow(non_snake_case)]
+#![no_std]
+
+extern crate alloc;
+
+pub mod ass_elements;
+pub mod ass_style;
+mod aux_table;
+pub mod vivy;
+
+use crate::aux_table::AuxTable;
+use core::{ffi::c_char, marker, slice, str};
+
+/// Represents a string slice, the user may not modify this slice, never! Note that the string is
+/// not null terminated and may contains null bytes in it, use the len attribute to get the length
+/// of this string and convert it to your linking.
+///
+/// # Safety
+/// Note that you must always put unicode inside a string slice!
+#[repr(C)]
+pub struct StringSlice<'a> {
+    len: usize,
+    str: *const c_char,
+    _data: marker::PhantomData<&'a c_char>,
+}
+
+impl<'a> StringSlice<'a> {
+    /// # Safety
+    /// We expect the content of the string slice to be valid UTF6...
+    #[inline]
+    pub unsafe fn as_str(&self) -> &'a str {
+        str::from_utf8_unchecked(slice::from_raw_parts(self.str as *const _, self.len))
+    }
+}
+
+impl<'a, S> From<S> for StringSlice<'a>
+where
+    S: AsRef<str>,
+{
+    #[inline]
+    fn from(value: S) -> Self {
+        let value = value.as_ref();
+        StringSlice { len: value.len(), str: value.as_ptr() as *const _, _data: marker::PhantomData }
+    }
+}
diff --git a/src/Rust/vvs_lib/src/vivy.rs b/src/Rust/vvs_lib/src/vivy.rs
new file mode 100644
index 00000000..42301ab4
--- /dev/null
+++ b/src/Rust/vvs_lib/src/vivy.rs
@@ -0,0 +1,31 @@
+use alloc::string::String;
+use serde::{Deserialize, Serialize};
+
+#[derive(Debug, PartialEq, Eq)]
+pub enum VivyDocumentCapabilities {
+    AudioAble = (1 << 1),
+    VideoAble = (1 << 2),
+    AssAble = (1 << 3),
+}
+
+#[derive(Debug, Deserialize, Serialize)]
+#[serde(rename_all = "PascalCase")]
+pub struct VivyDocument {
+    #[serde(default = "u64::default")]
+    pub capabilities: u64,
+    pub name: String,
+}
+
+#[derive(Debug, Deserialize, Serialize)]
+#[serde(rename_all = "PascalCase")]
+#[serde(tag = "DocumentVersion", content = "SubDocuments")]
+pub enum VivySubDocument {
+    Alpha { sub_ass: Option<String>, sub_audio: Option<String>, sub_video: Option<String> },
+}
+
+#[test]
+fn test_deserialize() {
+    if let Err(err) = serde_json::from_str::<VivyDocument>(include_str!("../test/sample.vivy")) {
+        panic!("{err}")
+    }
+}
diff --git a/src/Rust/vvs_lib/test/sample.vivy b/src/Rust/vvs_lib/test/sample.vivy
new file mode 100644
index 00000000..16bd90a6
--- /dev/null
+++ b/src/Rust/vvs_lib/test/sample.vivy
@@ -0,0 +1,10 @@
+{
+    "Name":             "test",
+    "Capabilities":     12,
+    "DocumentVersion":  "alpha",
+    "SubDocuments": {
+        "SubAss":   "vivy/src/Rust/vvs_ass/utils/empty.ass",
+        "SubVideo": "data/4036f7f60c08bf70741f118eca95dff61facfb66199351e9e40900071cd5322d.mkv"
+    }
+}
+
diff --git a/src/Rust/vvs_llvm/Cargo.toml b/src/Rust/vvs_llvm/Cargo.toml
new file mode 100644
index 00000000..98bd38c9
--- /dev/null
+++ b/src/Rust/vvs_llvm/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name              = "vvs_llvm"
+description       = "Link against and re-export llvm things"
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+
+[dependencies]
+anyhow.workspace = true
+log.workspace    = true
+llvm-sys = { version = "181", features = [
+    "strict-versioning",       # Be strict about versions, we do want the lattest thing
+    "no-llvm-linking",         # We do the linking ourself because of problems when using spack: https://github.com/spack/spack/discussions/36192
+    "disable-alltargets-init", # Without linking we must rely on our own inits...
+] }
+
+[features]
+link = []
diff --git a/src/Rust/vvs_llvm/src/init.rs b/src/Rust/vvs_llvm/src/init.rs
new file mode 100644
index 00000000..dfff4b9a
--- /dev/null
+++ b/src/Rust/vvs_llvm/src/init.rs
@@ -0,0 +1,37 @@
+//! Initialize LLVM targets and such. This module only exports one function:
+//! [self::initialize_llvm]. Depending on the target architecture we select
+//! the correct function...
+
+use anyhow::anyhow;
+use llvm_sys::target_machine::*;
+use std::ffi::CStr;
+
+/// Be sure to init LLVM only once. We use an atomic usize because it is supported on all the
+/// platforms!
+fn call_once() -> bool {
+    use std::sync::atomic::{AtomicUsize, Ordering::*};
+    static INIT_ONCE: AtomicUsize = AtomicUsize::new(0);
+    INIT_ONCE.compare_exchange(0, 1, SeqCst, SeqCst).is_ok()
+}
+
+fn print_llvm_infos() {
+    let triple = unsafe { CStr::from_ptr(LLVMGetDefaultTargetTriple()) }.to_string_lossy();
+    let cpu = unsafe { CStr::from_ptr(LLVMGetHostCPUName()) }.to_string_lossy();
+    let cpu_features = unsafe { CStr::from_ptr(LLVMGetHostCPUFeatures()) }.to_string_lossy();
+
+    log::debug!("got default triple: `{triple}`");
+    log::debug!("got cpu `{cpu}` with features: {cpu_features}");
+}
+
+#[cfg(target_arch = "x86_64")]
+pub fn initialize_llvm() -> anyhow::Result<()> {
+    call_once()
+        .then(|| unsafe {
+            llvm_sys::target::LLVMInitializeX86Target();
+            print_llvm_infos();
+        })
+        .ok_or_else(|| anyhow!("llvm was already initialized for this executable!"))
+}
+
+#[cfg(not(target_arch = "x86_64"))]
+compile_error!("this target is not supported for now");
diff --git a/src/Rust/vvs_llvm/src/iter.rs b/src/Rust/vvs_llvm/src/iter.rs
new file mode 100644
index 00000000..e1fae55f
--- /dev/null
+++ b/src/Rust/vvs_llvm/src/iter.rs
@@ -0,0 +1,102 @@
+//! Utility functions and structures to iterate over an LLVM function and in the basic blocks.
+
+use crate::*;
+use std::ptr;
+
+/// Iterate over the basic blocks in a function.
+#[derive(Clone, Copy)]
+pub struct LLVMFunctionIter {
+    curr_bb: LLVMBasicBlockRef,
+    last_bb: LLVMBasicBlockRef,
+    function: LLVMValueRef,
+    index: u32,
+}
+
+#[derive(Clone, Copy)]
+pub struct LLVMBasicBlockIter {
+    curr_instr: LLVMValueRef,
+    last_instr: LLVMValueRef,
+}
+
+impl Iterator for LLVMFunctionIter {
+    type Item = LLVMBasicBlockRef;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        (!self.curr_bb.is_null() && !self.last_bb.is_null())
+            .then(|| match unsafe { LLVMGetNextBasicBlock(self.curr_bb) } {
+                ret if ret.is_null() => None,
+                ret => {
+                    self.curr_bb = if ret == self.last_bb { ptr::null_mut() } else { ret };
+                    self.index += 1;
+                    Some(ret)
+                }
+            })
+            .flatten()
+    }
+
+    fn last(self) -> Option<Self::Item> {
+        (!self.last_bb.is_null()).then_some(self.last_bb)
+    }
+
+    fn count(self) -> usize {
+        unsafe { LLVMFunctionIter::count_bbs(&self) }
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let count = unsafe { LLVMFunctionIter::count_bbs(self) };
+        (count, Some(count))
+    }
+}
+
+impl Iterator for LLVMBasicBlockIter {
+    type Item = LLVMValueRef;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        (!self.curr_instr.is_null() && !self.last_instr.is_null())
+            .then(|| match unsafe { LLVMGetNextInstruction(self.curr_instr) } {
+                ret if ret.is_null() => None,
+                ret => {
+                    self.curr_instr = if ret == self.last_instr { ptr::null_mut() } else { ret };
+                    Some(ret)
+                }
+            })
+            .flatten()
+    }
+
+    fn last(self) -> Option<Self::Item> {
+        (!self.last_instr.is_null()).then_some(self.last_instr)
+    }
+}
+
+impl LLVMFunctionIter {
+    /// Create a new iterator over a function. If the passed value is not a function this
+    /// constructor will panic.
+    ///
+    /// # Safety
+    /// The passed value must be a valid pointer to [LLVMValue]. You may not create new basic
+    /// blocks while using this iterator.
+    pub unsafe fn new(function: LLVMValueRef) -> Self {
+        assert!(!LLVMIsAFunction(function).is_null(), "should pass functions...");
+        Self {
+            curr_bb: LLVMGetFirstBasicBlock(function),
+            last_bb: LLVMGetLastBasicBlock(function),
+            index: 0,
+            function,
+        }
+    }
+
+    unsafe fn count_bbs(&self) -> usize {
+        unsafe { LLVMCountBasicBlocks(self.function) }.saturating_sub(self.index) as usize
+    }
+}
+
+impl LLVMBasicBlockIter {
+    /// Create a new iterator over a basic block.
+    ///
+    /// # Safety
+    /// The passed value must be a valid pointer to [LLVMBasicBlock]. You may not insert new values
+    /// into the block while using this iterator.
+    pub unsafe fn new(bb: LLVMBasicBlockRef) -> Self {
+        Self { curr_instr: LLVMGetFirstInstruction(bb), last_instr: LLVMGetBasicBlockTerminator(bb) }
+    }
+}
diff --git a/src/Rust/vvs_llvm/src/lib.rs b/src/Rust/vvs_llvm/src/lib.rs
new file mode 100644
index 00000000..92320ada
--- /dev/null
+++ b/src/Rust/vvs_llvm/src/lib.rs
@@ -0,0 +1,80 @@
+//! Re-exports LLVM stuff
+
+#[cfg(feature = "link")]
+pub mod build {
+    //! Utility functions to link against LLVM without relying to [llvm-sys]. The function
+    //! [llvm_link] should be run from the build.rs script of any executable or library depending
+    //! on [vvs_llvm].
+
+    use anyhow::{anyhow, bail, Context};
+    use std::process::{Command, Output};
+
+    /// Run a command with said arguments and returns the stdout of said command.
+    fn run<const N: usize>(cmd: &'static str, args: [&'static str; N]) -> anyhow::Result<Vec<u8>> {
+        match Command::new(cmd).args(args).output()? {
+            Output { status, stdout, .. } if status.success() => Ok(stdout),
+            Output { stderr, .. } => Err(anyhow!(
+                "failed to run `{cmd}`: {}",
+                std::str::from_utf8(&stderr).with_context(|| format!("`{cmd}` failed with non-utf8 stderr"))?
+            )),
+        }
+    }
+
+    /// Prints info for cargo to link against LLVM libraries
+    pub fn llvm_link() -> anyhow::Result<()> {
+        let libdir = std::str::from_utf8(&run("llvm-config", ["--libdir"])?)
+            .with_context(|| "`llvm-config --libdir` failed with non-utf8 stdout")?
+            .trim()
+            .to_string();
+        println!("cargo:rustc-link-search={libdir}");
+
+        let ty = match std::str::from_utf8(&run("llvm-config", ["--shared-mode"])?)?.trim() {
+            // In dynamic mode, we may need to do something about the rpath...
+            "shared" => {
+                println!("cargo:rustc-link-arg=-Wl,-rpath={libdir}"); // rpath for executable
+                println!("cargo:rustc-env=LD_LIBRARY_PATH={libdir}"); // for tests
+                "dylib"
+            }
+
+            // Static mode, just include all the .a files. We also need some system libs...
+            "static" => {
+                println!("cargo:rustc-link-arg=-lstdc++");
+                std::str::from_utf8(&run("llvm-config", ["--system-libs"])?)?
+                    .trim()
+                    .split_ascii_whitespace()
+                    .for_each(|lib| println!("cargo:rustc-link-arg={lib}"));
+                "static"
+            }
+
+            // Err...
+            out => bail!("invalid returned value `{out}`"),
+        };
+
+        std::str::from_utf8(&run("llvm-config", ["--libs"])?)?
+            .trim()
+            .split_ascii_whitespace()
+            .flat_map(|name| name.strip_prefix("-l"))
+            .for_each(|name| println!("cargo:rustc-link-lib={ty}={name}"));
+
+        println!("cargo:rerun-if-changed=build.rs");
+        Ok(())
+    }
+}
+
+pub use llvm_sys::{
+    analysis::*,
+    core::*,
+    error::*,
+    orc2::{ee::*, lljit::*, *},
+    prelude::*,
+    target::*,
+    target_machine::*,
+    transforms::pass_builder::*,
+    *,
+};
+
+mod init;
+mod iter;
+
+pub use init::*;
+pub use iter::*;
diff --git a/src/Rust/vvs_parser/Cargo.toml b/src/Rust/vvs_parser/Cargo.toml
new file mode 100644
index 00000000..f078adec
--- /dev/null
+++ b/src/Rust/vvs_parser/Cargo.toml
@@ -0,0 +1,39 @@
+[package]
+name        = "vvs_parser"
+license     = "MPL-2.0"
+description = "A lossless Lua parser hacked to parse VVS"
+
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+
+
+[dependencies]
+vvs_parser_derive.workspace = true
+
+bytecount.workspace          = true
+cfg-if.workspace             = true
+derive_more.workspace        = true
+paste.workspace              = true
+serde.workspace              = true
+smol_str.workspace           = true
+hashbrown.workspace          = true
+anyhow.workspace             = true
+log.workspace                = true
+codespan.workspace           = true
+codespan-reporting.workspace = true
+termcolor.workspace          = true
+
+[dev-dependencies]
+criterion.workspace = true
+insta.workspace     = true
+
+[[bench]]
+name = "date"
+path = "../benches/date.rs"
+harness = false
+
+[[bench]]
+name = "t"
+path = "../benches/t.rs"
+harness = false
diff --git a/src/Rust/vvs_parser/LICENSE.md b/src/Rust/vvs_parser/LICENSE.md
new file mode 100644
index 00000000..2b8bbd45
--- /dev/null
+++ b/src/Rust/vvs_parser/LICENSE.md
@@ -0,0 +1,347 @@
+Mozilla Public License Version 2.0
+==================================
+
+### 1. Definitions
+
+**1.1. “Contributor”**
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+**1.2. “Contributor Version”**
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+**1.3. “Contribution”**
+    means Covered Software of a particular Contributor.
+
+**1.4. “Covered Software”**
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+**1.5. “Incompatible With Secondary Licenses”**
+    means
+
+* **(a)** that the initial Contributor has attached the notice described
+    in Exhibit B to the Covered Software; or
+* **(b)** that the Covered Software was made available under the terms of
+    version 1.1 or earlier of the License, but not also under the
+    terms of a Secondary License.
+
+**1.6. “Executable Form”**
+    means any form of the work other than Source Code Form.
+
+**1.7. “Larger Work”**
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+**1.8. “License”**
+    means this document.
+
+**1.9. “Licensable”**
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+**1.10. “Modifications”**
+    means any of the following:
+
+* **(a)** any file in Source Code Form that results from an addition to,
+    deletion from, or modification of the contents of Covered
+    Software; or
+* **(b)** any new file in Source Code Form that contains any Covered
+    Software.
+
+**1.11. “Patent Claims” of a Contributor**
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+**1.12. “Secondary License”**
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+**1.13. “Source Code Form”**
+    means the form of the work preferred for making modifications.
+
+**1.14. “You” (or “Your”)**
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, “You” includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, “control” means **(a)** the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or **(b)** ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+### 2. License Grants and Conditions
+
+#### 2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+* **(a)** under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+* **(b)** under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+#### 2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+#### 2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+* **(a)** for any code that a Contributor has removed from Covered Software;
+    or
+* **(b)** for infringements caused by: **(i)** Your and any other third party's
+    modifications of Covered Software, or **(ii)** the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+* **(c)** under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+#### 2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+#### 2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+#### 2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+#### 2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+### 3. Responsibilities
+
+#### 3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+#### 3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+* **(a)** such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+* **(b)** You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+#### 3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+#### 3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+#### 3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+### 4. Inability to Comply Due to Statute or Regulation
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: **(a)** comply with
+the terms of this License to the maximum extent possible; and **(b)**
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+### 5. Termination
+
+**5.1.** The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated **(a)** provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and **(b)** on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+**5.2.** If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+**5.3.** In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+### 6. Disclaimer of Warranty
+
+> Covered Software is provided under this License on an “as is”
+> basis, without warranty of any kind, either expressed, implied, or
+> statutory, including, without limitation, warranties that the
+> Covered Software is free of defects, merchantable, fit for a
+> particular purpose or non-infringing. The entire risk as to the
+> quality and performance of the Covered Software is with You.
+> Should any Covered Software prove defective in any respect, You
+> (not any Contributor) assume the cost of any necessary servicing,
+> repair, or correction. This disclaimer of warranty constitutes an
+> essential part of this License. No use of any Covered Software is
+> authorized under this License except under this disclaimer.
+
+### 7. Limitation of Liability
+
+> Under no circumstances and under no legal theory, whether tort
+> (including negligence), contract, or otherwise, shall any
+> Contributor, or anyone who distributes Covered Software as
+> permitted above, be liable to You for any direct, indirect,
+> special, incidental, or consequential damages of any character
+> including, without limitation, damages for lost profits, loss of
+> goodwill, work stoppage, computer failure or malfunction, or any
+> and all other commercial damages or losses, even if such party
+> shall have been informed of the possibility of such damages. This
+> limitation of liability shall not apply to liability for death or
+> personal injury resulting from such party's negligence to the
+> extent applicable law prohibits such limitation. Some
+> jurisdictions do not allow the exclusion or limitation of
+> incidental or consequential damages, so this exclusion and
+> limitation may not apply to You.
+
+### 8. Litigation
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+### 9. Miscellaneous
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+### 10. Versions of the License
+
+#### 10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+#### 10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+#### 10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+#### 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+## Exhibit A - Source Code Form License Notice
+
+    This Source Code Form is subject to the terms of the Mozilla Public
+    License, v. 2.0. If a copy of the MPL was not distributed with this
+    file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+## Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+    This Source Code Form is "Incompatible With Secondary Licenses", as
+    defined by the Mozilla Public License, v. 2.0.
diff --git a/src/Rust/vvs_parser/README.md b/src/Rust/vvs_parser/README.md
new file mode 100644
index 00000000..1bc8ed39
--- /dev/null
+++ b/src/Rust/vvs_parser/README.md
@@ -0,0 +1,10 @@
+A lossless Lua 5.1 / 5.2 / 5.3 / 5.4 / [Luau](https://luau-lang.org/) parser written in Rust.
+
+Full Moon preserves comments, whitespace, style choices, etc. With Full Moon, you're able to convert
+your Lua code into an AST and a syntax tree and convert it back to the original code exactly.
+
+Using Full Moon, you'll be able to modify the AST directly and re-export it back to Lua, all while
+preserving the style in which you write.
+
+Full Moon is heavily inspired by [LPGhatguy's mab](https://github.com/LPGhatguy/mab/) and by the
+possibilities brought on by [benjamn's recast](https://github.com/benjamn/recast).
diff --git a/src/Rust/vvs_parser/samples/options.ini b/src/Rust/vvs_parser/samples/options.ini
new file mode 100644
index 00000000..ef6a2af7
--- /dev/null
+++ b/src/Rust/vvs_parser/samples/options.ini
@@ -0,0 +1,8 @@
+[retime]
+before = 900
+after  = 400
+
+[outline]
+-- Let's say we have an outline module...
+border = 4
+color  = color { "rgb", 0, 0, 0 }
diff --git a/src/Rust/vvs_parser/samples/retime.vvs b/src/Rust/vvs_parser/samples/retime.vvs
new file mode 100644
index 00000000..94e93020
--- /dev/null
+++ b/src/Rust/vvs_parser/samples/retime.vvs
@@ -0,0 +1,29 @@
+---[[ Contains utilities to retime lines from an ASS file. ]]
+
+
+option before : number = 900 --- Retime time in millisecond for the aparition of the line.
+option after  : number = 300 --- Retime time in millisecond for the disaparition of the line.
+
+
+-- We want to permit assertions to check for options, etc. They will be run before the main is
+-- executed, when all the configuration is loaded.
+assert(before >= 0, "offset should be positive")
+assert(after  >= 0, "offset should be positive")
+
+
+--- Here we set the begin of the syllabes at the begin of the line, each
+--- syllabes will end when it should in fact begin.
+job start(l: line): line
+    for i,s in l do
+        s.begin = l.start - self.before
+    end
+end
+
+
+--- Here we set the end of the syllabes at the end of the line, each
+--- syllabes will begin when it should in fact end.
+job finish(l: line): line
+    for i,s in l do
+        s.finish = l.finish - self.after
+    end
+end
diff --git a/src/Rust/vvs_parser/samples/tag.vvs b/src/Rust/vvs_parser/samples/tag.vvs
new file mode 100644
index 00000000..cf625d30
--- /dev/null
+++ b/src/Rust/vvs_parser/samples/tag.vvs
@@ -0,0 +1,21 @@
+---[[ Contains utilities to tag some lines/syllages to filter sets of elements. ]]
+
+
+--- Returns only syllabes with the specified displacement.
+job syl_modulo(every: number, disp: number, l: line): line
+    for i,s in l do
+        if (i % every) == disp then
+            yield s
+        end
+    end
+end
+
+
+--- Returns only lines with the specified displacement.
+job line_modulo(every: number, ls: lines): line -- Note that jobs may only returns `line` or `syllabe`
+    for i,l in ls do
+        if (i % every) == disp then
+            yield l
+        end
+    end
+end
diff --git a/src/Rust/vvs_parser/samples/test.vvs b/src/Rust/vvs_parser/samples/test.vvs
new file mode 100644
index 00000000..1b482111
--- /dev/null
+++ b/src/Rust/vvs_parser/samples/test.vvs
@@ -0,0 +1,20 @@
+import "utils"
+import { "retime", "tag" }
+
+
+-- Set some options.
+retime.before  = 900
+retime.after   = 400
+outline.border = 4
+outline.color  = color "rgb" { 10, 10, 10 }
+
+
+-- What we want to do for this script, and how we name the initial value.
+main "INIT" do
+    "BEFORE"   = retime.start   { "INIT" }
+    "AFTER"    = retime.finish  { "INIT" }
+    "OUTLINED" = utils.outline  { "BEFORE", "INIT", "AFTER" }
+    "TAGGED"   = tag.syl_modulo { every = 3, disp = 1, "OUTLINED" } -- Here we tag some objects...
+
+    return "OUTLINED" -- What we want to write in the file, in order.
+end
diff --git a/src/Rust/vvs_parser/src/ast/mod.rs b/src/Rust/vvs_parser/src/ast/mod.rs
new file mode 100644
index 00000000..5ccfe1e9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/mod.rs
@@ -0,0 +1,3117 @@
+//! Utilities for ASTs (Abstract Syntax Trees).
+
+use crate::{
+    ast::parsers::ParserState,
+    node::Node,
+    tokenizer::{Position, Symbol, Token, TokenReference, TokenType},
+    util::*,
+    ShortString,
+};
+use crate::{traits::DefaultRef, util::display_option};
+use derive_more::{Deref, Display, IsVariant};
+use serde::{Deserialize, Serialize};
+use std::{borrow::Cow, fmt};
+use vvs_parser_derive::{Node, Visit};
+
+pub use crate::ast::{punctuated::*, span::*};
+
+pub(crate) use crate::ast::{
+    options::OptionTable,
+    parsers::{AstResult, OptionTableResult},
+};
+
+mod options;
+mod parsers;
+mod punctuated;
+mod span;
+mod update_positions;
+mod visitors;
+
+/// A block of statements, such as in if/do/etc block
+#[derive(Clone, Debug, Default, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{}{}",
+    display_optional_punctuated_vec(stmts),
+    display_option(last_stmt.as_ref().map(display_optional_punctuated))
+)]
+pub struct Block {
+    stmts: Vec<(Stmt, Option<TokenReference>)>,
+
+    #[serde(skip_serializing_if = "Option::is_none")]
+    last_stmt: Option<(LastStmt, Option<TokenReference>)>,
+}
+
+impl Block {
+    /// Creates an empty block
+    pub fn new() -> Self {
+        Default::default()
+    }
+
+    /// An iterator over the statements in the block, such as `local foo = 1`.
+    ///
+    /// Note that this does not contain the final statement which can be
+    /// attained via [`Block::last_stmt`].
+    pub fn stmts(&self) -> impl Iterator<Item = &Stmt> {
+        self.stmts.iter().map(|(stmt, _)| stmt)
+    }
+
+    /// An iterator over the mutable statements in the block, such as `local foo = 1`.
+    ///
+    /// Note that this does not contain the final statement which can be
+    /// attained via [`Block::last_stmt`].
+    #[allow(dead_code)]
+    pub(crate) fn stmts_mut(&mut self) -> impl Iterator<Item = &mut Stmt> {
+        self.stmts.iter_mut().map(|(stmt, _)| stmt)
+    }
+
+    /// An iterator over the statements in the block, including any optional
+    /// semicolon token reference present
+    pub fn stmts_with_semicolon(&self) -> impl Iterator<Item = &(Stmt, Option<TokenReference>)> {
+        self.stmts.iter()
+    }
+
+    /// The last statement of the block if one exists, such as `return foo`
+    pub fn last_stmt(&self) -> Option<&LastStmt> {
+        Some(&self.last_stmt.as_ref()?.0)
+    }
+
+    /// The mutable last statement of the block if one exists, such as `return foo`
+    pub fn last_stmt_mut(&mut self) -> Option<&mut LastStmt> {
+        Some(&mut self.last_stmt.as_mut()?.0)
+    }
+
+    /// The last statement of the block if on exists, including any optional semicolon token reference present
+    pub fn last_stmt_with_semicolon(&self) -> Option<&(LastStmt, Option<TokenReference>)> {
+        self.last_stmt.as_ref()
+    }
+
+    /// Returns a new block with the given statements
+    /// Takes a vector of statements, followed by an optional semicolon token reference
+    pub fn with_stmts(self, stmts: Vec<(Stmt, Option<TokenReference>)>) -> Self {
+        Self { stmts, ..self }
+    }
+
+    /// Returns a new block with the given last statement, if one is given
+    /// Takes an optional last statement, with an optional semicolon
+    pub fn with_last_stmt(self, last_stmt: Option<(LastStmt, Option<TokenReference>)>) -> Self {
+        Self { last_stmt, ..self }
+    }
+
+    pub(crate) fn merge_blocks(&mut self, other: Self) {
+        self.stmts.extend(other.stmts);
+        self.last_stmt = other.last_stmt;
+    }
+}
+
+/// The last statement of a [`Block`]
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum LastStmt {
+    /// A `break` statement
+    Break(TokenReference),
+
+    /// A continue statement
+    Continue(TokenReference),
+
+    /// A `return` statement
+    Return(Return),
+}
+
+/// A `return` statement
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{token}{returns}")]
+pub struct Return {
+    token: TokenReference,
+    returns: Punctuated<Expression>,
+}
+
+impl Return {
+    /// Creates a new empty Return
+    /// Default return token is followed by a single space
+    pub fn new() -> Self {
+        Self { token: TokenReference::basic_symbol("return "), returns: Punctuated::new() }
+    }
+
+    /// The `return` token
+    pub fn token(&self) -> &TokenReference {
+        &self.token
+    }
+
+    /// The values being returned
+    pub fn returns(&self) -> &Punctuated<Expression> {
+        &self.returns
+    }
+
+    /// Returns a new Return with the given `return` token
+    pub fn with_token(self, token: TokenReference) -> Self {
+        Self { token, ..self }
+    }
+
+    /// Returns a new Return with the given punctuated sequence
+    pub fn with_returns(self, returns: Punctuated<Expression>) -> Self {
+        Self { returns, ..self }
+    }
+}
+
+impl Default for Return {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+/// Fields of a [`TableConstructor`]
+#[derive(Clone, Debug, Display, PartialEq, Node, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum Field {
+    /// A key in the format of `[expression] = value`
+    #[display("{}{key}{}{equal}{value}", brackets.tokens().0, brackets.tokens().1)]
+    ExpressionKey {
+        /// The `[...]` part of `[expression] = value`
+        brackets: ContainedSpan,
+        /// The `expression` part of `[expression] = value`
+        key: Expression,
+        /// The `=` part of `[expression] = value`
+        equal: TokenReference,
+        /// The `value` part of `[expression] = value`
+        value: Expression,
+    },
+
+    /// A key in the format of `name = value`
+    #[display("{key}{equal}{value}")]
+    NameKey {
+        /// The `name` part of `name = value`
+        key: TokenReference,
+        /// The `=` part of `name = value`
+        equal: TokenReference,
+        /// The `value` part of `name = value`
+        value: Expression,
+    },
+
+    /// A field with no key, just a value (such as `"a"` in `{ "a" }`)
+    #[display("{_0}")]
+    NoKey(Expression),
+}
+
+/// A table being constructed, such as `{ 1, 2, 3 }` or `{ a = 1 }`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{}{fields}{}", braces.tokens().0, braces.tokens().1)]
+pub struct TableConstructor {
+    #[node(full_range)]
+    #[visit(contains = "fields")]
+    braces: ContainedSpan,
+    fields: Punctuated<Field>,
+}
+
+impl TableConstructor {
+    /// Creates a new empty TableConstructor
+    /// Brace tokens are followed by spaces, such that { `fields` }
+    pub fn new() -> Self {
+        Self {
+            braces: ContainedSpan::new(TokenReference::basic_symbol("{ "), TokenReference::basic_symbol(" }")),
+            fields: Punctuated::new(),
+        }
+    }
+
+    /// The braces of the constructor
+    pub fn braces(&self) -> &ContainedSpan {
+        &self.braces
+    }
+
+    /// Returns the [`Punctuated`] sequence of the fields used to create the table
+    pub fn fields(&self) -> &Punctuated<Field> {
+        &self.fields
+    }
+
+    /// Get the number of fields in the table construct
+    pub fn fields_len(&self) -> usize {
+        self.fields().len()
+    }
+
+    /// Returns a new TableConstructor with the given braces
+    pub fn with_braces(self, braces: ContainedSpan) -> Self {
+        Self { braces, ..self }
+    }
+
+    /// Returns a new TableConstructor with the given fields
+    pub fn with_fields(self, fields: Punctuated<Field>) -> Self {
+        Self { fields, ..self }
+    }
+}
+
+impl Default for TableConstructor {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+/// An expression, mostly useful for getting values
+#[derive(Clone, Debug, Display, PartialEq, Node, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum Expression {
+    /// A binary operation, such as `1 + 3`
+    #[display("{lhs}{binop}{rhs}")]
+    BinaryOperator {
+        /// The left hand side of the binary operation, the `1` part of `1 + 3`
+        lhs: Box<Expression>,
+        /// The binary operation used, the `+` part of `1 + 3`
+        binop: BinOp,
+        /// The right hand side of the binary operation, the `3` part of `1 + 3`
+        rhs: Box<Expression>,
+    },
+
+    /// A statement in parentheses, such as `(#list)`
+    #[display("{}{expression}{}", contained.tokens().0, contained.tokens().1)]
+    Parentheses {
+        /// The parentheses of the expression
+        #[node(full_range)]
+        contained: ContainedSpan,
+        /// The expression inside the parentheses
+        expression: Box<Expression>,
+    },
+
+    /// A unary operation, such as `#list`
+    #[display("{unop}{expression}")]
+    UnaryOperator {
+        /// The unary operation, the `#` part of `#list`
+        unop: UnOp,
+        /// The expression the operation is being done on, the `list` part of `#list`
+        expression: Box<Expression>,
+    },
+
+    /// An anonymous function, such as `function() end)`
+    #[display("{}{}", _0.0, _0.1)]
+    Function(Box<(TokenReference, FunctionBody)>),
+
+    /// A call of a function, such as `call()`
+    #[display("{_0}")]
+    FunctionCall(FunctionCall),
+
+    /// An if expression, such as `if foo then true else false`.
+    #[display("{_0}")]
+    IfExpression(IfExpression),
+
+    /// A table constructor, such as `{ 1, 2, 3 }`
+    #[display("{_0}")]
+    TableConstructor(TableConstructor),
+
+    /// A number token, such as `3.3`
+    #[display("{_0}")]
+    Number(TokenReference),
+
+    /// A string token, such as `"hello"`
+    #[display("{_0}")]
+    String(TokenReference),
+
+    /// A symbol, such as `true`
+    #[display("{_0}")]
+    Symbol(TokenReference),
+
+    /// A value that has been asserted for a particular type, for use in Luau.
+    #[display("{expression}{type_assertion}")]
+    TypeAssertion {
+        /// The expression being asserted
+        expression: Box<Expression>,
+
+        /// The type assertion
+        type_assertion: TypeAssertion,
+    },
+
+    /// A more complex value, such as `call().x`
+    #[display("{_0}")]
+    Var(Var),
+}
+
+/// A statement that stands alone
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum Stmt {
+    /// An assignment, such as `x = 1`
+    #[display("{_0}")]
+    Assignment(Assignment),
+
+    /// A do block, `do end`
+    #[display("{_0}")]
+    Do(Do),
+
+    /// A function call on its own, such as `call()`
+    #[display("{_0}")]
+    FunctionCall(FunctionCall),
+
+    /// A function declaration, such as `function x() end`
+    #[display("{_0}")]
+    FunctionDeclaration(FunctionDeclaration),
+
+    /// A job declaration, such as `job x(l: lines): lines return l end`
+    #[display("{_0}")]
+    JobDeclaration(FunctionDeclaration),
+
+    /// A generic for loop, such as `for index, value in pairs(list) do end`
+    #[display("{_0}")]
+    GenericFor(GenericFor),
+
+    /// An if statement
+    #[display("{_0}")]
+    If(If),
+
+    /// A local assignment, such as `local x = 1`
+    #[display("{_0}")]
+    LocalAssignment(LocalAssignment),
+
+    /// A local function declaration, such as `local function x() end`
+    #[display("{_0}")]
+    LocalFunction(LocalFunction),
+
+    /// An import statement, such as `import "math"`
+    #[display("{_0}")]
+    Import(Import),
+
+    /// A numeric for loop, such as `for index = 1, 10 do end`
+    #[display("{_0}")]
+    NumericFor(NumericFor),
+
+    /// A repeat loop
+    #[display("{_0}")]
+    Repeat(Repeat),
+
+    /// A while loop
+    #[display("{_0}")]
+    While(While),
+
+    /// The `option` directive, to declare an option
+    #[display("{_0}")]
+    OptionDecl(OptionDecl),
+
+    /// The `write` directive, to write variables to the final file.
+    ///
+    /// Can be used like `write "init"` or `write { "init", "last", "etc" }`
+    #[display("{_0}")]
+    Write(Write),
+
+    /// The `main` directive. See [Main] for more informations.
+    #[display("{_0}")]
+    Main(Main),
+
+    /// The `yield` statement for jobs to be able to build automatically things in a job
+    #[display("{_0}")]
+    Yield(Yield),
+
+    /// A compound assignment, such as `+=`
+    #[display("{_0}")]
+    CompoundAssignment(CompoundAssignment),
+
+    /// A type declaration, such as `type Meters = number`
+    TypeDeclaration(TypeDeclaration),
+}
+
+/// A `yield` statement
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{token}{yielded}")]
+pub struct Yield {
+    token: TokenReference,
+    yielded: Punctuated<Expression>,
+}
+
+impl Yield {
+    /// Creates a new empty Yield
+    /// Default yield token is followed by a single space
+    pub fn new() -> Self {
+        Self { token: TokenReference::basic_symbol("yield "), yielded: Punctuated::new() }
+    }
+
+    /// The `yield` token
+    pub fn token(&self) -> &TokenReference {
+        &self.token
+    }
+
+    /// The values being returned
+    pub fn yields(&self) -> &Punctuated<Expression> {
+        &self.yielded
+    }
+
+    /// Returns a new Return with the given `yield` token
+    pub fn with_token(self, token: TokenReference) -> Self {
+        Self { token, ..self }
+    }
+
+    /// Returns a new Yield with the given punctuated sequence
+    pub fn with_yields(self, yielded: Punctuated<Expression>) -> Self {
+        Self { yielded, ..self }
+    }
+}
+
+impl Default for Yield {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+/// A node used before another in cases such as function calling
+/// The `("foo")` part of `("foo"):upper()`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum Prefix {
+    #[display("{_0}")]
+    /// A complicated expression, such as `("foo")`
+    Expression(Box<Expression>),
+
+    #[display("{_0}")]
+    /// Just a name, such as `foo`
+    Name(TokenReference),
+}
+
+/// The indexing of something, such as `x.y` or `x["y"]`
+/// Values of variants are the keys, such as `"y"`
+#[derive(Clone, Debug, Display, PartialEq, Node, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum Index {
+    /// Indexing in the form of `x["y"]`
+    #[display("{}{expression}{}", brackets.tokens().0, brackets.tokens().1)]
+    Brackets {
+        /// The `[...]` part of `["y"]`
+        brackets: ContainedSpan,
+        /// The `"y"` part of `["y"]`
+        expression: Expression,
+    },
+
+    /// Indexing in the form of `x.y`
+    #[display("{dot}{name}")]
+    Dot {
+        /// The `.` part of `.y`
+        dot: TokenReference,
+        /// The `y` part of `.y`
+        name: TokenReference,
+    },
+}
+
+/// Arguments used for a function
+#[derive(Clone, Debug, Display, PartialEq, Node, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum FunctionArgs {
+    /// Used when a function is called in the form of `call(1, 2, 3)`
+    #[display("{}{arguments}{}", parentheses.tokens().0, parentheses.tokens().1)]
+    Parentheses {
+        /// The `(...) part of (1, 2, 3)`
+        #[node(full_range)]
+        parentheses: ContainedSpan,
+        /// The `1, 2, 3` part of `1, 2, 3`
+        arguments: Punctuated<Expression>,
+    },
+    /// Used when a function is called in the form of `call "foobar"`
+    #[display("{_0}")]
+    String(TokenReference),
+    /// Used when a function is called in the form of `call { 1, 2, 3 }`
+    #[display("{_0}")]
+    TableConstructor(TableConstructor),
+}
+
+impl FunctionArgs {
+    pub(crate) fn empty() -> Self {
+        FunctionArgs::Parentheses {
+            parentheses: ContainedSpan::new(TokenReference::basic_symbol("("), TokenReference::basic_symbol(")")),
+
+            arguments: Punctuated::new(),
+        }
+    }
+}
+
+/// A numeric for loop, such as `for index = 1, 10 do end`
+#[derive(Clone, Debug, PartialEq, Display, Node, Deserialize, Serialize)]
+#[display("{for_token}{index_variable}{}{equal_token}{start}{start_end_comma}{end}{}{}{do_token}{block}{end_token}",
+    display_option(self.type_specifier()),
+    display_option(self.end_step_comma()),
+    display_option(self.step()),
+)]
+pub struct NumericFor {
+    for_token: TokenReference,
+    index_variable: TokenReference,
+    equal_token: TokenReference,
+    start: Expression,
+    start_end_comma: TokenReference,
+    end: Expression,
+    end_step_comma: Option<TokenReference>,
+    step: Option<Expression>,
+    do_token: TokenReference,
+    block: Block,
+    end_token: TokenReference,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    type_specifier: Option<TypeSpecifier>,
+}
+
+impl NumericFor {
+    /// Creates a new NumericFor from the given index variable, start, and end expressions
+    pub fn new(index_variable: TokenReference, start: Expression, end: Expression) -> Self {
+        Self {
+            for_token: TokenReference::basic_symbol("for "),
+            index_variable,
+            equal_token: TokenReference::basic_symbol(" = "),
+            start,
+            start_end_comma: TokenReference::basic_symbol(", "),
+            end,
+            end_step_comma: None,
+            step: None,
+            do_token: TokenReference::basic_symbol(" do\n"),
+            block: Block::new(),
+            end_token: TokenReference::basic_symbol("\nend"),
+            type_specifier: None,
+        }
+    }
+
+    /// The `for` token
+    pub fn for_token(&self) -> &TokenReference {
+        &self.for_token
+    }
+
+    /// The index identity, `index` in the initial example
+    pub fn index_variable(&self) -> &TokenReference {
+        &self.index_variable
+    }
+
+    /// The `=` token
+    pub fn equal_token(&self) -> &TokenReference {
+        &self.equal_token
+    }
+
+    /// The starting point, `1` in the initial example
+    pub fn start(&self) -> &Expression {
+        &self.start
+    }
+
+    /// The comma in between the starting point and end point
+    /// for _ = 1, 10 do
+    ///          ^
+    pub fn start_end_comma(&self) -> &TokenReference {
+        &self.start_end_comma
+    }
+
+    /// The ending point, `10` in the initial example
+    pub fn end(&self) -> &Expression {
+        &self.end
+    }
+
+    /// The comma in between the ending point and limit, if one exists
+    /// for _ = 0, 10, 2 do
+    ///              ^
+    pub fn end_step_comma(&self) -> Option<&TokenReference> {
+        self.end_step_comma.as_ref()
+    }
+
+    /// The step if one exists, `2` in `for index = 0, 10, 2 do end`
+    pub fn step(&self) -> Option<&Expression> {
+        self.step.as_ref()
+    }
+
+    /// The `do` token
+    pub fn do_token(&self) -> &TokenReference {
+        &self.do_token
+    }
+
+    /// The code inside the for loop
+    pub fn block(&self) -> &Block {
+        &self.block
+    }
+
+    /// The `end` token
+    pub fn end_token(&self) -> &TokenReference {
+        &self.end_token
+    }
+
+    /// The type specifiers of the index variable
+    /// `for i: number = 1, 10 do` returns:
+    /// `Some(TypeSpecifier(number))`
+    pub fn type_specifier(&self) -> Option<&TypeSpecifier> {
+        self.type_specifier.as_ref()
+    }
+
+    /// Returns a new NumericFor with the given for token
+    pub fn with_for_token(self, for_token: TokenReference) -> Self {
+        Self { for_token, ..self }
+    }
+
+    /// Returns a new NumericFor with the given index variable
+    pub fn with_index_variable(self, index_variable: TokenReference) -> Self {
+        Self { index_variable, ..self }
+    }
+
+    /// Returns a new NumericFor with the given `=` token
+    pub fn with_equal_token(self, equal_token: TokenReference) -> Self {
+        Self { equal_token, ..self }
+    }
+
+    /// Returns a new NumericFor with the given start expression
+    pub fn with_start(self, start: Expression) -> Self {
+        Self { start, ..self }
+    }
+
+    /// Returns a new NumericFor with the given comma between the start and end expressions
+    pub fn with_start_end_comma(self, start_end_comma: TokenReference) -> Self {
+        Self { start_end_comma, ..self }
+    }
+
+    /// Returns a new NumericFor with the given end expression
+    pub fn with_end(self, end: Expression) -> Self {
+        Self { end, ..self }
+    }
+
+    /// Returns a new NumericFor with the given comma between the end and the step expressions
+    pub fn with_end_step_comma(self, end_step_comma: Option<TokenReference>) -> Self {
+        Self { end_step_comma, ..self }
+    }
+
+    /// Returns a new NumericFor with the given step expression
+    pub fn with_step(self, step: Option<Expression>) -> Self {
+        Self { step, ..self }
+    }
+
+    /// Returns a new NumericFor with the given `do` token
+    pub fn with_do_token(self, do_token: TokenReference) -> Self {
+        Self { do_token, ..self }
+    }
+
+    /// Returns a new NumericFor with the given block
+    pub fn with_block(self, block: Block) -> Self {
+        Self { block, ..self }
+    }
+
+    /// Returns a new NumericFor with the given `end` token
+    pub fn with_end_token(self, end_token: TokenReference) -> Self {
+        Self { end_token, ..self }
+    }
+
+    /// Returns a new NumericFor with the given type specifiers
+    pub fn with_type_specifier(self, type_specifier: Option<TypeSpecifier>) -> Self {
+        Self { type_specifier, ..self }
+    }
+}
+
+/// A generic for loop, such as `for index, value in pairs(list) do end`
+#[derive(Clone, Debug, PartialEq, Display, Node, Deserialize, Serialize)]
+#[display("{for_token}{}{in_token}{expr_list}{do_token}{block}{end_token}",
+    join_type_specifiers(&self.names, self.type_specifiers()),
+)]
+pub struct GenericFor {
+    for_token: TokenReference,
+    names: Punctuated<TokenReference>,
+    in_token: TokenReference,
+    expr_list: Punctuated<Expression>,
+    do_token: TokenReference,
+    block: Block,
+    end_token: TokenReference,
+    type_specifiers: Vec<Option<TypeSpecifier>>,
+}
+
+impl GenericFor {
+    /// Creates a new GenericFor from the given names and expressions
+    pub fn new(names: Punctuated<TokenReference>, expr_list: Punctuated<Expression>) -> Self {
+        Self {
+            for_token: TokenReference::basic_symbol("for "),
+            names,
+            in_token: TokenReference::basic_symbol(" in "),
+            expr_list,
+            do_token: TokenReference::basic_symbol(" do\n"),
+            block: Block::new(),
+            end_token: TokenReference::basic_symbol("\nend"),
+            type_specifiers: Vec::new(),
+        }
+    }
+
+    /// The `for` token
+    pub fn for_token(&self) -> &TokenReference {
+        &self.for_token
+    }
+
+    /// Returns the punctuated sequence of names
+    /// In `for index, value in pairs(list) do`, iterates over `index` and `value`
+    pub fn names(&self) -> &Punctuated<TokenReference> {
+        &self.names
+    }
+
+    /// The `in` token
+    pub fn in_token(&self) -> &TokenReference {
+        &self.in_token
+    }
+
+    /// Returns the punctuated sequence of the expressions looped over
+    /// In `for index, value in pairs(list) do`, iterates over `pairs(list)`
+    pub fn expressions(&self) -> &Punctuated<Expression> {
+        &self.expr_list
+    }
+
+    /// The `do` token
+    pub fn do_token(&self) -> &TokenReference {
+        &self.do_token
+    }
+
+    /// The code inside the for loop
+    pub fn block(&self) -> &Block {
+        &self.block
+    }
+
+    /// The `end` token
+    pub fn end_token(&self) -> &TokenReference {
+        &self.end_token
+    }
+
+    /// The type specifiers of the named variables, in the order that they were assigned.
+    /// `for i, v: string in pairs() do` returns an iterator containing:
+    /// `None, Some(TypeSpecifier(string))`
+    pub fn type_specifiers(&self) -> impl Iterator<Item = Option<&TypeSpecifier>> {
+        self.type_specifiers.iter().map(Option::as_ref)
+    }
+
+    /// Returns a new GenericFor with the given `for` token
+    pub fn with_for_token(self, for_token: TokenReference) -> Self {
+        Self { for_token, ..self }
+    }
+
+    /// Returns a new GenericFor with the given names
+    pub fn with_names(self, names: Punctuated<TokenReference>) -> Self {
+        Self { names, ..self }
+    }
+
+    /// Returns a new GenericFor with the given `in` token
+    pub fn with_in_token(self, in_token: TokenReference) -> Self {
+        Self { in_token, ..self }
+    }
+
+    /// Returns a new GenericFor with the given expression list
+    pub fn with_expressions(self, expr_list: Punctuated<Expression>) -> Self {
+        Self { expr_list, ..self }
+    }
+
+    /// Returns a new GenericFor with the given `do` token
+    pub fn with_do_token(self, do_token: TokenReference) -> Self {
+        Self { do_token, ..self }
+    }
+
+    /// Returns a new GenericFor with the given block
+    pub fn with_block(self, block: Block) -> Self {
+        Self { block, ..self }
+    }
+
+    /// Returns a new GenericFor with the given `end` token
+    pub fn with_end_token(self, end_token: TokenReference) -> Self {
+        Self { end_token, ..self }
+    }
+
+    /// Returns a new GenericFor with the given type specifiers
+    pub fn with_type_specifiers(self, type_specifiers: Vec<Option<TypeSpecifier>>) -> Self {
+        Self { type_specifiers, ..self }
+    }
+}
+
+/// An if statement
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{if_token}{condition}{then_token}{block}{}{}{}{end_token}",
+    display_option(else_if.as_ref().map(join_vec)),
+    display_option(else_token),
+    display_option(r#else),
+)]
+pub struct If {
+    if_token: TokenReference,
+    condition: Expression,
+    then_token: TokenReference,
+    block: Block,
+    else_if: Option<Vec<ElseIf>>,
+    else_token: Option<TokenReference>,
+
+    #[serde(rename = "else")]
+    r#else: Option<Block>,
+    end_token: TokenReference,
+}
+
+impl If {
+    /// Creates a new If from the given condition
+    pub fn new(condition: Expression) -> Self {
+        Self {
+            if_token: TokenReference::basic_symbol("if "),
+            condition,
+            then_token: TokenReference::basic_symbol(" then"),
+            block: Block::new(),
+            else_if: None,
+            else_token: None,
+            r#else: None,
+            end_token: TokenReference::basic_symbol("\nend"),
+        }
+    }
+
+    /// The `if` token
+    pub fn if_token(&self) -> &TokenReference {
+        &self.if_token
+    }
+
+    /// The condition of the if statement, `condition` in `if condition then`
+    pub fn condition(&self) -> &Expression {
+        &self.condition
+    }
+
+    /// The `then` token
+    pub fn then_token(&self) -> &TokenReference {
+        &self.then_token
+    }
+
+    /// The block inside the initial if statement
+    pub fn block(&self) -> &Block {
+        &self.block
+    }
+
+    /// The `else` token if one exists
+    pub fn else_token(&self) -> Option<&TokenReference> {
+        self.else_token.as_ref()
+    }
+
+    /// If there are `elseif` conditions, returns a vector of them
+    /// Expression is the condition, block is the code if the condition is true
+    // TODO: Make this return an iterator, and remove Option part entirely?
+    pub fn else_if(&self) -> Option<&Vec<ElseIf>> {
+        self.else_if.as_ref()
+    }
+
+    /// The code inside an `else` block if one exists
+    pub fn else_block(&self) -> Option<&Block> {
+        self.r#else.as_ref()
+    }
+
+    /// The `end` token
+    pub fn end_token(&self) -> &TokenReference {
+        &self.end_token
+    }
+
+    /// Returns a new If with the given `if` token
+    pub fn with_if_token(self, if_token: TokenReference) -> Self {
+        Self { if_token, ..self }
+    }
+
+    /// Returns a new If with the given condition
+    pub fn with_condition(self, condition: Expression) -> Self {
+        Self { condition, ..self }
+    }
+
+    /// Returns a new If with the given `then` token
+    pub fn with_then_token(self, then_token: TokenReference) -> Self {
+        Self { then_token, ..self }
+    }
+
+    /// Returns a new If with the given block
+    pub fn with_block(self, block: Block) -> Self {
+        Self { block, ..self }
+    }
+
+    /// Returns a new If with the given list of `elseif` blocks
+    pub fn with_else_if(self, else_if: Option<Vec<ElseIf>>) -> Self {
+        Self { else_if, ..self }
+    }
+
+    /// Returns a new If with the given `else` token
+    pub fn with_else_token(self, else_token: Option<TokenReference>) -> Self {
+        Self { else_token, ..self }
+    }
+
+    /// Returns a new If with the given `else` body
+    pub fn with_else(self, r#else: Option<Block>) -> Self {
+        Self { r#else, ..self }
+    }
+
+    /// Returns a new If with the given `end` token
+    pub fn with_end_token(self, end_token: TokenReference) -> Self {
+        Self { end_token, ..self }
+    }
+}
+
+/// An elseif block in a bigger [`If`] statement
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{else_if_token}{condition}{then_token}{block}")]
+pub struct ElseIf {
+    else_if_token: TokenReference,
+    condition: Expression,
+    then_token: TokenReference,
+    block: Block,
+}
+
+impl ElseIf {
+    /// Creates a new ElseIf from the given condition
+    pub fn new(condition: Expression) -> Self {
+        Self {
+            else_if_token: TokenReference::basic_symbol("elseif "),
+            condition,
+            then_token: TokenReference::basic_symbol(" then\n"),
+            block: Block::new(),
+        }
+    }
+
+    /// The `elseif` token
+    pub fn else_if_token(&self) -> &TokenReference {
+        &self.else_if_token
+    }
+
+    /// The condition of the `elseif`, `condition` in `elseif condition then`
+    pub fn condition(&self) -> &Expression {
+        &self.condition
+    }
+
+    /// The `then` token
+    pub fn then_token(&self) -> &TokenReference {
+        &self.then_token
+    }
+
+    /// The body of the `elseif`
+    pub fn block(&self) -> &Block {
+        &self.block
+    }
+
+    /// Returns a new ElseIf with the given `elseif` token
+    pub fn with_else_if_token(self, else_if_token: TokenReference) -> Self {
+        Self { else_if_token, ..self }
+    }
+
+    /// Returns a new ElseIf with the given condition
+    pub fn with_condition(self, condition: Expression) -> Self {
+        Self { condition, ..self }
+    }
+
+    /// Returns a new ElseIf with the given `then` token
+    pub fn with_then_token(self, then_token: TokenReference) -> Self {
+        Self { then_token, ..self }
+    }
+
+    /// Returns a new ElseIf with the given block
+    pub fn with_block(self, block: Block) -> Self {
+        Self { block, ..self }
+    }
+}
+
+/// A while loop
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{while_token}{condition}{do_token}{block}{end_token}")]
+pub struct While {
+    while_token: TokenReference,
+    condition: Expression,
+    do_token: TokenReference,
+    block: Block,
+    end_token: TokenReference,
+}
+
+impl While {
+    /// Creates a new While from the given condition
+    pub fn new(condition: Expression) -> Self {
+        Self {
+            while_token: TokenReference::basic_symbol("while "),
+            condition,
+            do_token: TokenReference::basic_symbol(" do\n"),
+            block: Block::new(),
+            end_token: TokenReference::basic_symbol("end\n"),
+        }
+    }
+
+    /// The `while` token
+    pub fn while_token(&self) -> &TokenReference {
+        &self.while_token
+    }
+
+    /// The `condition` part of `while condition do`
+    pub fn condition(&self) -> &Expression {
+        &self.condition
+    }
+
+    /// The `do` token
+    pub fn do_token(&self) -> &TokenReference {
+        &self.do_token
+    }
+
+    /// The code inside the while loop
+    pub fn block(&self) -> &Block {
+        &self.block
+    }
+
+    /// The `end` token
+    pub fn end_token(&self) -> &TokenReference {
+        &self.end_token
+    }
+
+    /// Returns a new While with the given `while` token
+    pub fn with_while_token(self, while_token: TokenReference) -> Self {
+        Self { while_token, ..self }
+    }
+
+    /// Returns a new While with the given condition
+    pub fn with_condition(self, condition: Expression) -> Self {
+        Self { condition, ..self }
+    }
+
+    /// Returns a new While with the given `do` token
+    pub fn with_do_token(self, do_token: TokenReference) -> Self {
+        Self { do_token, ..self }
+    }
+
+    /// Returns a new While with the given block
+    pub fn with_block(self, block: Block) -> Self {
+        Self { block, ..self }
+    }
+
+    /// Returns a new While with the given `end` token
+    pub fn with_end_token(self, end_token: TokenReference) -> Self {
+        Self { end_token, ..self }
+    }
+}
+
+/// A repeat loop
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{repeat_token}{block}{until_token}{until}")]
+pub struct Repeat {
+    repeat_token: TokenReference,
+    block: Block,
+    until_token: TokenReference,
+    until: Expression,
+}
+
+impl Repeat {
+    /// Creates a new Repeat from the given expression to repeat until
+    pub fn new(until: Expression) -> Self {
+        Self {
+            repeat_token: TokenReference::basic_symbol("repeat\n"),
+            block: Block::new(),
+            until_token: TokenReference::basic_symbol("\nuntil "),
+            until,
+        }
+    }
+
+    /// The `repeat` token
+    pub fn repeat_token(&self) -> &TokenReference {
+        &self.repeat_token
+    }
+
+    /// The code inside the `repeat` block
+    pub fn block(&self) -> &Block {
+        &self.block
+    }
+
+    /// The `until` token
+    pub fn until_token(&self) -> &TokenReference {
+        &self.until_token
+    }
+
+    /// The condition for the `until` part
+    pub fn until(&self) -> &Expression {
+        &self.until
+    }
+
+    /// Returns a new Repeat with the given `repeat` token
+    pub fn with_repeat_token(self, repeat_token: TokenReference) -> Self {
+        Self { repeat_token, ..self }
+    }
+
+    /// Returns a new Repeat with the given block
+    pub fn with_block(self, block: Block) -> Self {
+        Self { block, ..self }
+    }
+
+    /// Returns a new Repeat with the given `until` token
+    pub fn with_until_token(self, until_token: TokenReference) -> Self {
+        Self { until_token, ..self }
+    }
+
+    /// Returns a new Repeat with the given `until` block
+    pub fn with_until(self, until: Expression) -> Self {
+        Self { until, ..self }
+    }
+}
+
+/// An attribute on a local variable, `<const>` in `local x <const>`
+#[derive(Clone, Debug, Display, PartialEq, Eq, Node, Visit, Deserialize, Serialize)]
+#[display("{}{name}{}", brackets.tokens().0, brackets.tokens().1)]
+pub struct Attribute {
+    #[node(full_range)]
+    #[visit(contains = "name")]
+    pub(crate) brackets: ContainedSpan,
+    pub(crate) name: TokenReference,
+}
+
+impl Attribute {
+    /// Creates a new Label with the given name
+    pub fn new(name: TokenReference) -> Self {
+        Self {
+            brackets: ContainedSpan::new(TokenReference::symbol("<").unwrap(), TokenReference::symbol(">").unwrap()),
+            name,
+        }
+    }
+
+    /// The name used for the attribute, the `const` part of `<const>`
+    pub fn name(&self) -> &TokenReference {
+        &self.name
+    }
+
+    /// The angle brackets (`<` and `>`) surrounding the attribute
+    pub fn brackets(&self) -> &ContainedSpan {
+        &self.brackets
+    }
+
+    /// Returns a new Attribute with the given attribute name
+    pub fn with_name(self, name: TokenReference) -> Self {
+        Self { name, ..self }
+    }
+
+    /// Returns a new Attribute with the given angle brackets
+    pub fn with_brackets(self, brackets: ContainedSpan) -> Self {
+        Self { brackets, ..self }
+    }
+}
+
+/// A method call, such as `x:y()`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{colon_token}{name}{args}")]
+pub struct MethodCall {
+    colon_token: TokenReference,
+    name: TokenReference,
+    args: FunctionArgs,
+}
+
+impl MethodCall {
+    /// Returns a new MethodCall from the given name and args
+    pub fn new(name: TokenReference, args: FunctionArgs) -> Self {
+        Self { colon_token: TokenReference::basic_symbol(":"), name, args }
+    }
+
+    /// The `:` in `x:y()`
+    pub fn colon_token(&self) -> &TokenReference {
+        &self.colon_token
+    }
+
+    /// The arguments of a method call, the `x, y, z` part of `method:call(x, y, z)`
+    pub fn args(&self) -> &FunctionArgs {
+        &self.args
+    }
+
+    /// The method being called, the `call` part of `method:call()`
+    pub fn name(&self) -> &TokenReference {
+        &self.name
+    }
+
+    /// Returns a new MethodCall with the given `:` token
+    pub fn with_colon_token(self, colon_token: TokenReference) -> Self {
+        Self { colon_token, ..self }
+    }
+
+    /// Returns a new MethodCall with the given name
+    pub fn with_name(self, name: TokenReference) -> Self {
+        Self { name, ..self }
+    }
+
+    /// Returns a new MethodCall with the given args
+    pub fn with_args(self, args: FunctionArgs) -> Self {
+        Self { args, ..self }
+    }
+}
+
+/// Something being called
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum Call {
+    #[display("{_0}")]
+    /// A function being called directly, such as `x(1)`
+    AnonymousCall(FunctionArgs),
+
+    #[display("{_0}")]
+    /// A method call, such as `x:y()`
+    MethodCall(MethodCall),
+}
+
+/// A function body, everything except `function x` in `function x(a, b, c) call() end`
+#[derive(Clone, Debug, PartialEq, Display, Node, Deserialize, Serialize)]
+#[display("{}{}{}{}{block}{end_token}",
+    parameters_parentheses.tokens().0,
+    join_type_specifiers(parameters, self.type_specifiers()),
+    parameters_parentheses.tokens().1,
+    display_option(return_type.as_ref()),
+)]
+pub struct FunctionBody {
+    parameters_parentheses: ContainedSpan,
+    parameters: Punctuated<Parameter>,
+
+    type_specifiers: Vec<Option<TypeSpecifier>>,
+
+    #[serde(skip_serializing_if = "Option::is_none")]
+    return_type: Option<TypeSpecifier>,
+
+    block: Block,
+    end_token: TokenReference,
+}
+
+impl FunctionBody {
+    /// Returns a new empty FunctionBody
+    pub fn new() -> Self {
+        Self {
+            parameters_parentheses: ContainedSpan::new(
+                TokenReference::basic_symbol("("),
+                TokenReference::basic_symbol(")"),
+            ),
+            parameters: Punctuated::new(),
+            type_specifiers: Vec::new(),
+            return_type: None,
+            block: Block::new(),
+            end_token: TokenReference::basic_symbol("\nend"),
+        }
+    }
+
+    /// The parentheses of the parameters
+    pub fn parameters_parentheses(&self) -> &ContainedSpan {
+        &self.parameters_parentheses
+    }
+
+    /// Returns the [`Punctuated`] sequence of the parameters for the function declaration
+    pub fn parameters(&self) -> &Punctuated<Parameter> {
+        &self.parameters
+    }
+
+    /// The code of a function body
+    pub fn block(&self) -> &Block {
+        &self.block
+    }
+
+    /// The mutable code of a function body
+    pub fn block_mut(&mut self) -> &mut Block {
+        &mut self.block
+    }
+
+    /// The `end` token
+    pub fn end_token(&self) -> &TokenReference {
+        &self.end_token
+    }
+
+    /// The type specifiers of the variables, in the order that they were assigned.
+    /// `(foo: number, bar, baz: boolean)` returns an iterator containing:
+    /// `Some(TypeSpecifier(number)), None, Some(TypeSpecifier(boolean))`
+    pub fn type_specifiers(&self) -> impl Iterator<Item = Option<&TypeSpecifier>> {
+        self.type_specifiers.iter().map(Option::as_ref)
+    }
+
+    /// The return type of the function, if one exists.
+    pub fn return_type(&self) -> Option<&TypeSpecifier> {
+        self.return_type.as_ref()
+    }
+
+    /// Returns a new FunctionBody with the given parentheses for the parameters
+    pub fn with_parameters_parentheses(self, parameters_parentheses: ContainedSpan) -> Self {
+        Self { parameters_parentheses, ..self }
+    }
+
+    /// Returns a new FunctionBody with the given parameters
+    pub fn with_parameters(self, parameters: Punctuated<Parameter>) -> Self {
+        Self { parameters, ..self }
+    }
+
+    /// Returns a new FunctionBody with the given type specifiers
+    pub fn with_type_specifiers(self, type_specifiers: Vec<Option<TypeSpecifier>>) -> Self {
+        Self { type_specifiers, ..self }
+    }
+
+    /// Returns a new FunctionBody with the given return type
+    pub fn with_return_type(self, return_type: Option<TypeSpecifier>) -> Self {
+        Self { return_type, ..self }
+    }
+
+    /// Returns a new FunctionBody with the given block
+    pub fn with_block(self, block: Block) -> Self {
+        Self { block, ..self }
+    }
+
+    /// Returns a new FunctionBody with the given `end` token
+    pub fn with_end_token(self, end_token: TokenReference) -> Self {
+        Self { end_token, ..self }
+    }
+}
+
+impl Default for FunctionBody {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+/// A name parameter in a function declaration, such as `function x(a, b, c)`
+#[derive(Clone, Debug, Display, Deref, PartialEq, Eq, Node, Visit, Deserialize, Serialize)]
+#[display("{name}")]
+pub struct Parameter {
+    name: TokenReference,
+}
+
+/// A suffix in certain cases, such as `:y()` in `x:y()`
+/// Can be stacked on top of each other, such as in `x()()()`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum Suffix {
+    #[display("{_0}")]
+    /// A call, including method calls and direct calls
+    Call(Call),
+
+    #[display("{_0}")]
+    /// An index, such as `x.y`
+    Index(Index),
+}
+
+/// A complex expression used by [`Var`], consisting of both a prefix and suffixes
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{prefix}{}", join_vec(suffixes))]
+pub struct VarExpression {
+    prefix: Prefix,
+    suffixes: Vec<Suffix>,
+}
+
+impl VarExpression {
+    /// Returns a new VarExpression from the given prefix
+    pub fn new(prefix: Prefix) -> Self {
+        Self { prefix, suffixes: Vec::new() }
+    }
+
+    /// The prefix of the expression, such as a name
+    pub fn prefix(&self) -> &Prefix {
+        &self.prefix
+    }
+
+    /// An iter over the suffixes, such as indexing or calling
+    pub fn suffixes(&self) -> impl Iterator<Item = &Suffix> {
+        self.suffixes.iter()
+    }
+
+    /// Returns a new VarExpression with the given prefix
+    pub fn with_prefix(self, prefix: Prefix) -> Self {
+        Self { prefix, ..self }
+    }
+
+    /// Returns a new VarExpression with the given suffixes
+    pub fn with_suffixes(self, suffixes: Vec<Suffix>) -> Self {
+        Self { suffixes, ..self }
+    }
+}
+
+/// Used in [`Assignment`s](Assignment) and [`Value`s](Value)
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum Var {
+    /// An expression, such as `x.y.z` or `x()`
+    #[display("{_0}")]
+    Expression(Box<VarExpression>),
+
+    /// A literal identifier, such as `x`
+    #[display("{_0}")]
+    Name(TokenReference),
+}
+
+/// An assignment, such as `x = y`. Not used for [`LocalAssignment`s](LocalAssignment)
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{var_list}{equal_token}{expr_list}")]
+pub struct Assignment {
+    var_list: Punctuated<Var>,
+    equal_token: TokenReference,
+    expr_list: Punctuated<Expression>,
+}
+
+impl Assignment {
+    /// Returns a new Assignment from the given variable and expression list
+    pub fn new(var_list: Punctuated<Var>, expr_list: Punctuated<Expression>) -> Self {
+        Self { var_list, equal_token: TokenReference::basic_symbol(" = "), expr_list }
+    }
+
+    /// Returns the punctuated sequence over the expressions being assigned.
+    /// This is the the `1, 2` part of `x, y["a"] = 1, 2`
+    pub fn expressions(&self) -> &Punctuated<Expression> {
+        &self.expr_list
+    }
+
+    /// The `=` token in between `x = y`
+    pub fn equal_token(&self) -> &TokenReference {
+        &self.equal_token
+    }
+
+    /// Returns the punctuated sequence over the variables being assigned to.
+    /// This is the `x, y["a"]` part of `x, y["a"] = 1, 2`
+    pub fn variables(&self) -> &Punctuated<Var> {
+        &self.var_list
+    }
+
+    /// Returns a new Assignment with the given variables
+    pub fn with_variables(self, var_list: Punctuated<Var>) -> Self {
+        Self { var_list, ..self }
+    }
+
+    /// Returns a new Assignment with the given `=` token
+    pub fn with_equal_token(self, equal_token: TokenReference) -> Self {
+        Self { equal_token, ..self }
+    }
+
+    /// Returns a new Assignment with the given expressions
+    pub fn with_expressions(self, expr_list: Punctuated<Expression>) -> Self {
+        Self { expr_list, ..self }
+    }
+}
+
+/// An import directive, such as `import "math"`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{import_token}{name}")]
+pub struct Import {
+    import_token: TokenReference,
+    name: TokenReference,
+}
+
+impl Import {
+    /// Returns a new LocalFunction from the given name
+    pub fn new(name: TokenReference) -> Self {
+        Import { import_token: TokenReference::basic_symbol("import "), name }
+    }
+
+    /// The `import` token
+    pub fn import_token(&self) -> &TokenReference {
+        &self.import_token
+    }
+
+    /// The name of the module to import, the `x` part of `import "x"`
+    pub fn name(&self) -> &TokenReference {
+        &self.name
+    }
+
+    /// Returns a new Import with the given `import` token
+    pub fn with_import_token(self, import_token: TokenReference) -> Self {
+        Self { import_token, ..self }
+    }
+
+    /// Returns a new Import with the given name
+    pub fn with_name(self, name: TokenReference) -> Self {
+        Self { name, ..self }
+    }
+}
+
+/// A declaration of a local function, such as `local function x() end`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{local_token}{function_token}{name}{body}")]
+pub struct LocalFunction {
+    local_token: TokenReference,
+    function_token: TokenReference,
+    name: TokenReference,
+    body: FunctionBody,
+}
+
+impl LocalFunction {
+    /// Returns a new LocalFunction from the given name
+    pub fn new(name: TokenReference) -> Self {
+        LocalFunction {
+            local_token: TokenReference::basic_symbol("local "),
+            function_token: TokenReference::basic_symbol("function "),
+            name,
+            body: FunctionBody::new(),
+        }
+    }
+
+    /// The `local` token
+    pub fn local_token(&self) -> &TokenReference {
+        &self.local_token
+    }
+
+    /// The `function` token
+    pub fn function_token(&self) -> &TokenReference {
+        &self.function_token
+    }
+
+    /// The function body, everything except `local function x` in `local function x(a, b, c) call() end`
+    pub fn body(&self) -> &FunctionBody {
+        &self.body
+    }
+
+    /// The name of the function, the `x` part of `local function x() end`
+    pub fn name(&self) -> &TokenReference {
+        &self.name
+    }
+
+    /// Returns a new LocalFunction with the given `local` token
+    pub fn with_local_token(self, local_token: TokenReference) -> Self {
+        Self { local_token, ..self }
+    }
+
+    /// Returns a new LocalFunction with the given `function` token
+    pub fn with_function_token(self, function_token: TokenReference) -> Self {
+        Self { function_token, ..self }
+    }
+
+    /// Returns a new LocalFunction with the given name
+    pub fn with_name(self, name: TokenReference) -> Self {
+        Self { name, ..self }
+    }
+
+    /// Returns a new LocalFunction with the given function body
+    pub fn with_body(self, body: FunctionBody) -> Self {
+        Self { body, ..self }
+    }
+}
+
+/// An assignment to a local variable, such as `local x = 1`
+#[derive(Clone, Debug, PartialEq, Display, Node, Deserialize, Serialize)]
+#[display("{local_token}{}{}{expr_list}",
+    join_iterators(name_list,
+        self.attributes().chain(std::iter::repeat(None)),
+        self.type_specifiers().chain(std::iter::repeat(None))
+    ),
+    display_option(equal_token),
+)]
+pub struct LocalAssignment {
+    local_token: TokenReference,
+
+    #[serde(skip_serializing_if = "empty_optional_vector")]
+    type_specifiers: Vec<Option<TypeSpecifier>>,
+    name_list: Punctuated<TokenReference>,
+
+    #[serde(skip_serializing_if = "empty_optional_vector")]
+    attributes: Vec<Option<Attribute>>,
+    equal_token: Option<TokenReference>,
+    expr_list: Punctuated<Expression>,
+}
+
+impl LocalAssignment {
+    /// Returns a new LocalAssignment from the given name list
+    pub fn new(name_list: Punctuated<TokenReference>) -> Self {
+        Self {
+            local_token: TokenReference::basic_symbol("local "),
+            type_specifiers: Vec::new(),
+            name_list,
+            attributes: Vec::new(),
+            equal_token: None,
+            expr_list: Punctuated::new(),
+        }
+    }
+
+    /// The `local` token
+    pub fn local_token(&self) -> &TokenReference {
+        &self.local_token
+    }
+
+    /// The `=` token in between `local x = y`, if one exists
+    pub fn equal_token(&self) -> Option<&TokenReference> {
+        self.equal_token.as_ref()
+    }
+
+    /// Returns the punctuated sequence of the expressions being assigned.
+    /// This is the `1, 2` part of `local x, y = 1, 2`
+    pub fn expressions(&self) -> &Punctuated<Expression> {
+        &self.expr_list
+    }
+
+    /// Returns the punctuated sequence of names being assigned to.
+    /// This is the `x, y` part of `local x, y = 1, 2`
+    pub fn names(&self) -> &Punctuated<TokenReference> {
+        &self.name_list
+    }
+
+    /// The type specifiers of the variables, in the order that they were assigned.
+    /// `local foo: number, bar, baz: boolean` returns an iterator containing:
+    /// `Some(TypeSpecifier(number)), None, Some(TypeSpecifier(boolean))`
+    pub fn type_specifiers(&self) -> impl Iterator<Item = Option<&TypeSpecifier>> {
+        self.type_specifiers.iter().map(Option::as_ref)
+    }
+
+    /// The attributes specified for the variables, in the order that they were assigned.
+    /// `local foo <const>, bar, baz <close>` returns an iterator containing:
+    /// `Some(Attribute("const")), None, Some(Attribute("close"))`
+    pub fn attributes(&self) -> impl Iterator<Item = Option<&Attribute>> {
+        self.attributes.iter().map(Option::as_ref)
+    }
+
+    /// Returns a new LocalAssignment with the given `local` token
+    pub fn with_local_token(self, local_token: TokenReference) -> Self {
+        Self { local_token, ..self }
+    }
+
+    /// Returns a new LocalAssignment with the given type specifiers
+    pub fn with_type_specifiers(self, type_specifiers: Vec<Option<TypeSpecifier>>) -> Self {
+        Self { type_specifiers, ..self }
+    }
+
+    /// Returns a new LocalAssignment with the given attributes
+    pub fn with_attributes(self, attributes: Vec<Option<Attribute>>) -> Self {
+        Self { attributes, ..self }
+    }
+
+    /// Returns a new LocalAssignment with the given name list
+    pub fn with_names(self, name_list: Punctuated<TokenReference>) -> Self {
+        Self { name_list, ..self }
+    }
+
+    /// Returns a new LocalAssignment with the given `=` token
+    pub fn with_equal_token(self, equal_token: Option<TokenReference>) -> Self {
+        Self { equal_token, ..self }
+    }
+
+    /// Returns a new LocalAssignment with the given expression list
+    pub fn with_expressions(self, expr_list: Punctuated<Expression>) -> Self {
+        Self { expr_list, ..self }
+    }
+}
+
+/// A `do` block, such as `do ... end`
+/// This is not used for things like `while true do end`, only those on their own
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{do_token}{block}{end_token}")]
+pub struct Do {
+    do_token: TokenReference,
+    block: Block,
+    end_token: TokenReference,
+}
+
+impl Do {
+    /// Creates an empty Do
+    pub fn new() -> Self {
+        Self {
+            do_token: TokenReference::basic_symbol("do\n"),
+            block: Block::new(),
+            end_token: TokenReference::basic_symbol("\nend"),
+        }
+    }
+
+    /// The `do` token
+    pub fn do_token(&self) -> &TokenReference {
+        &self.do_token
+    }
+
+    /// The code inside the `do ... end`
+    pub fn block(&self) -> &Block {
+        &self.block
+    }
+
+    /// The `end` token
+    pub fn end_token(&self) -> &TokenReference {
+        &self.end_token
+    }
+
+    /// Returns a new Do with the given `do` token
+    pub fn with_do_token(self, do_token: TokenReference) -> Self {
+        Self { do_token, ..self }
+    }
+
+    /// Returns a new Do with the given block
+    pub fn with_block(self, block: Block) -> Self {
+        Self { block, ..self }
+    }
+
+    /// Returns a new Do with the given `end` token
+    pub fn with_end_token(self, end_token: TokenReference) -> Self {
+        Self { end_token, ..self }
+    }
+}
+
+impl Default for Do {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+/// A function being called, such as `call()`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{prefix}{}", join_vec(suffixes))]
+pub struct FunctionCall {
+    prefix: Prefix,
+    suffixes: Vec<Suffix>,
+}
+
+impl FunctionCall {
+    /// Creates a new FunctionCall from the given prefix
+    /// Sets the suffixes such that the return is `prefixes()`
+    pub fn new(prefix: Prefix) -> Self {
+        FunctionCall {
+            prefix,
+            suffixes: vec![Suffix::Call(Call::AnonymousCall(FunctionArgs::Parentheses {
+                arguments: Punctuated::new(),
+                parentheses: ContainedSpan::new(TokenReference::basic_symbol("("), TokenReference::basic_symbol(")")),
+            }))],
+        }
+    }
+
+    /// The prefix of a function call, the `call` part of `call()`
+    pub fn prefix(&self) -> &Prefix {
+        &self.prefix
+    }
+
+    /// The suffix of a function call, the `()` part of `call()`
+    pub fn suffixes(&self) -> impl Iterator<Item = &Suffix> {
+        self.suffixes.iter()
+    }
+
+    /// Returns a new FunctionCall with the given prefix
+    pub fn with_prefix(self, prefix: Prefix) -> Self {
+        Self { prefix, ..self }
+    }
+
+    /// Returns a new FunctionCall with the given suffixes
+    pub fn with_suffixes(self, suffixes: Vec<Suffix>) -> Self {
+        Self { suffixes, ..self }
+    }
+}
+
+/// A function name when being declared as [`FunctionDeclaration`]
+#[derive(Clone, Debug, Display, PartialEq, Eq, Node, Visit, Deserialize, Serialize)]
+#[display("{names}{}{}",
+    display_option(self.method_colon()),
+    display_option(self.method_name())
+)]
+pub struct FunctionName {
+    names: Punctuated<TokenReference>,
+    colon_name: Option<(TokenReference, TokenReference)>,
+}
+
+impl FunctionName {
+    /// Creates a new FunctionName from the given list of names
+    pub fn new(names: Punctuated<TokenReference>) -> Self {
+        Self { names, colon_name: None }
+    }
+
+    /// The colon between the name and the method, the `:` part of `function x:y() end`
+    pub fn method_colon(&self) -> Option<&TokenReference> {
+        Some(&self.colon_name.as_ref()?.0)
+    }
+
+    /// A method name if one exists, the `y` part of `function x:y() end`
+    pub fn method_name(&self) -> Option<&TokenReference> {
+        Some(&self.colon_name.as_ref()?.1)
+    }
+
+    /// Returns the punctuated sequence over the names used when defining the function.
+    /// This is the `x.y.z` part of `function x.y.z() end`
+    pub fn names(&self) -> &Punctuated<TokenReference> {
+        &self.names
+    }
+
+    /// Returns a new FunctionName with the given names
+    pub fn with_names(self, names: Punctuated<TokenReference>) -> Self {
+        Self { names, ..self }
+    }
+
+    /// Returns a new FunctionName with the given method name
+    /// The first token is the colon, and the second token is the method name itself
+    pub fn with_method(self, method: Option<(TokenReference, TokenReference)>) -> Self {
+        Self { colon_name: method, ..self }
+    }
+}
+
+/// A normal function declaration, supports simple declarations like `function x() end`
+/// as well as complicated declarations such as `function x.y.z:a() end`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{function_token}{name}{body}")]
+pub struct FunctionDeclaration {
+    function_token: TokenReference,
+    name: FunctionName,
+    body: FunctionBody,
+}
+
+impl FunctionDeclaration {
+    /// Creates a new FunctionDeclaration from the given name
+    pub fn new(name: FunctionName) -> Self {
+        Self { function_token: TokenReference::basic_symbol("function "), name, body: FunctionBody::new() }
+    }
+
+    /// The `function` token
+    pub fn function_token(&self) -> &TokenReference {
+        &self.function_token
+    }
+
+    /// The body of the function
+    pub fn body(&self) -> &FunctionBody {
+        &self.body
+    }
+
+    /// The name of the function
+    pub fn name(&self) -> &FunctionName {
+        &self.name
+    }
+
+    /// Returns a new FunctionDeclaration with the given `function` token
+    pub fn with_function_token(self, function_token: TokenReference) -> Self {
+        Self { function_token, ..self }
+    }
+
+    /// Returns a new FunctionDeclaration with the given function name
+    pub fn with_name(self, name: FunctionName) -> Self {
+        Self { name, ..self }
+    }
+
+    /// Returns a new FunctionDeclaration with the given function body
+    pub fn with_body(self, body: FunctionBody) -> Self {
+        Self { body, ..self }
+    }
+}
+
+/// An option declaration, such as `option x : number = 1`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{option_token}{}{equal_token}{expr_list}",
+    join_type_specifiers(&self.name_list, self.type_specifiers())
+)]
+pub struct OptionDecl {
+    option_token: TokenReference,
+
+    name_list: Punctuated<TokenReference>,
+
+    #[serde(skip_serializing_if = "empty_optional_vector")]
+    type_specifiers: Vec<Option<TypeSpecifier>>,
+
+    equal_token: TokenReference,
+    expr_list: Punctuated<Expression>,
+}
+
+impl OptionDecl {
+    /// Get the declarations of this option declaration statement.
+    pub fn declarations(&self) -> impl Iterator<Item = (&TokenReference, Option<&TypeSpecifier>, &Expression)> {
+        self.name_list
+            .iter()
+            .zip(&self.type_specifiers)
+            .zip(&self.expr_list)
+            .map(|((name, type_specifier), expression)| (name, type_specifier.as_ref(), expression))
+    }
+}
+
+/// A call list item. We need a call list to know how to a job from the...
+#[derive(Clone, Debug, PartialEq, Display, Node, Visit, Deserialize, Serialize)]
+pub enum CallListItem {
+    /// A reference to a variable, e.g. `"init"`
+    #[display("{_0}")]
+    Variable(TokenReference),
+
+    /// Setting of a parameter for the job, e.g. `pre_line = 900`
+    #[display("{parameter}{equal_token}{expression}")]
+    SetParameter {
+        /// The name of the parameter to set for a given job, must be an argument of said job
+        parameter: TokenReference,
+
+        /// The `=` token of the assignation
+        equal_token: TokenReference,
+
+        /// The value to set for the given parameter in the given job.
+        expression: Expression,
+    },
+}
+
+impl CallListItem {
+    /// Returns the last token, for any variant of this enum.
+    pub fn first_token(&self) -> &TokenReference {
+        match self {
+            CallListItem::SetParameter { parameter: first, .. } | CallListItem::Variable(first) => first,
+        }
+    }
+}
+
+/// The call list for a job, e.g. `{ param = 1, "init" }`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize, Default)]
+#[display("{}{items}{}", display_option(begin_token), display_option(end_token))]
+pub struct CallList {
+    begin_token: Option<TokenReference>,
+    items: Punctuated<CallListItem>,
+    end_token: Option<TokenReference>,
+}
+
+impl CallList {
+    /// Create a new empty call list
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    /// Set the `{` token for the call list
+    pub fn with_begin_token(self, begin_token: Option<TokenReference>) -> Self {
+        Self { begin_token, ..self }
+    }
+
+    /// Set the `}` token for the call list
+    pub fn with_end_token(self, end_token: Option<TokenReference>) -> Self {
+        Self { end_token, ..self }
+    }
+
+    /// Set the items in this list
+    pub fn with_items(self, items: Punctuated<CallListItem>) -> Self {
+        Self { items, ..self }
+    }
+
+    /// Get the items out of the call list.
+    pub fn items(&self) -> &Punctuated<CallListItem> {
+        &self.items
+    }
+}
+
+/// The main assignement statement, only inside the `main` statement.
+///
+/// ```vivy
+/// "OUTLINED" = utils:outline { "BEFORE", "INIT", "AFTER" }
+/// "TAGGED"   = tag:syl_modulo { every = 3, disp = 1, "OUTLINED" }
+/// ```
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{variable}{assign_token}{module_name}{dot_token}{job_name}{call_list}")]
+pub struct MainAssignement {
+    variable: TokenReference,
+    assign_token: TokenReference,
+
+    module_name: TokenReference,
+    dot_token: TokenReference,
+    job_name: TokenReference,
+
+    call_list: CallList,
+}
+
+impl MainAssignement {
+    /// Create a new assign statement, only inside the `main` statement.
+    pub fn new(
+        assign_token: TokenReference,
+        variable: TokenReference,
+        module_name: TokenReference,
+        dot_token: TokenReference,
+        job_name: TokenReference,
+    ) -> Self {
+        Self { assign_token, variable, module_name, dot_token, job_name, call_list: Default::default() }
+    }
+
+    /// Set the call-list for this invocation of a job.
+    pub fn with_call_list(self, call_list: CallList) -> Self {
+        Self { call_list, ..self }
+    }
+
+    /// Get the called job out of the assignation
+    pub fn called_job(&self) -> (&TokenReference, &TokenReference) {
+        (&self.module_name, &self.job_name)
+    }
+
+    /// Get the called job out of the assignation as identifiers, otherwise panic. If the program
+    /// is correct and the parser is Ok, this should never panic
+    pub fn called_job_identifiers(&self) -> (&ShortString, &ShortString) {
+        let (module, job) = self.called_job();
+        match (module.token_type(), job.token_type()) {
+            (TokenType::Identifier { identifier: m }, TokenType::Identifier { identifier: j }) => (m, j),
+            _ => unreachable!("module and job names should be identifiers"),
+        }
+    }
+
+    /// Get the call list to know how to call the job.
+    pub fn call_list(&self) -> &CallList {
+        &self.call_list
+    }
+
+    /// Get the items of the call list to know how to call the job.
+    pub fn call_list_items(&self) -> impl Iterator<Item = &CallListItem> {
+        self.call_list.items().into_iter()
+    }
+
+    /// Get the name of the written variable
+    pub fn destination(&self) -> &TokenReference {
+        &self.variable
+    }
+}
+
+/// The main statement: `main "INIT" { ... }`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display(
+    "{main_token}{initial_variable}{begin_token}{}{}{end_token}",
+    join_vec(assignements),
+    display_option(write_stmt)
+)]
+pub struct Main {
+    main_token: TokenReference,
+    initial_variable: TokenReference,
+    begin_token: TokenReference,
+    assignements: Vec<MainAssignement>,
+    write_stmt: Option<Write>,
+    end_token: TokenReference,
+}
+
+impl Main {
+    /// Create a new empty main statement.
+    pub fn new(
+        main_token: TokenReference,
+        initial_variable: TokenReference,
+        begin_token: TokenReference,
+        end_token: TokenReference,
+    ) -> Self {
+        Self { main_token, begin_token, end_token, initial_variable, assignements: Vec::new(), write_stmt: None }
+    }
+
+    /// Get the `main` token.
+    pub fn main_token(&self) -> &TokenReference {
+        &self.main_token
+    }
+
+    /// Get the `do` token in `main do ... end`.
+    pub fn begin_list_token(&self) -> &TokenReference {
+        &self.begin_token
+    }
+
+    /// Get the `end` token in `main do ... end`.
+    pub fn end_list_token(&self) -> &TokenReference {
+        &self.end_token
+    }
+
+    /// Set the `return` variables to write, the token here
+    pub fn with_returns(self, write_stmt: Option<Write>) -> Self {
+        Self { write_stmt, ..self }
+    }
+
+    /// Set the assignements for the 'main' statement.
+    pub fn with_assignements(self, assignements: Vec<MainAssignement>) -> Self {
+        Self { assignements, ..self }
+    }
+
+    /// Get the assignations, i.e. the compute steps
+    pub fn assignements(&self) -> &[MainAssignement] {
+        &self.assignements
+    }
+
+    /// Get the written variables
+    pub fn returns(&self) -> Option<&Write> {
+        self.write_stmt.as_ref()
+    }
+
+    /// Get the name of the initial variable
+    pub fn initial_variable(&self) -> &TokenReference {
+        &self.initial_variable
+    }
+}
+
+/// The write directive, with the variables to write into the final file: `write "INIT"`.
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{write_token}{}{variable_list}{}",
+    display_option(self.begin_list_token()),
+    display_option(self.end_list_token())
+)]
+pub struct Write {
+    write_token: TokenReference,
+    begin_token: Option<TokenReference>,
+    variable_list: Punctuated<TokenReference>,
+    end_token: Option<TokenReference>,
+}
+
+impl Write {
+    /// Create a new empty write statement.
+    pub fn new(write_token: TokenReference) -> Self {
+        Self { write_token, begin_token: None, variable_list: Punctuated::new(), end_token: None }
+    }
+
+    /// Get the `write` token for this statement.
+    pub fn write_token(&self) -> &TokenReference {
+        &self.write_token
+    }
+
+    /// Get the list of variables to write
+    pub fn variables(&self) -> &Punctuated<TokenReference> {
+        &self.variable_list
+    }
+
+    /// Get the '{' token if present in the write statement.
+    pub fn begin_list_token(&self) -> Option<&TokenReference> {
+        self.begin_token.as_ref()
+    }
+
+    /// Get the '}' token if present in the write statement.
+    pub fn end_list_token(&self) -> Option<&TokenReference> {
+        self.end_token.as_ref()
+    }
+
+    /// Set the `}` token.
+    pub fn with_end_list_token(self, end_token: Option<TokenReference>) -> Self {
+        Self { end_token, ..self }
+    }
+
+    /// Set the `{` token.
+    pub fn with_begin_list_token(self, begin_token: Option<TokenReference>) -> Self {
+        Self { begin_token, ..self }
+    }
+
+    /// Set the list of variables to write.
+    pub fn with_variables(self, variable_list: Punctuated<TokenReference>) -> Self {
+        Self { variable_list, ..self }
+    }
+}
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! make_bin_op {
+    ($(#[$outer:meta])* { $(
+        $operator:ident = $precedence:expr,
+    )+ }) => {
+        paste::paste! {
+            #[derive(Clone, Debug, Display, PartialEq, Eq, Node, Visit, Deserialize, Serialize)]
+            #[non_exhaustive]
+            $(#[$outer])*
+            pub enum BinOp {
+                $(#[display("{_0}")] #[allow(missing_docs)] $operator(TokenReference),)+
+            }
+
+            impl BinOp {
+                /// The precedence of non-unary operator. The larger the number, the higher the precedence.
+                /// Shares the same precedence table as unary operators.
+                pub fn precedence_of_token(token: &TokenReference) -> Option<u8> {
+                    match token.token_type() {
+                        TokenType::Symbol { symbol } => match symbol {
+                            $(Symbol::$operator => Some($precedence),)+ _ => None,
+                        },
+                        _ => None
+                    }
+                }
+
+                /// The token associated with this operator
+                pub fn token(&self) -> &TokenReference {
+                    match self {
+                        $(BinOp::$operator(token) => token,)+
+                    }
+                }
+
+                pub(crate) fn consume(state: &mut ParserState) -> Option<Self> {
+                    match state.current().unwrap().token_type() {
+                        TokenType::Symbol { symbol } => match symbol {
+                            $(Symbol::$operator => { Some(BinOp::$operator(state.consume().unwrap())) },)+
+                            _ => None,
+                        },
+                        _ => None,
+                    }
+                }
+            }
+        }
+    };
+}
+
+make_bin_op!(
+    #[doc = "Operators that require two operands, such as X + Y or X - Y"]
+    #[visit(skip_visit_self)]
+    {
+        Caret = 12,
+
+        // At the 11° position we have the unary operations.
+
+        Percent = 10,
+        Slash = 10,
+        Star = 10,
+        DoubleSlash = 10,
+
+        Minus = 9,
+        Plus = 9,
+
+        TwoDots = 8,
+
+        DoubleGreaterThan = 7,
+        DoubleLesserThan = 7,
+
+        Ampersand = 6,
+
+        Tilde = 5,
+
+        Pipe = 4,
+
+        GreaterThan = 3,
+        GreaterThanEqual = 3,
+        LessThan = 3,
+        LessThanEqual = 3,
+        TildeEqual = 3,
+        TwoEqual = 3,
+
+        And = 2,
+
+        Or = 1,
+    }
+);
+
+impl BinOp {
+    /// The precedence of the operator. The larger the number, the higher the precedence.
+    /// See more at <http://www.lua.org/manual/5.1/manual.html#2.5.6>
+    pub fn precedence(&self) -> u8 {
+        BinOp::precedence_of_token(self.token()).expect("invalid token")
+    }
+
+    /// Whether the operator is right associative. If not, it is left associative.
+    /// See more at <https://www.lua.org/pil/3.5.html>
+    pub fn is_right_associative(&self) -> bool {
+        matches!(*self, BinOp::Caret(_) | BinOp::TwoDots(_))
+    }
+
+    /// Given a token, returns whether it is a right associative binary operator.
+    pub fn is_right_associative_token(token: &TokenReference) -> bool {
+        matches!(
+            token.token_type(),
+            TokenType::Symbol { symbol: Symbol::Caret } | TokenType::Symbol { symbol: Symbol::TwoDots }
+        )
+    }
+}
+
+/// Operators that require just one operand, such as #X
+#[derive(Clone, Debug, Display, PartialEq, Eq, Node, Visit, Deserialize, Serialize)]
+#[allow(missing_docs)]
+#[non_exhaustive]
+pub enum UnOp {
+    Minus(TokenReference),
+    Not(TokenReference),
+    Hash(TokenReference),
+    Tilde(TokenReference),
+}
+
+impl UnOp {
+    /// The token associated with the operator
+    pub fn token(&self) -> &TokenReference {
+        match self {
+            UnOp::Minus(token) | UnOp::Not(token) | UnOp::Hash(token) => token,
+            UnOp::Tilde(token) => token,
+        }
+    }
+
+    /// The precedence of unary operator. The larger the number, the higher the precedence.
+    /// Shares the same precedence table as binary operators.
+    pub fn precedence() -> u8 {
+        11
+    }
+}
+
+impl OptionDecl {
+    /// Returns a new OptionSet from the given name list
+    pub fn new(name_list: Punctuated<TokenReference>) -> Self {
+        Self {
+            option_token: TokenReference::basic_symbol("option "),
+            type_specifiers: Vec::new(),
+            name_list,
+            equal_token: TokenReference::basic_symbol("= "),
+            expr_list: Punctuated::new(),
+        }
+    }
+
+    /// Get the `option` token
+    pub fn option_token(&self) -> &TokenReference {
+        &self.option_token
+    }
+
+    /// Get the `=` token
+    pub fn equal_token(&self) -> &TokenReference {
+        &self.equal_token
+    }
+
+    /// Get the expressions
+    pub fn expressions(&self) -> &Punctuated<Expression> {
+        &self.expr_list
+    }
+
+    /// Get the names of the options to set
+    pub fn names(&self) -> &Punctuated<TokenReference> {
+        &self.name_list
+    }
+
+    /// Get the type specifiers
+    pub fn type_specifiers(&self) -> impl Iterator<Item = Option<&TypeSpecifier>> {
+        self.type_specifiers.iter().map(Option::as_ref)
+    }
+
+    /// Set the type specifiers
+    pub fn with_type_specifiers(self, type_specifiers: Vec<Option<TypeSpecifier>>) -> Self {
+        Self { type_specifiers, ..self }
+    }
+
+    /// Set the `option` token
+    pub fn with_option_token(self, option_token: TokenReference) -> Self {
+        Self { option_token, ..self }
+    }
+
+    /// Set the `=` token
+    pub fn with_equal_token(self, equal_token: TokenReference) -> Self {
+        Self { equal_token, ..self }
+    }
+
+    /// Set the expressions
+    pub fn with_expressions(self, expr_list: Punctuated<Expression>) -> Self {
+        Self { expr_list, ..self }
+    }
+}
+
+/// An error that occurs when creating the AST.
+#[derive(Clone, Debug, PartialEq, Eq, Display, Deserialize, Serialize)]
+#[display(
+    "unexpected token `{token}`. (starting from line {}, character {} and ending on line {}, character {})\nadditional information: {additional}",
+    self.range().0.line(),
+    self.range().0.character(),
+    self.range().1.line(),
+    self.range().1.character(),
+)]
+pub struct AstError {
+    /// The token that caused the error
+    token: Token,
+
+    /// Any additional information that could be provided for debugging
+    additional: Cow<'static, str>,
+
+    /// If set, this is the complete range of the error
+    #[serde(skip_serializing_if = "Option::is_none")]
+    range: Option<(Position, Position)>,
+}
+
+impl AstError {
+    /// Returns the token that caused the error
+    pub fn token(&self) -> &Token {
+        &self.token
+    }
+
+    /// Returns a human readable error message
+    pub fn error_message(&self) -> Cow<'static, str> {
+        self.additional.clone()
+    }
+
+    /// Returns the range of the error
+    pub fn range(&self) -> (Position, Position) {
+        self.range
+            .or_else(|| Some((self.token.start_position(), self.token.end_position())))
+            .unwrap()
+    }
+
+    /// Create an error from its parts, not really something we want to expose, but errors may come
+    /// from the passes and not the parse stage...
+    pub(crate) fn from_parts(token_reference: TokenReference, error: impl Into<Cow<'static, str>>) -> Self {
+        Self { token: token_reference.token().clone(), additional: error.into(), range: token_reference.range() }
+    }
+}
+
+impl std::error::Error for AstError {}
+
+/// An abstract syntax tree, contains all the nodes used in the code
+#[derive(Clone, Debug, Display, Deserialize, Serialize)]
+#[display("{nodes}{eof}")]
+pub struct Ast {
+    pub(crate) nodes: Block,
+    pub(crate) eof: TokenReference,
+}
+
+impl Ast {
+    /// Returns a new Ast with the given nodes
+    pub fn with_nodes(self, nodes: Block) -> Self {
+        Self { nodes, ..self }
+    }
+
+    /// Returns a new Ast with the given EOF token
+    pub fn with_eof(self, eof: TokenReference) -> Self {
+        Self { eof, ..self }
+    }
+
+    /// The entire code of the function
+    pub fn nodes(&self) -> &Block {
+        &self.nodes
+    }
+
+    /// The entire code of the function, but mutable
+    pub fn nodes_mut(&mut self) -> &mut Block {
+        &mut self.nodes
+    }
+
+    /// The EOF token at the end of every Ast
+    pub fn eof(&self) -> &TokenReference {
+        &self.eof
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::{prelude::parser::parse_lua_tree, visitors::VisitorMut};
+
+    #[test]
+    fn test_with_eof_safety() {
+        print!("{}", {
+            let ast = parse_lua_tree("local foo = 1").unwrap();
+            let eof = ast.eof().clone();
+            ast.with_eof(eof)
+        });
+    }
+
+    #[test]
+    fn test_with_nodes_safety() {
+        print!("{}", {
+            let ast = parse_lua_tree("local foo = 1").unwrap();
+            let nodes = ast.nodes().clone();
+            ast.with_nodes(nodes)
+        });
+    }
+
+    #[test]
+    fn test_with_visitor_safety() {
+        print!("{}", {
+            let ast = parse_lua_tree("local foo = 1").unwrap();
+            struct SyntaxRewriter;
+            impl VisitorMut for SyntaxRewriter {
+                fn visit_token(&mut self, token: Token) -> Token {
+                    token
+                }
+            }
+            SyntaxRewriter.visit_ast(ast)
+        });
+    }
+
+    // Tests AST nodes with new methods that call unwrap
+    #[test]
+    fn test_new_validity() {
+        let token: TokenReference =
+            TokenReference::new(Vec::new(), Token::new(TokenType::Identifier { identifier: "foo".into() }), Vec::new());
+
+        let expression = Expression::Var(Var::Name(token.clone()));
+
+        Assignment::new(Punctuated::new(), Punctuated::new());
+        Do::new();
+        ElseIf::new(expression.clone());
+        FunctionBody::new();
+        FunctionCall::new(Prefix::Name(token.clone()));
+        FunctionDeclaration::new(FunctionName::new(Punctuated::new()));
+        GenericFor::new(Punctuated::new(), Punctuated::new());
+        If::new(expression.clone());
+        LocalAssignment::new(Punctuated::new());
+        LocalFunction::new(token.clone());
+        MethodCall::new(
+            token.clone(),
+            FunctionArgs::Parentheses {
+                arguments: Punctuated::new(),
+                parentheses: ContainedSpan::new(token.clone(), token.clone()),
+            },
+        );
+        NumericFor::new(token, expression.clone(), expression.clone());
+        Repeat::new(expression.clone());
+        Return::new();
+        TableConstructor::new();
+        While::new(expression);
+    }
+
+    #[test]
+    fn test_local_assignment_print() {
+        let block = Block::new().with_stmts(vec![(
+            Stmt::LocalAssignment(
+                LocalAssignment::new(
+                    std::iter::once(Pair::End(TokenReference::new(
+                        vec![],
+                        Token::new(TokenType::Identifier { identifier: "variable".into() }),
+                        vec![],
+                    )))
+                    .collect(),
+                )
+                .with_equal_token(Some(TokenReference::symbol(" = ").unwrap()))
+                .with_expressions(
+                    std::iter::once(Pair::End(Expression::Number(TokenReference::new(
+                        vec![],
+                        Token::new(TokenType::Number { text: "1".into() }),
+                        vec![],
+                    ))))
+                    .collect(),
+                ),
+            ),
+            None,
+        )]);
+
+        let ast = parse_lua_tree("").unwrap().with_nodes(block);
+        assert_eq!(format!("{ast}"), "local variable = 1");
+    }
+}
+
+/// Any type, such as `string`, `boolean?`, etc.
+#[derive(Clone, Debug, Display, IsVariant, PartialEq, Node, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum TypeInfo {
+    /// A shorthand type annotating the structure of an array: { number }
+    #[display("{}{type_info}{}", braces.tokens().0, braces.tokens().1)]
+    Array {
+        /// The braces (`{}`) containing the type info.
+        braces: ContainedSpan,
+
+        /// The type info for the values in the Array
+        type_info: Box<TypeInfo>,
+    },
+
+    /// A standalone type, such as `string` or `Foo`.
+    #[display("{_0}")]
+    Basic(TokenReference),
+
+    /// A callback type, such as `(string, number) => boolean`.
+    #[display("{}{arguments}{}{arrow}{return_type}", parentheses.tokens().0, parentheses.tokens().1)]
+    Callback {
+        /// The parentheses for the arguments.
+        parentheses: ContainedSpan,
+
+        /// The argument types: `(string, number)`.
+        arguments: Punctuated<TypeArgument>,
+
+        /// The "thin arrow" (`->`) in between the arguments and the return type.
+        arrow: TokenReference,
+
+        /// The return type: `boolean`.
+        return_type: Box<TypeInfo>,
+    },
+
+    /// An optional type, such as `string?`.
+    #[display("{base}{question_mark}")]
+    Optional {
+        /// The type that is optional: `string`.
+        base: Box<TypeInfo>,
+
+        /// The question mark: `?`.
+        question_mark: TokenReference,
+    },
+
+    /// A type annotating the structure of a table: { foo: number, bar: string }
+    #[display("{}{fields}{}", braces.tokens().0, braces.tokens().1)]
+    Table {
+        /// The braces (`{}`) containing the fields.
+        braces: ContainedSpan,
+
+        /// The fields: `foo: number, bar: string`.
+        fields: Punctuated<TypeField>,
+    },
+
+    /// A type in the form of `typeof(foo)`.
+    #[display("{typeof_token}{}{inner}{}", parentheses.tokens().0, parentheses.tokens().1)]
+    Typeof {
+        /// The token `typeof`.
+        typeof_token: TokenReference,
+
+        /// The parentheses used to contain the expression.
+        parentheses: ContainedSpan,
+
+        /// The inner expression: `foo`.
+        inner: Box<Expression>,
+    },
+
+    /// A tuple expression: `(string, number)`.
+    #[display("{}{types}{}", parentheses.tokens().0, parentheses.tokens().1)]
+    Tuple {
+        /// The parentheses used to contain the types
+        parentheses: ContainedSpan,
+
+        /// The types: `(string, number)`.
+        types: Punctuated<TypeInfo>,
+    },
+}
+
+macro_rules! basic_type_info {
+    ($type: ident, $($types: ident),+ $(,)?) => {
+        basic_type_info! { $type }
+        basic_type_info! { $($types),+ }
+    };
+
+    ($type: ident) => {
+        #[doc = concat!("Get the type for '", stringify!($type), "'")]
+        pub fn $type() -> &'static Self {
+            const _: () = assert!(stringify!($type).len() <= 23, "the type name can't be inline");
+            static TYPE_INFO: TypeInfo = TypeInfo::Basic(TokenReference::new(
+                vec![],
+                Token::new(TokenType::Identifier { identifier: ShortString::new_inline(stringify!($type)) }),
+                vec![])
+            );
+            &TYPE_INFO
+        }
+    };
+}
+
+impl TypeInfo {
+    basic_type_info! {
+        string, number, char, nil, table, aux, any,
+        line, lines, syllabe, syllabes,
+    }
+}
+
+impl Default for TypeInfo {
+    fn default() -> Self {
+        TypeInfo::nil().clone()
+    }
+}
+
+impl DefaultRef for TypeInfo {
+    fn default_ref() -> &'static Self {
+        TypeInfo::nil()
+    }
+}
+
+/// A type field used within table types.
+/// The `foo: number` in `{ foo: number }`.
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{key}{colon}{value}")]
+pub struct TypeField {
+    pub(crate) key: TypeFieldKey,
+    pub(crate) colon: TokenReference,
+    pub(crate) value: TypeInfo,
+}
+
+impl TypeField {
+    /// Creates a new TypeField from the given key and value
+    pub fn new(key: TypeFieldKey, value: TypeInfo) -> Self {
+        Self { key, colon: TokenReference::symbol(": ").unwrap(), value }
+    }
+
+    /// The key of the field, `foo` in `foo: number`.
+    pub fn key(&self) -> &TypeFieldKey {
+        &self.key
+    }
+
+    /// The colon in between the key name and the value type.
+    pub fn colon_token(&self) -> &TokenReference {
+        &self.colon
+    }
+
+    /// The type for the field, `number` in `foo: number`.
+    pub fn value(&self) -> &TypeInfo {
+        &self.value
+    }
+
+    /// Returns a new TypeField with the given key
+    pub fn with_key(self, key: TypeFieldKey) -> Self {
+        Self { key, ..self }
+    }
+
+    /// Returns a new TypeField with the `:` token
+    pub fn with_colon_token(self, colon_token: TokenReference) -> Self {
+        Self { colon: colon_token, ..self }
+    }
+
+    /// Returns a new TypeField with the `:` token
+    pub fn with_value(self, value: TypeInfo) -> Self {
+        Self { value, ..self }
+    }
+}
+
+/// A key in a [`TypeField`]. Can either be a name or an index signature.
+#[derive(Clone, Debug, Display, PartialEq, Node, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum TypeFieldKey {
+    /// A name, such as `foo`.
+    #[display("{_0}")]
+    Name(TokenReference),
+
+    /// An index signature, such as `[number]`.
+    #[display("{}{inner}{}", brackets.tokens().0, brackets.tokens().1)]
+    IndexSignature {
+        /// The brackets (`[]`) used to contain the type.
+        brackets: ContainedSpan,
+
+        /// The type for the index signature, `number` in `[number]`.
+        inner: TypeInfo,
+    },
+}
+
+/// A type assertion using `::`, such as `:: number`.
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{assertion_op}{cast_to}")]
+pub struct TypeAssertion {
+    pub(crate) assertion_op: TokenReference,
+    pub(crate) cast_to: TypeInfo,
+}
+
+impl TypeAssertion {
+    /// Creates a new TypeAssertion from the given cast to TypeInfo
+    pub fn new(cast_to: TypeInfo) -> Self {
+        Self { assertion_op: TokenReference::symbol("::").unwrap(), cast_to }
+    }
+
+    /// The token `::`.
+    pub fn assertion_op(&self) -> &TokenReference {
+        &self.assertion_op
+    }
+
+    /// The type to cast the expression into, `number` in `:: number`.
+    pub fn cast_to(&self) -> &TypeInfo {
+        &self.cast_to
+    }
+
+    /// Returns a new TypeAssertion with the given `::` token
+    pub fn with_assertion_op(self, assertion_op: TokenReference) -> Self {
+        Self { assertion_op, ..self }
+    }
+
+    /// Returns a new TypeAssertion with the given TypeInfo to cast to
+    pub fn with_cast_to(self, cast_to: TypeInfo) -> Self {
+        Self { cast_to, ..self }
+    }
+}
+
+/// A type declaration, such as `type Meters = number`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{type_token}{base}{equal_token}{declare_as}")]
+pub struct TypeDeclaration {
+    pub(crate) type_token: TokenReference,
+    pub(crate) base: TokenReference,
+    pub(crate) equal_token: TokenReference,
+    pub(crate) declare_as: TypeInfo,
+}
+
+impl TypeDeclaration {
+    /// Creates a new TypeDeclaration from the given type name and type declaration
+    pub fn new(type_name: TokenReference, type_definition: TypeInfo) -> Self {
+        Self {
+            type_token: TokenReference::new(
+                Vec::new(),
+                Token::new(TokenType::Identifier { identifier: "type".into() }),
+                vec![Token::new(TokenType::spaces(1))],
+            ),
+            base: type_name,
+            equal_token: TokenReference::symbol(" = ").unwrap(),
+            declare_as: type_definition,
+        }
+    }
+
+    /// The token `type`.
+    pub fn type_token(&self) -> &TokenReference {
+        &self.type_token
+    }
+
+    /// The name of the type, `Meters` in `type Meters = number`.
+    pub fn type_name(&self) -> &TokenReference {
+        &self.base
+    }
+
+    /// The `=` token in between the type name and the definition.
+    pub fn equal_token(&self) -> &TokenReference {
+        &self.equal_token
+    }
+
+    /// The definition of the type, `number` in `type Meters = number`.
+    pub fn type_definition(&self) -> &TypeInfo {
+        &self.declare_as
+    }
+
+    /// Returns a new TypeDeclaration with the given `type` token
+    pub fn with_type_token(self, type_token: TokenReference) -> Self {
+        Self { type_token, ..self }
+    }
+
+    /// Returns a new TypeDeclaration with the given type name
+    pub fn with_type_name(self, type_name: TokenReference) -> Self {
+        Self { base: type_name, ..self }
+    }
+
+    /// Returns a new TypeDeclaration with the given generics of the type
+    pub fn with_equal_token(self, equal_token: TokenReference) -> Self {
+        Self { equal_token, ..self }
+    }
+
+    /// Returns a new TypeDeclaration with the given generics of the type
+    pub fn with_type_definition(self, type_definition: TypeInfo) -> Self {
+        Self { declare_as: type_definition, ..self }
+    }
+}
+
+/// A type specifier, the `: number` in `local foo: number`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{punctuation}{type_info}")]
+pub struct TypeSpecifier {
+    pub(crate) punctuation: TokenReference,
+    pub(crate) type_info: TypeInfo,
+}
+
+impl TypeSpecifier {
+    /// Creates a new TypeSpecifier with the given type info
+    pub fn new(type_info: TypeInfo) -> Self {
+        Self { punctuation: TokenReference::symbol(": ").unwrap(), type_info }
+    }
+
+    /// The punctuation being used.
+    /// `:` for `local foo: number`.
+    pub fn punctuation(&self) -> &TokenReference {
+        &self.punctuation
+    }
+
+    /// The type being specified: `number` in `local foo: number`.
+    pub fn type_info(&self) -> &TypeInfo {
+        &self.type_info
+    }
+
+    /// Returns a new TypeSpecifier with the given punctuation
+    pub fn with_punctuation(self, punctuation: TokenReference) -> Self {
+        Self { punctuation, ..self }
+    }
+
+    /// Returns a new TypeSpecifier with the given type being specified
+    pub fn with_type_info(self, type_info: TypeInfo) -> Self {
+        Self { type_info, ..self }
+    }
+}
+
+/// A type argument specified in a callback type, the `count: number` in `(count: number) -> ()`
+#[derive(Clone, Debug, PartialEq, Node, Visit, Deserialize, Serialize)]
+pub struct TypeArgument {
+    pub(crate) name: Option<(TokenReference, TokenReference)>,
+    pub(crate) type_info: TypeInfo,
+}
+
+impl TypeArgument {
+    /// Creates a new TypeArgument with the given type info
+    pub fn new(type_info: TypeInfo) -> Self {
+        Self { name: None, type_info }
+    }
+
+    /// The name of the argument split into identifier and punctuation: `count:` in `count: number`.
+    pub fn name(&self) -> Option<&(TokenReference, TokenReference)> {
+        self.name.as_ref()
+    }
+
+    /// The type info for the argument: `number` in `count: number`.
+    pub fn type_info(&self) -> &TypeInfo {
+        &self.type_info
+    }
+
+    /// Returns a new TypeArgument with the given punctuation
+    pub fn with_name(self, name: Option<(TokenReference, TokenReference)>) -> Self {
+        Self { name, ..self }
+    }
+
+    /// Returns a new TypeArgument with the given type info
+    pub fn with_type_info(self, type_info: TypeInfo) -> Self {
+        Self { type_info, ..self }
+    }
+}
+
+impl fmt::Display for TypeArgument {
+    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        if let Some((identifier, punctuation)) = self.name() {
+            write!(formatter, "{}{}{}", identifier, punctuation, self.type_info)
+        } else {
+            write!(formatter, "{}", self.type_info)
+        }
+    }
+}
+
+/// Compound operators, such as X += Y or X -= Y
+#[derive(Clone, Debug, Display, PartialEq, Eq, Node, Visit, Deserialize, Serialize)]
+#[non_exhaustive]
+#[allow(missing_docs)]
+pub enum CompoundOp {
+    PlusEqual(TokenReference),
+    MinusEqual(TokenReference),
+    StarEqual(TokenReference),
+    SlashEqual(TokenReference),
+    DoubleSlashEqual(TokenReference),
+    PercentEqual(TokenReference),
+    CaretEqual(TokenReference),
+    TwoDotsEqual(TokenReference),
+}
+
+impl CompoundOp {
+    /// The token associated with the operator
+    pub fn token(&self) -> &TokenReference {
+        match self {
+            Self::PlusEqual(token)
+            | Self::MinusEqual(token)
+            | Self::StarEqual(token)
+            | Self::SlashEqual(token)
+            | Self::DoubleSlashEqual(token)
+            | Self::PercentEqual(token)
+            | Self::CaretEqual(token)
+            | Self::TwoDotsEqual(token) => token,
+        }
+    }
+
+    pub(crate) fn from_token(token: TokenReference) -> Self {
+        if token.is_symbol(Symbol::PlusEqual) {
+            Self::PlusEqual(token)
+        } else if token.is_symbol(Symbol::MinusEqual) {
+            Self::MinusEqual(token)
+        } else if token.is_symbol(Symbol::StarEqual) {
+            Self::StarEqual(token)
+        } else if token.is_symbol(Symbol::SlashEqual) {
+            Self::SlashEqual(token)
+        } else if token.is_symbol(Symbol::DoubleSlashEqual) {
+            Self::DoubleSlashEqual(token)
+        } else if token.is_symbol(Symbol::PercentEqual) {
+            Self::PercentEqual(token)
+        } else if token.is_symbol(Symbol::CaretEqual) {
+            Self::CaretEqual(token)
+        } else if token.is_symbol(Symbol::TwoDotsEqual) {
+            Self::TwoDotsEqual(token)
+        } else {
+            unreachable!("converting an unknown token into a compound operator")
+        }
+    }
+}
+
+/// A Compound Assignment statement, such as `x += 1` or `x -= 1`
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{lhs}{compound_operator}{rhs}")]
+pub struct CompoundAssignment {
+    pub(crate) lhs: Var,
+    pub(crate) compound_operator: CompoundOp,
+    pub(crate) rhs: Expression,
+}
+
+impl CompoundAssignment {
+    /// Creates a new CompoundAssignment from the left and right hand side
+    pub fn new(lhs: Var, compound_operator: CompoundOp, rhs: Expression) -> Self {
+        Self { lhs, compound_operator, rhs }
+    }
+
+    /// The variable assigned to, the `x` part of `x += 1`
+    pub fn lhs(&self) -> &Var {
+        &self.lhs
+    }
+
+    /// The operator used, the `+=` part of `x += 1`
+    pub fn compound_operator(&self) -> &CompoundOp {
+        &self.compound_operator
+    }
+
+    /// The value being assigned, the `1` part of `x += 1`
+    pub fn rhs(&self) -> &Expression {
+        &self.rhs
+    }
+
+    /// Returns a new CompoundAssignment with the given variable being assigned to
+    pub fn with_lhs(self, lhs: Var) -> Self {
+        Self { lhs, ..self }
+    }
+
+    /// Returns a new CompoundAssignment with the given operator used
+    pub fn with_compound_operator(self, compound_operator: CompoundOp) -> Self {
+        Self { compound_operator, ..self }
+    }
+
+    /// Returns a new CompoundAssignment with the given value being assigned
+    pub fn with_rhs(self, rhs: Expression) -> Self {
+        Self { rhs, ..self }
+    }
+}
+
+/// An if statement
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{if_token}{condition}{then_token}{if_expression}{}{else_token}{else_expression}",
+    display_option(else_if_expressions.as_ref().map(join_vec)),
+)]
+pub struct IfExpression {
+    pub(crate) if_token: TokenReference,
+    pub(crate) condition: Box<Expression>,
+    pub(crate) then_token: TokenReference,
+    pub(crate) if_expression: Box<Expression>,
+    pub(crate) else_if_expressions: Option<Vec<ElseIfExpression>>,
+    pub(crate) else_token: TokenReference,
+    pub(crate) else_expression: Box<Expression>,
+}
+
+impl IfExpression {
+    /// Creates a new If from the given condition
+    pub fn new(condition: Expression, if_expression: Expression, else_expression: Expression) -> Self {
+        Self {
+            if_token: TokenReference::symbol("if ").unwrap(),
+            condition: Box::new(condition),
+            then_token: TokenReference::symbol(" then").unwrap(),
+            if_expression: Box::new(if_expression),
+            else_if_expressions: None,
+            else_token: TokenReference::symbol(" else ").unwrap(),
+            else_expression: Box::new(else_expression),
+        }
+    }
+
+    /// The `if` token
+    pub fn if_token(&self) -> &TokenReference {
+        &self.if_token
+    }
+
+    /// The condition of the if expression, `condition` in `if condition then`
+    pub fn condition(&self) -> &Expression {
+        &self.condition
+    }
+
+    /// The `then` token
+    pub fn then_token(&self) -> &TokenReference {
+        &self.then_token
+    }
+
+    /// The expression evaluated if the initial if condition holds
+    pub fn if_expression(&self) -> &Expression {
+        &self.if_expression
+    }
+
+    /// The `else` token
+    pub fn else_token(&self) -> &TokenReference {
+        &self.else_token
+    }
+
+    /// If there are `elseif` conditions, returns a vector of them
+    pub fn else_if_expressions(&self) -> impl Iterator<Item = &ElseIfExpression> {
+        self.else_if_expressions.as_ref().into_iter().flatten()
+    }
+
+    /// The else expression if all other conditions do not hold
+    pub fn else_expression(&self) -> &Expression {
+        &self.else_expression
+    }
+
+    /// Returns a new IfExpression with the given `if` token
+    pub fn with_if_token(self, if_token: TokenReference) -> Self {
+        Self { if_token, ..self }
+    }
+
+    /// Returns a new IfExpression with the given condition
+    pub fn with_condition(self, condition: Expression) -> Self {
+        Self { condition: Box::new(condition), ..self }
+    }
+
+    /// Returns a new IfExpression with the given `then` token
+    pub fn with_then_token(self, then_token: TokenReference) -> Self {
+        Self { then_token, ..self }
+    }
+
+    /// Returns a new IfExpression with the given if expression
+    pub fn with_if_expression(self, if_expression: Expression) -> Self {
+        Self { if_expression: Box::new(if_expression), ..self }
+    }
+
+    /// Returns a new If with the given list of `elseif` expressions
+    pub fn with_else_if(self, else_if_expressions: Option<Vec<ElseIfExpression>>) -> Self {
+        Self { else_if_expressions, ..self }
+    }
+
+    /// Returns a new IfExpression with the given `else` token
+    pub fn with_else_token(self, else_token: TokenReference) -> Self {
+        Self { else_token, ..self }
+    }
+
+    /// Returns a new IfExpression with the given `else` expression
+    pub fn with_else(self, else_expression: Expression) -> Self {
+        Self { else_expression: Box::new(else_expression), ..self }
+    }
+}
+
+/// An elseif expression in a bigger [`IfExpression`] expression
+#[derive(Clone, Debug, Display, PartialEq, Node, Visit, Deserialize, Serialize)]
+#[display("{else_if_token}{condition}{then_token}{expression}")]
+pub struct ElseIfExpression {
+    pub(crate) else_if_token: TokenReference,
+    pub(crate) condition: Expression,
+    pub(crate) then_token: TokenReference,
+    pub(crate) expression: Expression,
+}
+
+impl ElseIfExpression {
+    /// Creates a new ElseIf from the given condition
+    pub fn new(condition: Expression, expression: Expression) -> Self {
+        Self {
+            else_if_token: TokenReference::symbol(" elseif ").unwrap(),
+            condition,
+            then_token: TokenReference::symbol(" then ").unwrap(),
+            expression,
+        }
+    }
+
+    /// The `elseif` token
+    pub fn else_if_token(&self) -> &TokenReference {
+        &self.else_if_token
+    }
+
+    /// The condition of the `elseif`, `condition` in `elseif condition then`
+    pub fn condition(&self) -> &Expression {
+        &self.condition
+    }
+
+    /// The `then` token
+    pub fn then_token(&self) -> &TokenReference {
+        &self.then_token
+    }
+
+    /// The evaluated expression of the `elseif` when condition is true
+    pub fn expression(&self) -> &Expression {
+        &self.expression
+    }
+
+    /// Returns a new ElseIfExpression with the given `elseif` token
+    pub fn with_else_if_token(self, else_if_token: TokenReference) -> Self {
+        Self { else_if_token, ..self }
+    }
+
+    /// Returns a new ElseIfExpression with the given condition
+    pub fn with_condition(self, condition: Expression) -> Self {
+        Self { condition, ..self }
+    }
+
+    /// Returns a new ElseIfExpression with the given `then` token
+    pub fn with_then_token(self, then_token: TokenReference) -> Self {
+        Self { then_token, ..self }
+    }
+
+    /// Returns a new ElseIfExpression with the given expression
+    pub fn with_block(self, expression: Expression) -> Self {
+        Self { expression, ..self }
+    }
+}
diff --git a/src/Rust/vvs_parser/src/ast/options.rs b/src/Rust/vvs_parser/src/ast/options.rs
new file mode 100644
index 00000000..228af95d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/options.rs
@@ -0,0 +1,108 @@
+//! Option table passed to the Vivy program at runtime.
+
+use crate::{ast::Expression, ShortString};
+use serde::{Deserialize, Serialize};
+
+/// Options for a program, represent the thing that is red from a file.
+///
+/// The syntax was a bit modified:
+/// ```ini
+/// [module]
+/// option = some Lua/VivyScript expression
+/// ```
+#[derive(Default, Serialize, Deserialize)]
+pub struct OptionTable {
+    modules: Vec<(ShortString, Vec<(ShortString, Expression)>)>,
+}
+
+pub(crate) struct OptionTableSectionMut<'a> {
+    options: &'a mut Vec<(ShortString, Expression)>,
+}
+
+impl OptionTable {
+    /// Create a new empty default option table.
+    pub fn new() -> Self {
+        Default::default()
+    }
+
+    /// Get the number of options in the table
+    pub fn len(&self) -> usize {
+        self.modules.iter().map(|(_, section)| section.len()).sum()
+    }
+
+    /// Tells whever we have options in the table or not.
+    pub fn is_empty(&self) -> bool {
+        self.modules.iter().all(|(_, section)| section.is_empty())
+    }
+
+    /// Get the asked option if it exists in this table.
+    pub fn get(&self, module: impl AsRef<str>, option: impl AsRef<str>) -> Option<&Expression> {
+        self.modules
+            .iter()
+            .find_map(|(name, section)| (name.as_str() == module.as_ref()).then_some(section))?
+            .iter()
+            .find_map(|(name, value)| (name.as_str() == option.as_ref()).then_some(value))
+    }
+
+    /// Tells whether we have a said section or not in the option table.
+    pub(crate) fn has_section(&self, section: impl AsRef<str>) -> bool {
+        self.modules.iter().any(|(m, _)| m.as_str() == section.as_ref())
+    }
+
+    /// Get a section of the table in mutable access. If the section doesn't exist it will be
+    /// created and will be empty.
+    pub(crate) fn section_mut(&mut self, section: impl Into<ShortString>) -> OptionTableSectionMut<'_> {
+        let section = section.into();
+        let mut sections = self.modules.iter().enumerate();
+        let idx = sections
+            .find_map(|(idx, (module, _))| (*module == section).then_some(idx))
+            .unwrap_or_else(|| {
+                self.modules.push((section, vec![]));
+                self.modules.len() - 1
+            });
+        OptionTableSectionMut::new(&mut self.modules[idx].1)
+    }
+}
+
+impl<'a> OptionTableSectionMut<'a> {
+    fn new(options: &'a mut Vec<(ShortString, Expression)>) -> Self {
+        Self { options }
+    }
+}
+
+impl<'a> Iterator for OptionTableSectionMut<'a> {
+    type Item = (ShortString, Expression);
+
+    fn next(&mut self) -> Option<Self::Item> {
+        self.options.pop()
+    }
+}
+
+impl<'a> Extend<(ShortString, Expression)> for OptionTableSectionMut<'a> {
+    fn extend<T: IntoIterator<Item = (ShortString, Expression)>>(&mut self, iter: T) {
+        self.options.extend(iter)
+    }
+}
+
+impl Iterator for OptionTable {
+    type Item = (ShortString, ShortString, Expression);
+
+    fn next(&mut self) -> Option<Self::Item> {
+        let (module, mut section) = self
+            .modules
+            .iter_mut()
+            .find(|(_, opts)| !opts.is_empty())
+            .map(|(module, section)| (module, OptionTableSectionMut::new(section)))?;
+        let (option, expression) = section.next().unwrap();
+        Some((module.clone(), option, expression))
+    }
+
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let count = self.len();
+        (count, Some(count))
+    }
+
+    fn count(self) -> usize {
+        self.len()
+    }
+}
diff --git a/src/Rust/vvs_parser/src/ast/parsers/mod.rs b/src/Rust/vvs_parser/src/ast/parsers/mod.rs
new file mode 100644
index 00000000..1e79a07d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/parsers/mod.rs
@@ -0,0 +1,2172 @@
+//! Contains things for the parsers. Parse the vvs/vvl files and the option file.
+
+mod structs;
+mod util;
+
+use crate::{
+    ast::{
+        self,
+        punctuated::{Pair, Punctuated},
+        span::ContainedSpan,
+        CallList, Expression, FunctionBody, Parameter,
+    },
+    node::Node,
+    tokenizer::{Symbol, Token, TokenKind, TokenReference, TokenType},
+    try_parser,
+};
+
+pub use crate::ast::parsers::structs::*;
+
+pub fn parse_option_table(state: &mut ParserState) -> ParserResult<ast::OptionTable> {
+    let mut table = ast::OptionTable::default();
+
+    while let ParserResult::Value(left_bracket) = state.consume() {
+        let section = match left_bracket.token_type() {
+            TokenType::MultiLineComment { .. } | TokenType::SingleLineComment { .. } => continue,
+            TokenType::Eof => break,
+            TokenType::Symbol { symbol: Symbol::LeftBracket } => expect_option_table_section(state, left_bracket),
+            _ => todo!("error"),
+        };
+
+        let (identifier, options) = match section {
+            ParserResult::NotFound => break,
+            ParserResult::Value((
+                TokenReference { token: Token { token_type: TokenType::Identifier { identifier, .. }, .. }, .. },
+                options,
+            )) => (identifier, options),
+            _ => return ParserResult::LexerMoved,
+        };
+
+        table
+            .section_mut(identifier)
+            .extend(options.into_iter().flat_map(|(option, value)| match option {
+                TokenReference {
+                    token: Token { token_type: TokenType::Identifier { identifier, .. }, .. }, ..
+                } => Some((identifier, value)),
+                _ => None,
+            }));
+    }
+
+    ParserResult::Value(table)
+}
+
+fn expect_option_table_section(
+    state: &mut ParserState,
+    left_bracket: TokenReference,
+) -> ParserResult<(TokenReference, Vec<(TokenReference, Expression)>)> {
+    let section = match parse_identifier(state) {
+        ParserResult::Value(section) => section,
+        _ => {
+            state.token_error(left_bracket, "expected an identifier as the option section name");
+            return ParserResult::LexerMoved;
+        }
+    };
+
+    if state.consume_if(Symbol::RightBracket).is_none() {
+        state.token_error(section, "expected a ']' to close after the section name declaration");
+        return ParserResult::LexerMoved;
+    }
+
+    let mut options = Vec::new();
+    while let Ok(current) = state.current() {
+        match current.token_type() {
+            TokenType::Eof | TokenType::Symbol { symbol: Symbol::LeftBracket } => break,
+            TokenType::Identifier { .. } => {}
+            _ => {
+                state.token_error(current.clone(), "expected the name of an option");
+                return ParserResult::LexerMoved;
+            }
+        }
+        let option = state.consume().unwrap();
+
+        let separator = match state.consume_ifs(&[Symbol::Equal, Symbol::Colon]) {
+            Some(separator) => separator,
+            None => {
+                state.token_error(option, "expected a ':' or a '=' to assign the option");
+                return ParserResult::LexerMoved;
+            }
+        };
+
+        let expression = match parse_expression(state) {
+            ParserResult::Value(expression) => expression,
+            ParserResult::LexerMoved | ParserResult::NotFound => {
+                state.token_error(separator, "expected an expression as the option value");
+                return ParserResult::LexerMoved;
+            }
+        };
+
+        options.push((option, expression));
+    }
+
+    ParserResult::Value((section, options))
+}
+
+pub fn parse_block(state: &mut ParserState) -> ParserResult<ast::Block> {
+    let mut stmts = Vec::new();
+
+    loop {
+        match parse_stmt(state) {
+            ParserResult::Value(StmtVariant::Stmt(stmt)) => {
+                stmts.push((stmt, state.consume_if(Symbol::Semicolon)));
+            }
+            ParserResult::Value(StmtVariant::LastStmt(last_stmt)) => {
+                let semicolon = state.consume_if(Symbol::Semicolon);
+                let last_stmt = Some((last_stmt, semicolon));
+                return ParserResult::Value(ast::Block { stmts, last_stmt });
+            }
+            ParserResult::NotFound => break,
+            ParserResult::LexerMoved if stmts.is_empty() => return ParserResult::LexerMoved,
+            ParserResult::LexerMoved => break,
+        }
+    }
+
+    let last_stmt = parse_last_stmt(state).ok();
+    ParserResult::Value(ast::Block { stmts, last_stmt })
+}
+
+// Blocks in general are not very fallible. This means, for instance, not finishing `function()`
+// will result in a completely ignored function body.
+// This is an opinionated choice because I believe selene is going to produce terrible outputs if we don't.
+fn expect_block_with_end(
+    state: &mut ParserState,
+    name: &str,
+    start_for_errors: &TokenReference,
+) -> Result<(ast::Block, TokenReference), ()> {
+    let block = match parse_block(state) {
+        ParserResult::Value(block) => block,
+        ParserResult::NotFound => unreachable!("parse_block should always return a value"),
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let (start, end) = if let Some(last_stmt) = block.last_stmt() {
+        let mut tokens = last_stmt.tokens();
+        let start = tokens.next().unwrap();
+        let end = tokens.last().unwrap_or(start);
+        (start, end)
+    } else if let Some(the_last_of_the_stmts) = block.stmts().last() {
+        let mut tokens = the_last_of_the_stmts.tokens();
+        let start = tokens.next().unwrap();
+        let end = tokens.last().unwrap_or(start);
+        (start, end)
+    } else {
+        (start_for_errors, start_for_errors)
+    };
+
+    let Some(end_token) = state.require_with_reference_range(
+        Symbol::End,
+        || format!("expected `end` to close {} block", name),
+        start,
+        end,
+    ) else {
+        return Ok((block, TokenReference::basic_symbol("end")));
+    };
+
+    Ok((block, end_token))
+}
+
+enum StmtVariant {
+    Stmt(ast::Stmt),
+
+    // Used for things like Luau's `continue`, but nothing constructs it in Lua 5.1 alone.
+    #[allow(unused)]
+    LastStmt(ast::LastStmt),
+}
+
+fn parse_stmt(state: &mut ParserState) -> ParserResult<StmtVariant> {
+    let Ok(current_token) = state.current() else {
+        return ParserResult::NotFound;
+    };
+
+    match current_token.token_type() {
+        TokenType::Symbol { symbol: Symbol::Local } => {
+            let local_token = state.consume().unwrap();
+            let next_token = match state.current() {
+                Ok(token) => token,
+                Err(()) => return ParserResult::LexerMoved,
+            };
+
+            match next_token.token_type() {
+                TokenType::Identifier { .. } => ParserResult::Value(StmtVariant::Stmt(ast::Stmt::LocalAssignment(
+                    match expect_local_assignment(state, local_token) {
+                        Ok(local_assignment) => local_assignment,
+                        Err(()) => return ParserResult::LexerMoved,
+                    },
+                ))),
+
+                TokenType::Symbol { symbol: Symbol::Function } => {
+                    let callable_token = state.consume().unwrap();
+                    let name = match state.current() {
+                        Ok(token) if token.token_kind() == TokenKind::Identifier => state.consume().unwrap(),
+                        Ok(token) => {
+                            state.token_error(token.clone(), "expected a function name");
+                            return ParserResult::LexerMoved;
+                        }
+                        Err(()) => return ParserResult::LexerMoved,
+                    };
+
+                    let body = match parse_function_body(state) {
+                        ParserResult::Value(function_body) => function_body,
+                        ParserResult::NotFound => {
+                            state.token_error(callable_token, "expected a function body");
+                            return ParserResult::LexerMoved;
+                        }
+                        ParserResult::LexerMoved => return ParserResult::LexerMoved,
+                    };
+
+                    ParserResult::Value(StmtVariant::Stmt(ast::Stmt::LocalFunction(ast::LocalFunction {
+                        local_token,
+                        function_token: callable_token,
+                        name,
+                        body,
+                    })))
+                }
+
+                _ => {
+                    state.token_error(next_token.clone(), "expected either a variable name or `function`");
+                    ParserResult::LexerMoved
+                }
+            }
+        }
+
+        TokenType::Symbol { symbol: Symbol::For } => {
+            let for_token = state.consume().unwrap();
+            ParserResult::Value(StmtVariant::Stmt(match expect_for_stmt(state, for_token) {
+                Ok(for_stmt) => for_stmt,
+                Err(()) => return ParserResult::LexerMoved,
+            }))
+        }
+
+        TokenType::Symbol { symbol: Symbol::Option } => {
+            let option_token = state.consume().unwrap();
+            ParserResult::Value(StmtVariant::Stmt(ast::Stmt::OptionDecl(
+                match expect_option_decl(state, option_token) {
+                    Ok(option_decl_stmt) => option_decl_stmt,
+                    Err(()) => return ParserResult::LexerMoved,
+                },
+            )))
+        }
+
+        TokenType::Symbol { symbol: Symbol::Yield } => {
+            let yield_token = state.consume().unwrap();
+            ParserResult::Value(StmtVariant::Stmt(ast::Stmt::Yield(match expect_yield(state, yield_token) {
+                Ok(yield_stmt) => yield_stmt,
+                Err(()) => return ParserResult::LexerMoved,
+            })))
+        }
+
+        TokenType::Symbol { symbol: Symbol::Main } => {
+            let main_token = state.consume().unwrap();
+            ParserResult::Value(StmtVariant::Stmt(ast::Stmt::Main(match expect_main(state, main_token) {
+                Ok(main_stmt) => main_stmt,
+                Err(()) => return ParserResult::LexerMoved,
+            })))
+        }
+
+        TokenType::Symbol { symbol: Symbol::Do } => {
+            let do_token = state.consume().unwrap();
+            let (block, end_token) = match expect_block_with_end(state, "do", &do_token) {
+                Ok(block) => block,
+                Err(()) => return ParserResult::LexerMoved,
+            };
+            ParserResult::Value(StmtVariant::Stmt(ast::Stmt::Do(ast::Do { do_token, block, end_token })))
+        }
+
+        TokenType::Symbol { symbol: Symbol::If } => {
+            let if_token = state.consume().unwrap();
+            ParserResult::Value(StmtVariant::Stmt(ast::Stmt::If(match expect_if_stmt(state, if_token) {
+                Ok(if_stmt) => if_stmt,
+                Err(()) => return ParserResult::LexerMoved,
+            })))
+        }
+
+        TokenType::Symbol { symbol: Symbol::Import } => {
+            let import_token = state.consume().unwrap();
+            let name = match state.current() {
+                Ok(token) if token.token_kind() == TokenKind::StringLiteral => state.consume().unwrap(),
+                Ok(token) => {
+                    state.token_error(token.clone(), "expected a string as the module name");
+                    return ParserResult::LexerMoved;
+                }
+                Err(()) => return ParserResult::LexerMoved,
+            };
+            ParserResult::Value(StmtVariant::Stmt(ast::Stmt::Import(ast::Import { import_token, name })))
+        }
+
+        TokenType::Symbol { symbol: callable @ Symbol::Function | callable @ Symbol::Job } => {
+            let callable = *callable;
+            let token = state.consume().unwrap();
+            let declaration = match expect_function_declaration(state, token) {
+                Ok(declaration) => declaration,
+                Err(()) => return ParserResult::LexerMoved,
+            };
+            let job_name_is_invalid = {
+                let name = declaration.name();
+                name.names().len() != 1 || name.method_colon().is_some() || name.method_name().is_some()
+            };
+            match callable {
+                Symbol::Job if job_name_is_invalid => {
+                    state.token_error(
+                        declaration.function_token().clone(),
+                        "invalid name for a job, can't be ponctuated or have columns",
+                    );
+                    ParserResult::LexerMoved
+                }
+                Symbol::Job => ParserResult::Value(StmtVariant::Stmt(ast::Stmt::JobDeclaration(declaration))),
+                Symbol::Function => ParserResult::Value(StmtVariant::Stmt(ast::Stmt::FunctionDeclaration(declaration))),
+                _ => unreachable!(),
+            }
+        }
+
+        TokenType::Symbol { symbol: Symbol::Repeat } => {
+            let repeat_token = state.consume().unwrap();
+            ParserResult::Value(StmtVariant::Stmt(match expect_repeat_stmt(state, repeat_token) {
+                Ok(repeat_stmt) => repeat_stmt,
+                Err(()) => return ParserResult::LexerMoved,
+            }))
+        }
+
+        TokenType::Symbol { symbol: Symbol::While } => {
+            let while_token = state.consume().unwrap();
+            ParserResult::Value(StmtVariant::Stmt(ast::Stmt::While(match expect_while_stmt(state, while_token) {
+                Ok(while_stmt) => while_stmt,
+                Err(()) => return ParserResult::LexerMoved,
+            })))
+        }
+
+        TokenType::Symbol { symbol: Symbol::LeftParen } | TokenType::Identifier { .. } => {
+            let (prefix, suffixes) =
+                try_parser!(parse_prefix_and_suffixes(state)).expect("we should always be starting on the right path");
+            let var = match suffixes.last() {
+                Some(ast::Suffix::Call(_)) => {
+                    return ParserResult::Value(StmtVariant::Stmt(ast::Stmt::FunctionCall(ast::FunctionCall {
+                        prefix,
+                        suffixes,
+                    })));
+                }
+                Some(ast::Suffix::Index(_)) => ast::Var::Expression(Box::new(ast::VarExpression { prefix, suffixes })),
+                None => match prefix {
+                    ast::Prefix::Name(name) => ast::Var::Name(name),
+                    // I think this only happens in error cases
+                    prefix @ ast::Prefix::Expression(_) => {
+                        ast::Var::Expression(Box::new(ast::VarExpression { prefix, suffixes }))
+                    }
+                },
+            };
+
+            match state.current() {
+                // Compound Assignment
+                Ok(token)
+                    if token.in_symbols(&[
+                        Symbol::PlusEqual,
+                        Symbol::MinusEqual,
+                        Symbol::StarEqual,
+                        Symbol::SlashEqual,
+                        Symbol::DoubleSlashEqual,
+                        Symbol::PercentEqual,
+                        Symbol::CaretEqual,
+                        Symbol::TwoDotsEqual,
+                    ]) =>
+                {
+                    let compound_operator = state.consume().unwrap();
+                    let ParserResult::Value(expr) = parse_expression(state) else {
+                        state.token_error(compound_operator, "expected expression to set to");
+                        return ParserResult::LexerMoved;
+                    };
+                    return ParserResult::Value(StmtVariant::Stmt(ast::Stmt::CompoundAssignment(
+                        ast::CompoundAssignment {
+                            lhs: var,
+                            compound_operator: ast::CompoundOp::from_token(compound_operator),
+                            rhs: expr,
+                        },
+                    )));
+                }
+
+                Ok(token) if token.in_symbols(&[Symbol::Comma, Symbol::Equal]) => {}
+
+                Ok(token) => {
+                    // Check if the consumed token is a potential context-sensitive keyword
+                    if let ast::Var::Name(token) = var {
+                        match token.token_type() {
+                            TokenType::Identifier { identifier } if identifier.as_str() == "type" => {
+                                let type_token = token;
+                                return ParserResult::Value(StmtVariant::Stmt(ast::Stmt::TypeDeclaration(
+                                    match expect_type_declaration(state, type_token) {
+                                        Ok(type_declaration) => type_declaration,
+                                        Err(()) => return ParserResult::LexerMoved,
+                                    },
+                                )));
+                            }
+                            TokenType::Identifier { identifier } if identifier.as_str() == "continue" => {
+                                let continue_token = token;
+                                return ParserResult::Value(StmtVariant::LastStmt(ast::LastStmt::Continue(
+                                    continue_token,
+                                )));
+                            }
+                            _ => (),
+                        }
+                    }
+
+                    state.token_error(token.clone(), "unexpected expression when looking for a statement");
+                    return ParserResult::LexerMoved;
+                }
+
+                Err(()) => return ParserResult::LexerMoved,
+            };
+
+            let mut var_list = Punctuated::new();
+            var_list.push(Pair::End(var));
+
+            loop {
+                let next_comma = match state.current() {
+                    Ok(token) if token.is_symbol(Symbol::Comma) => state.consume().unwrap(),
+                    Ok(_) => break,
+                    Err(()) => return ParserResult::LexerMoved,
+                };
+
+                let (next_prefix, next_suffixes) = match parse_prefix_and_suffixes(state) {
+                    ParserResult::Value((prefix, suffixes)) => (prefix, suffixes),
+                    ParserResult::LexerMoved => break,
+                    ParserResult::NotFound => {
+                        state.token_error(next_comma, "expected another variable");
+                        break;
+                    }
+                };
+
+                match next_suffixes.last() {
+                    Some(ast::Suffix::Call(call)) => {
+                        state
+                            .token_error(call.tokens().last().unwrap().clone(), "can't assign to the result of a call");
+                        break;
+                    }
+
+                    Some(ast::Suffix::Index(_)) => var_list.push_punctuated(
+                        ast::Var::Expression(Box::new(ast::VarExpression {
+                            prefix: next_prefix,
+                            suffixes: next_suffixes,
+                        })),
+                        next_comma,
+                    ),
+
+                    None => match next_prefix {
+                        ast::Prefix::Name(name) => var_list.push_punctuated(ast::Var::Name(name), next_comma),
+                        prefix @ ast::Prefix::Expression(_) => var_list.push_punctuated(
+                            ast::Var::Expression(Box::new(ast::VarExpression { prefix, suffixes: next_suffixes })),
+                            next_comma,
+                        ),
+                    },
+                }
+            }
+
+            let Some(equal_token) = state.require(Symbol::Equal, "expected `=` after name") else {
+                return ParserResult::LexerMoved;
+            };
+
+            let expr_list = match parse_expression_list(state) {
+                ParserResult::Value(expr_list) => expr_list,
+                ParserResult::NotFound => {
+                    state.token_error(equal_token.clone(), "expected values to set to");
+                    Punctuated::new()
+                }
+                ParserResult::LexerMoved => Punctuated::new(),
+            };
+
+            ParserResult::Value(StmtVariant::Stmt(ast::Stmt::Assignment(ast::Assignment {
+                var_list,
+                equal_token,
+                expr_list,
+            })))
+        }
+
+        _ => ParserResult::NotFound,
+    }
+}
+
+fn parse_last_stmt(state: &mut ParserState) -> ParserResult<(ast::LastStmt, Option<TokenReference>)> {
+    let last_stmt = match state.current() {
+        Ok(token) if token.is_symbol(Symbol::Return) => {
+            let return_token = state.consume().unwrap();
+            let expr_list = match parse_expression_list(state) {
+                ParserResult::Value(expr_list) => expr_list,
+                ParserResult::LexerMoved | ParserResult::NotFound => Punctuated::new(),
+            };
+            ast::LastStmt::Return(ast::Return { token: return_token, returns: expr_list })
+        }
+
+        Ok(token) if token.is_symbol(Symbol::Break) => {
+            let break_token = state.consume().unwrap();
+            ast::LastStmt::Break(break_token)
+        }
+
+        _ => return ParserResult::NotFound,
+    };
+
+    let semicolon = state.consume_if(Symbol::Semicolon);
+    ParserResult::Value((last_stmt, semicolon))
+}
+
+fn expect_function_name(state: &mut ParserState) -> ParserResult<ast::FunctionName> {
+    let mut names = Punctuated::new();
+    let name = match state.current() {
+        Ok(token) if matches!(token.token_type(), TokenType::Identifier { .. }) => state.consume().unwrap(),
+        Ok(token) => {
+            state.token_error(token.clone(), "expected function name");
+            return ParserResult::NotFound;
+        }
+        Err(()) => return ParserResult::NotFound,
+    };
+
+    names.push(Pair::End(name));
+
+    loop {
+        let middle_token = match state.current() {
+            Ok(token) if token.in_symbols(&[Symbol::Colon, Symbol::Dot]) => state.consume().unwrap(),
+            Ok(_) => break,
+            Err(()) => return ParserResult::LexerMoved,
+        };
+
+        let name = match state.current() {
+            Ok(token) if matches!(token.token_type(), TokenType::Identifier { .. }) => state.consume().unwrap(),
+            Ok(token) => {
+                state.token_error(token.clone(), format!("expected name after `{}`", middle_token.token()));
+                return ParserResult::NotFound;
+            }
+            Err(()) => return ParserResult::LexerMoved,
+        };
+
+        if middle_token.is_symbol(Symbol::Dot) {
+            names.push_punctuated(name, middle_token);
+        } else if middle_token.is_symbol(Symbol::Colon) {
+            return ParserResult::Value(ast::FunctionName { names, colon_name: Some((middle_token, name)) });
+        } else {
+            unreachable!();
+        }
+    }
+
+    ParserResult::Value(ast::FunctionName { names, colon_name: None })
+}
+
+fn expect_function_declaration(
+    state: &mut ParserState,
+    function_token: TokenReference,
+) -> Result<ast::FunctionDeclaration, ()> {
+    let function_name = expect_function_name(state).ok_or(())?;
+    let function_body = match parse_function_body(state) {
+        ParserResult::Value(body) => body,
+        ParserResult::LexerMoved => ast::FunctionBody::new(),
+        ParserResult::NotFound => {
+            state.token_error(function_token.clone(), "expected a function body");
+            ast::FunctionBody::new()
+        }
+    };
+    Ok(ast::FunctionDeclaration { function_token, name: function_name, body: function_body })
+}
+
+fn expect_for_stmt(state: &mut ParserState, for_token: TokenReference) -> Result<ast::Stmt, ()> {
+    let name_list = match parse_name_list(state) {
+        ParserResult::Value(name_list) => name_list,
+        ParserResult::NotFound => {
+            state.token_error(for_token, "expected name after `for`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let current_token = state.current()?;
+    debug_assert!(!name_list.is_empty());
+
+    if name_list.len() == 1 && current_token.is_symbol(Symbol::Equal) {
+        return Ok(ast::Stmt::NumericFor(expect_numeric_for_stmt(
+            state,
+            for_token,
+            name_list.into_iter().next().unwrap(),
+        )?));
+    }
+
+    let in_token = match current_token {
+        token if token.is_symbol(Symbol::In) => state.consume().unwrap(),
+        token => {
+            state.token_error(token.clone(), "expected `in` after name list");
+            return Err(());
+        }
+    };
+
+    let expressions = match parse_expression_list(state) {
+        ParserResult::Value(expressions) => expressions,
+        ParserResult::NotFound => {
+            state.token_error(in_token, "expected expressions after `in`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let Some(do_token) = state.require(Symbol::Do, "expected `do` after expression list") else {
+        return Ok(ast::Stmt::GenericFor(ast::GenericFor {
+            for_token,
+            names: name_list
+                .clone()
+                .into_pairs()
+                .map(|pair| pair.map(|name| name.name))
+                .collect(),
+            type_specifiers: name_list.into_iter().map(|name| name.type_specifier).collect(),
+            in_token,
+            expr_list: expressions,
+            do_token: TokenReference::basic_symbol("do"),
+            block: ast::Block::new(),
+            end_token: TokenReference::basic_symbol("end"),
+        }));
+    };
+
+    let (block, end) = match expect_block_with_end(state, "for loop", &do_token) {
+        Ok(block) => block,
+        Err(()) => (ast::Block::new(), TokenReference::basic_symbol("end")),
+    };
+
+    Ok(ast::Stmt::GenericFor(ast::GenericFor {
+        for_token,
+        names: name_list
+            .clone()
+            .into_pairs()
+            .map(|pair| pair.map(|name| name.name))
+            .collect(),
+        type_specifiers: name_list.into_iter().map(|name| name.type_specifier).collect(),
+        in_token,
+        expr_list: expressions,
+        do_token,
+        block,
+        end_token: end,
+    }))
+}
+
+fn expect_numeric_for_stmt(
+    state: &mut ParserState,
+    for_token: TokenReference,
+    index_variable: Name,
+) -> Result<ast::NumericFor, ()> {
+    let equal_token = state.consume().unwrap();
+    debug_assert!(equal_token.is_symbol(Symbol::Equal));
+
+    let start = match parse_expression(state) {
+        ParserResult::Value(start) => start,
+        ParserResult::NotFound => {
+            state.token_error(equal_token, "expected start expression after `=`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let start_end_comma = state
+        .require(Symbol::Comma, "expected `,` after start expression")
+        .ok_or(())?;
+
+    let end = match parse_expression(state) {
+        ParserResult::Value(end) => end,
+        ParserResult::NotFound => {
+            state.token_error(start_end_comma, "expected end expression after `,`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    // rewrite todo: this can recover into a numeric for loop with no step (or simulate the do..end)
+    let (end_step_comma, step) = match state.consume_if(Symbol::Comma) {
+        Some(end_step_comma) => match parse_expression(state) {
+            ParserResult::Value(step) => (Some(end_step_comma), Some(step)),
+            ParserResult::NotFound => {
+                state.token_error(start_end_comma, "expected step expression after `,`");
+                return Err(());
+            }
+            ParserResult::LexerMoved => return Err(()),
+        },
+
+        None => (None, None),
+    };
+
+    let do_token = state
+        .require(Symbol::Do, "expected `do` after step expression")
+        .ok_or(())?;
+
+    let (block, end_token) = match expect_block_with_end(state, "numeric for loop", &do_token) {
+        Ok(block) => block,
+        Err(()) => (ast::Block::new(), TokenReference::basic_symbol("end")),
+    };
+
+    Ok(ast::NumericFor {
+        for_token,
+        index_variable: index_variable.name,
+        type_specifier: index_variable.type_specifier,
+        equal_token,
+        start,
+        start_end_comma,
+        end,
+        end_step_comma,
+        step,
+        do_token,
+        block,
+        end_token,
+    })
+}
+
+fn expect_if_stmt(state: &mut ParserState, if_token: TokenReference) -> Result<ast::If, ()> {
+    let condition = match parse_expression(state) {
+        ParserResult::Value(condition) => condition,
+        ParserResult::NotFound => {
+            state.token_error(if_token, "expected condition after `if`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let then_token = state
+        .require(Symbol::Then, "expected `then` after condition")
+        .ok_or(())?;
+
+    let then_block = match parse_block(state) {
+        ParserResult::Value(block) => block,
+        ParserResult::NotFound => {
+            state.token_error(then_token, "expected block after `then`");
+            return Ok(ast::If::new(condition));
+        }
+        ParserResult::LexerMoved => return Ok(ast::If::new(condition)),
+    };
+
+    let mut else_if = Vec::new();
+
+    let else_if_optional = |else_if: Vec<ast::ElseIf>| (!else_if.is_empty()).then_some(else_if);
+    let unfinished_if = |condition, else_if| Ok(ast::If::new(condition).with_else_if(else_if_optional(else_if)));
+
+    loop {
+        let else_if_token = match state.current() {
+            Ok(else_if_token) if else_if_token.in_symbols(&[Symbol::ElseIf, Symbol::ElIf]) => state.consume().unwrap(),
+            Ok(_) => break,
+            Err(()) => return unfinished_if(condition, else_if),
+        };
+
+        let condition = match parse_expression(state) {
+            ParserResult::Value(condition) => condition,
+            ParserResult::NotFound => {
+                state.token_error(else_if_token, "expected condition after `elseif` or `elif`");
+                return unfinished_if(condition, else_if);
+            }
+            ParserResult::LexerMoved => return unfinished_if(condition, else_if),
+        };
+
+        let Some(then_token) = state.require(Symbol::Then, "expected `then` after condition") else {
+            return unfinished_if(condition, else_if);
+        };
+
+        let then_block = match parse_block(state) {
+            ParserResult::Value(block) => block,
+            ParserResult::NotFound => {
+                state.token_error(then_token, "expected block after `then`");
+                return unfinished_if(condition, else_if);
+            }
+            ParserResult::LexerMoved => return unfinished_if(condition, else_if),
+        };
+
+        else_if.push(ast::ElseIf { else_if_token, condition, then_token, block: then_block });
+    }
+
+    let (else_block, else_token) = match state.consume_if(Symbol::Else) {
+        Some(else_token) => match parse_block(state) {
+            ParserResult::Value(block) => (Some(block), Some(else_token)),
+            ParserResult::NotFound => {
+                state.token_error(else_token.clone(), "expected block after `else`");
+                (Some(ast::Block::new()), Some(else_token))
+            }
+            ParserResult::LexerMoved => (Some(ast::Block::new()), Some(else_token)),
+        },
+        None => (None, None),
+    };
+
+    let end_token = match state.current() {
+        Ok(token) if token.is_symbol(Symbol::End) => state.consume().unwrap(),
+        Ok(token) => {
+            state.token_error(token.clone(), "expected `end` to conclude `if`");
+            TokenReference::basic_symbol("end")
+        }
+        Err(()) => TokenReference::basic_symbol("end"),
+    };
+
+    Ok(ast::If {
+        if_token,
+        condition,
+        then_token,
+        block: then_block,
+        else_if: else_if_optional(else_if),
+        else_token,
+        r#else: else_block,
+        end_token,
+    })
+}
+
+fn expect_yield(state: &mut ParserState, yield_token: TokenReference) -> Result<ast::Yield, ()> {
+    match parse_expression_list(state) {
+        ParserResult::Value(expr_list) => Ok(ast::Yield::new().with_token(yield_token).with_yields(expr_list)),
+        ParserResult::LexerMoved | ParserResult::NotFound => {
+            state.token_error(yield_token, "expected an expression to yield");
+            Err(())
+        }
+    }
+}
+
+fn expect_main(state: &mut ParserState, main_token: TokenReference) -> Result<ast::Main, ()> {
+    let initial_variable = state.consume_kind(TokenKind::StringLiteral).ok_or(())?;
+
+    let begin_token = state
+        .require(Symbol::Do, "need to specify the instructions in a list")
+        .ok_or(())?;
+
+    let mut assignements = Vec::new();
+    let (end_token, write_stmt) = loop {
+        if let Some(end_token) = state.consume_if(Symbol::End) {
+            break (end_token, None);
+        } else if let Some(return_token) = state.consume_if(Symbol::Return) {
+            let write_stmt = expect_write_variable(state, return_token)?;
+            break state
+                .require(Symbol::End, "expected no more assignations after the return token")
+                .map(|end_token| (end_token, Some(write_stmt)))
+                .ok_or(())?;
+        }
+        assignements.push(expect_main_assign(state)?);
+    };
+
+    Ok(ast::Main::new(main_token, initial_variable, begin_token, end_token)
+        .with_assignements(assignements)
+        .with_returns(write_stmt))
+}
+
+fn expect_main_assign(state: &mut ParserState) -> Result<ast::MainAssignement, ()> {
+    let dest_token = state.consume_kind(TokenKind::StringLiteral).ok_or(())?;
+    let assign_token = state
+        .require(Symbol::Equal, "expected `=` to assign variable")
+        .ok_or(())?;
+
+    let module = state.consume_kind(TokenKind::Identifier).ok_or(())?;
+    let dot_token = state
+        .require(Symbol::Dot, "expected a dot `.` to get which job from the module to call")
+        .ok_or(())?;
+    let the_job = state.consume_kind(TokenKind::Identifier).ok_or(())?;
+
+    let call_list = expect_call_list(state)
+        .map_err(|()| state.token_error(the_job.clone(), "expected a call list to know how to call the job"))?;
+
+    Ok(ast::MainAssignement::new(assign_token, dest_token, module, dot_token, the_job).with_call_list(call_list))
+}
+
+fn expect_call_list(state: &mut ParserState) -> Result<ast::CallList, ()> {
+    let current = state.current()?;
+
+    let mut items = Punctuated::new();
+    let (mut start_list_token, mut end_list_token) = (None, None);
+    match current.token_type() {
+        TokenType::StringLiteral { .. } => items.push(Pair::End(ast::CallListItem::Variable(state.consume().unwrap()))),
+
+        TokenType::Symbol { symbol: Symbol::LeftBrace } => {
+            start_list_token = state.consume().ok();
+            while let Ok(token) = state.current() {
+                let next_item = match token.token_type() {
+                    TokenType::StringLiteral { .. } => ast::CallListItem::Variable(state.consume().unwrap()),
+
+                    TokenType::Identifier { .. } => {
+                        let parameter = state.consume().unwrap();
+                        let equal_token = state.consume_if(Symbol::Equal).ok_or_else(|| {
+                            state.token_error(parameter.clone(), "expected an assignation with `=` for this parameter")
+                        })?;
+                        let expression = parse_expression(state).ok_or(())?;
+                        ast::CallListItem::SetParameter { parameter, equal_token, expression }
+                    }
+
+                    _ => {
+                        state.token_error(
+                            token.clone(),
+                            "expected a string literal to name a parameter or an assignation",
+                        );
+                        return Err(());
+                    }
+                };
+
+                if let Some(comma_token) = state.consume_if(Symbol::Comma) {
+                    items.push(Pair::Punctuated(next_item, comma_token));
+                    continue;
+                } else if let Some(end_token) = state.consume_if(Symbol::RightBrace) {
+                    items.push(Pair::End(next_item));
+                    end_list_token = Some(end_token);
+                    break;
+                }
+
+                let error_token = state.consume().unwrap_or_else(|| next_item.first_token().clone());
+                state.token_error(
+                    error_token,
+                    "expected symbol '}' or ',' after the variable name or a parameter assignation",
+                );
+                return Err(());
+            }
+        }
+        _ => {
+            state.token_error(current.clone(), "expected a call list for the job");
+            return Err(());
+        }
+    }
+
+    Ok(CallList::new()
+        .with_begin_token(start_list_token)
+        .with_end_token(end_list_token)
+        .with_items(items))
+}
+
+fn expect_write_variable(state: &mut ParserState, write_token: TokenReference) -> Result<ast::Write, ()> {
+    let Ok(current) = state.current() else {
+        state.token_error(write_token, "expected something to write");
+        return Err(());
+    };
+
+    let mut variables = Punctuated::new();
+    let (mut start_list_token, mut end_list_token) = (None, None);
+    match current.token_type() {
+        TokenType::StringLiteral { .. } => variables.push(Pair::End(state.consume().unwrap())),
+
+        TokenType::Symbol { symbol: Symbol::LeftBrace } => {
+            start_list_token = state.consume().ok();
+            while let Ok(token) = state.current() {
+                let next_variable = match token.token_kind() {
+                    TokenKind::StringLiteral => state.consume().unwrap(),
+                    _ => {
+                        state.token_error(token.clone(), "expected a string literal to name a variable");
+                        return Err(());
+                    }
+                };
+
+                if let Some(comma_token) = state.consume_if(Symbol::Comma) {
+                    variables.push(Pair::Punctuated(next_variable, comma_token));
+                    continue;
+                } else if let Some(end_token) = state.consume_if(Symbol::RightBrace) {
+                    variables.push(Pair::End(next_variable));
+                    end_list_token = Some(end_token);
+                    break;
+                }
+
+                let error_token = state.consume().unwrap_or(next_variable);
+                state.token_error(error_token, "expected '}' or ',' after the variable name");
+                return Err(());
+            }
+        }
+
+        _ => {
+            state.token_error(current.clone(), "expected a variable name or a list of variable name");
+            return Err(());
+        }
+    }
+
+    Ok(ast::Write::new(write_token)
+        .with_variables(variables)
+        .with_begin_list_token(start_list_token)
+        .with_end_list_token(end_list_token))
+}
+
+fn expect_option_decl(state: &mut ParserState, option_token: TokenReference) -> Result<ast::OptionDecl, ()> {
+    let mut name_list = Punctuated::<TokenReference>::new();
+    let mut type_specifiers = Vec::<Option<ast::TypeSpecifier>>::new();
+
+    let equal_token = loop {
+        let name = match parse_identifier(state) {
+            ParserResult::Value(name) => name,
+            _ => {
+                state.token_error(state.current()?.clone(), "expected an identifier");
+                return Err(());
+            }
+        };
+
+        type_specifiers.push(match state.consume_if(Symbol::Colon) {
+            Some(colon) => Some(expect_type_specifier(state, colon)?),
+            None => None,
+        });
+
+        if let Some(comma) = state.consume_if(Symbol::Comma) {
+            name_list.push_punctuated(name, comma);
+            continue;
+        } else if let Some(equal) = state.consume_if(Symbol::Equal) {
+            name_list.push(Pair::End(name));
+            break equal;
+        }
+
+        state.token_error(option_token, "invalid option specifier statement");
+        state.token_error(
+            state.current().cloned()?,
+            "expected ',' to continue option list or '=' to assign default values to the list",
+        );
+        return Err(());
+    };
+
+    debug_assert_eq!(name_list.len(), type_specifiers.len());
+
+    let expr_list = match parse_expression_list(state) {
+        ParserResult::Value(expr_list) if name_list.len() != expr_list.len() => {
+            state.token_error(option_token, "expected to assign all declared options");
+            return Err(());
+        }
+        ParserResult::NotFound => {
+            state.token_error(equal_token.clone(), "expected an expression");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+        ParserResult::Value(expr_list) => expr_list,
+    };
+
+    Ok(ast::OptionDecl { option_token, name_list, type_specifiers, equal_token, expr_list })
+}
+
+fn expect_local_assignment(state: &mut ParserState, local_token: TokenReference) -> Result<ast::LocalAssignment, ()> {
+    let names = match one_or_more(state, parse_name_with_attributes, Symbol::Comma) {
+        ParserResult::Value(names) => names,
+        ParserResult::NotFound => {
+            unreachable!("expect_local_assignment called without upcoming identifier");
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let mut name_list = Punctuated::new();
+    let mut type_specifiers = Vec::new();
+    let mut attributes = Vec::new();
+
+    for name in names.into_pairs() {
+        let (name, punctuation) = name.into_tuple();
+        attributes.push(name.attribute);
+        type_specifiers.push(name.type_specifier);
+        name_list.push(match punctuation {
+            Some(punctuation) => Pair::Punctuated(name.name, punctuation),
+            None => Pair::End(name.name),
+        });
+    }
+
+    let mut local_assignment = ast::LocalAssignment {
+        local_token,
+        name_list,
+        type_specifiers,
+        equal_token: None,
+        expr_list: Punctuated::new(),
+        attributes,
+    };
+
+    local_assignment.equal_token = match state.consume_if(Symbol::Equal) {
+        Some(equal_token) => Some(equal_token),
+        None => return Ok(local_assignment),
+    };
+
+    match parse_expression_list(state) {
+        ParserResult::Value(expr_list) => local_assignment.expr_list = expr_list,
+        ParserResult::NotFound => {
+            state.token_error(local_assignment.equal_token.clone().unwrap(), "expected an expression")
+        }
+        ParserResult::LexerMoved => {}
+    };
+
+    Ok(local_assignment)
+}
+
+fn expect_expression_key(state: &mut ParserState, left_bracket: TokenReference) -> Result<ast::Field, ()> {
+    let expression = match parse_expression(state) {
+        ParserResult::Value(expression) => expression,
+        ParserResult::NotFound => {
+            state.token_error(left_bracket, "expected an expression after `[`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let right_bracket = state
+        .require_with_reference_range_callback(Symbol::RightBracket, "expected `]` after expression", || {
+            (left_bracket.clone(), expression.tokens().last().unwrap().clone())
+        })
+        .ok_or(())?;
+
+    // rewrite todo: we can realistically construct a field in error recovery
+    // rewrite todo: this should also be range
+    let equal_token = state
+        .require_with_reference_range(Symbol::Equal, "expected `=` after expression", &left_bracket, &right_bracket)
+        .ok_or(())?;
+
+    let value = match parse_expression(state) {
+        ParserResult::Value(expression) => expression,
+        ParserResult::NotFound => {
+            state.token_error(equal_token, "expected an expression after `=`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    Ok(ast::Field::ExpressionKey {
+        brackets: ContainedSpan::new(left_bracket, right_bracket),
+        key: expression,
+        equal: equal_token,
+        value,
+    })
+}
+
+fn force_table_constructor(state: &mut ParserState, left_brace: TokenReference) -> ast::TableConstructor {
+    let mut fields = Punctuated::new();
+    let unfinished_table = |left_brace: TokenReference, fields: Punctuated<ast::Field>| ast::TableConstructor {
+        braces: ContainedSpan::new(left_brace, TokenReference::basic_symbol("}")),
+        fields,
+    };
+
+    loop {
+        let Ok(current_token) = state.current() else {
+            return unfinished_table(left_brace, fields);
+        };
+
+        let field = match current_token.token_type() {
+            TokenType::Symbol { symbol: Symbol::RightBrace } => {
+                return ast::TableConstructor {
+                    braces: ContainedSpan::new(left_brace, state.consume().unwrap()),
+                    fields,
+                }
+            }
+
+            TokenType::Symbol { symbol: Symbol::LeftBracket } => {
+                let left_bracket = state.consume().unwrap();
+                match expect_expression_key(state, left_bracket) {
+                    Ok(field) => field,
+                    Err(()) => return unfinished_table(left_brace, fields),
+                }
+            }
+
+            TokenType::Identifier { .. } if matches!(state.peek(), Ok(peek_token) if peek_token.is_symbol(Symbol::Equal)) =>
+            {
+                let key = state.consume().unwrap();
+                let equal_token = state.consume().unwrap();
+                let value = match parse_expression(state) {
+                    ParserResult::Value(expression) => expression,
+                    ParserResult::NotFound => {
+                        state.token_error(equal_token, "expected an expression after `=`");
+                        return unfinished_table(left_brace, fields);
+                    }
+                    ParserResult::LexerMoved => return unfinished_table(left_brace, fields),
+                };
+                ast::Field::NameKey { key, equal: equal_token, value }
+            }
+
+            _ => ast::Field::NoKey(match parse_expression(state) {
+                ParserResult::Value(expression) => expression,
+                ParserResult::NotFound => {
+                    state.token_error(
+                        match fields.last() {
+                            Some(Pair::End(field)) => field.tokens().last().unwrap().clone(),
+                            Some(Pair::Punctuated(field, _)) => field.tokens().last().unwrap().clone(),
+                            None => left_brace.clone(),
+                        },
+                        "expected a field",
+                    );
+                    return unfinished_table(left_brace, fields);
+                }
+                ParserResult::LexerMoved => return unfinished_table(left_brace, fields),
+            }),
+        };
+
+        match state.current() {
+            Ok(token) => {
+                if token.in_symbols(&[Symbol::Comma, Symbol::Semicolon]) {
+                    fields.push(Pair::Punctuated(field, state.consume().unwrap()))
+                } else {
+                    fields.push(Pair::End(field));
+                    break;
+                }
+            }
+
+            Err(()) => {
+                fields.push(Pair::End(field));
+                break;
+            }
+        };
+    }
+
+    let right_brace = match state.require(Symbol::RightBrace, "expected `}` after last field") {
+        Some(right_brace) => right_brace,
+        None => TokenReference::basic_symbol("}"),
+    };
+
+    ast::TableConstructor { braces: ContainedSpan::new(left_brace, right_brace), fields }
+}
+
+fn expect_repeat_stmt(state: &mut ParserState, repeat_token: TokenReference) -> Result<ast::Stmt, ()> {
+    let block = match parse_block(state) {
+        ParserResult::Value(block) => block,
+        ParserResult::NotFound => {
+            state.token_error(repeat_token, "expected a block after `repeat`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let Some(until_token) = state.require(Symbol::Until, "expected `until` after block") else {
+        return Ok(ast::Stmt::Do(ast::Do::new().with_block(block)));
+    };
+
+    let condition = match parse_expression(state) {
+        ParserResult::Value(expression) => expression,
+        ParserResult::NotFound => {
+            state.token_error(until_token, "expected a condition after `until`");
+            return Ok(ast::Stmt::Do(ast::Do::new().with_block(block)));
+        }
+        ParserResult::LexerMoved => return Ok(ast::Stmt::Do(ast::Do::new().with_block(block))),
+    };
+
+    Ok(ast::Stmt::Repeat(ast::Repeat { repeat_token, block, until: condition, until_token }))
+}
+
+fn expect_while_stmt(state: &mut ParserState, while_token: TokenReference) -> Result<ast::While, ()> {
+    let condition = match parse_expression(state) {
+        ParserResult::Value(expression) => expression,
+        ParserResult::NotFound => {
+            state.token_error(while_token, "expected a condition after `while`");
+            return Err(());
+        }
+        ParserResult::LexerMoved => return Err(()),
+    };
+
+    let Some(do_token) = state.require(Symbol::Do, "expected `do` after condition") else {
+        return Ok(ast::While::new(condition));
+    };
+
+    let (block, end_token) = match expect_block_with_end(state, "while loop", &do_token) {
+        Ok((block, end_token)) => (block, end_token),
+        Err(()) => return Ok(ast::While::new(condition)),
+    };
+
+    Ok(ast::While { while_token, condition, do_token, block, end_token })
+}
+
+fn expect_type_declaration(state: &mut ParserState, type_token: TokenReference) -> Result<ast::TypeDeclaration, ()> {
+    let base = match state.current()? {
+        token if token.token_kind() == TokenKind::Identifier => state.consume().unwrap(),
+        token => {
+            state.token_error(token.clone(), "expected type name");
+            // rewrite todo (in future if needed): maybe we can add an error name here to continue parsing?
+            return Err(());
+        }
+    };
+
+    let equal_token = state
+        .require(Symbol::Equal, "expected `=` after type name")
+        .unwrap_or_else(|| TokenReference::basic_symbol("="));
+
+    let declare_as = parse_type(state).ok_or(())?;
+
+    Ok(ast::TypeDeclaration { type_token, base, equal_token, declare_as })
+}
+
+fn parse_prefix(state: &mut ParserState) -> ParserResult<ast::Prefix> {
+    let current_token = match state.current() {
+        Ok(token) => token,
+        Err(()) => return ParserResult::NotFound,
+    };
+
+    match current_token.token_type() {
+        TokenType::Symbol { symbol: Symbol::LeftParen } => {
+            let left_parenthesis = state.consume().unwrap();
+            let expression = Box::new(match try_parser!(parse_expression(state)) {
+                Some(expression) => expression,
+                None => {
+                    state.token_error(left_parenthesis, "expected an expression after `(`");
+                    return ParserResult::LexerMoved;
+                }
+            });
+
+            let Some(right_parenthesis) = state.require(Symbol::RightParen, "expected `)` after expression") else {
+                return ParserResult::Value(ast::Prefix::Expression(Box::new(ast::Expression::Parentheses {
+                    contained: ContainedSpan::new(left_parenthesis, TokenReference::basic_symbol(")")),
+                    expression,
+                })));
+            };
+
+            ParserResult::Value(ast::Prefix::Expression(Box::new(ast::Expression::Parentheses {
+                contained: ContainedSpan::new(left_parenthesis, right_parenthesis),
+                expression,
+            })))
+        }
+
+        TokenType::Identifier { .. } => ParserResult::Value(ast::Prefix::Name(state.consume().unwrap())),
+
+        _ => ParserResult::NotFound,
+    }
+}
+
+fn parse_arguments(state: &mut ParserState) -> ParserResult<ast::FunctionArgs> {
+    let Ok(current) = state.current() else {
+        return ParserResult::NotFound;
+    };
+
+    match current.token_type() {
+        TokenType::Symbol { symbol: Symbol::LeftParen } => {
+            let left_parenthesis = state.consume().unwrap();
+            let arguments = try_parser!(parse_expression_list(state)).unwrap_or_default();
+            let right_parenthesis = match state.require_with_reference_token(
+                Symbol::RightParen,
+                "expected `)` to close function call",
+                &left_parenthesis,
+            ) {
+                Some(token) => token,
+                None => TokenReference::basic_symbol(")"),
+            };
+
+            ParserResult::Value(ast::FunctionArgs::Parentheses {
+                parentheses: ContainedSpan::new(left_parenthesis, right_parenthesis),
+                arguments,
+            })
+        }
+
+        TokenType::Symbol { symbol: Symbol::LeftBrace } => {
+            let left_brace = state.consume().unwrap();
+            ParserResult::Value(ast::FunctionArgs::TableConstructor(force_table_constructor(state, left_brace)))
+        }
+
+        TokenType::StringLiteral { .. } => ParserResult::Value(ast::FunctionArgs::String(state.consume().unwrap())),
+
+        _ => ParserResult::NotFound,
+    }
+}
+
+fn parse_suffix(state: &mut ParserState) -> ParserResult<ast::Suffix> {
+    let Ok(current) = state.current() else {
+        return ParserResult::NotFound;
+    };
+
+    match current.token_type() {
+        TokenType::Symbol { symbol: Symbol::Dot } => {
+            let dot = state.consume().unwrap();
+            let name = match state.current() {
+                Ok(token) if token.token_kind() == TokenKind::Identifier => state.consume().unwrap(),
+                Ok(_) => {
+                    state.token_error(dot, "expected identifier after `.`");
+                    return ParserResult::LexerMoved;
+                }
+                Err(()) => return ParserResult::LexerMoved,
+            };
+
+            ParserResult::Value(ast::Suffix::Index(ast::Index::Dot { dot, name }))
+        }
+
+        TokenType::Symbol { symbol: Symbol::LeftBracket } => {
+            let left_bracket = state.consume().unwrap();
+
+            let expression = match parse_expression(state) {
+                ParserResult::Value(expression) => expression,
+                ParserResult::LexerMoved => return ParserResult::LexerMoved,
+                ParserResult::NotFound => {
+                    state.token_error(left_bracket, "expected expression after `[`");
+                    return ParserResult::LexerMoved;
+                }
+            };
+
+            let right_bracket = match state.require_with_reference_range(
+                Symbol::RightBracket,
+                "expected `]` to close index expression",
+                &left_bracket,
+                expression.tokens().last().unwrap(),
+            ) {
+                Some(right_bracket) => right_bracket,
+                None => TokenReference::basic_symbol("]"),
+            };
+
+            ParserResult::Value(ast::Suffix::Index(ast::Index::Brackets {
+                brackets: ContainedSpan::new(left_bracket, right_bracket),
+                expression,
+            }))
+        }
+
+        TokenType::Symbol { symbol: Symbol::LeftParen | Symbol::LeftBrace } | TokenType::StringLiteral { .. } => {
+            let arguments = try_parser!(parse_arguments(state)).unwrap();
+            ParserResult::Value(ast::Suffix::Call(ast::Call::AnonymousCall(arguments)))
+        }
+
+        TokenType::Symbol { symbol: Symbol::Colon } => {
+            let colon_token = state.consume().unwrap();
+            let name = match state.current() {
+                Ok(token) if token.token_kind() == TokenKind::Identifier => state.consume().unwrap(),
+                Ok(_) => {
+                    state.token_error(colon_token, "expected identifier after `:`");
+                    return ParserResult::LexerMoved;
+                }
+                Err(()) => return ParserResult::LexerMoved,
+            };
+
+            let args = match parse_arguments(state) {
+                ParserResult::Value(args) => args,
+                ParserResult::LexerMoved => ast::FunctionArgs::empty(),
+                ParserResult::NotFound => {
+                    state.token_error(name.clone(), "expected arguments after `:`");
+                    ast::FunctionArgs::empty()
+                }
+            };
+
+            ParserResult::Value(ast::Suffix::Call(ast::Call::MethodCall(ast::MethodCall { colon_token, name, args })))
+        }
+
+        _ => ParserResult::NotFound,
+    }
+}
+
+fn parse_prefix_and_suffixes(state: &mut ParserState) -> ParserResult<(ast::Prefix, Vec<ast::Suffix>)> {
+    let prefix = match parse_prefix(state) {
+        ParserResult::Value(prefix) => prefix,
+        ParserResult::LexerMoved => return ParserResult::LexerMoved,
+        ParserResult::NotFound => return ParserResult::NotFound,
+    };
+    let suffixes = std::iter::from_fn(|| parse_suffix(state).ok()).collect();
+    ParserResult::Value((prefix, suffixes))
+}
+
+fn parse_expression(state: &mut ParserState) -> ParserResult<Expression> {
+    let primary_expression = match parse_primary_expression(state) {
+        ParserResult::Value(expression) => expression,
+        ParserResult::NotFound => return ParserResult::NotFound,
+        ParserResult::LexerMoved => return ParserResult::LexerMoved,
+    };
+    parse_expression_with_precedence(state, primary_expression, 0)
+}
+
+fn parse_primary_expression(state: &mut ParserState) -> ParserResult<Expression> {
+    let Ok(current_token) = state.current() else {
+        return ParserResult::NotFound;
+    };
+
+    let expression = match current_token.token_type() {
+        TokenType::Symbol { symbol: Symbol::Function } => {
+            let function_token = state.consume().unwrap();
+            let function_body = match parse_function_body(state) {
+                ParserResult::Value(body) => body,
+                ParserResult::LexerMoved => return ParserResult::LexerMoved,
+                ParserResult::NotFound => {
+                    state.token_error(function_token, "expected a function body");
+                    return ParserResult::LexerMoved;
+                }
+            };
+
+            ParserResult::Value(Expression::Function(Box::new((function_token, function_body))))
+        }
+
+        TokenType::Symbol { symbol: Symbol::True | Symbol::False | Symbol::Nil } => {
+            ParserResult::Value(Expression::Symbol(state.consume().unwrap()))
+        }
+
+        TokenType::StringLiteral { .. } => ParserResult::Value(Expression::String(state.consume().unwrap())),
+        TokenType::Number { .. } => ParserResult::Value(Expression::Number(state.consume().unwrap())),
+
+        TokenType::Identifier { .. } | TokenType::Symbol { symbol: Symbol::LeftParen } => {
+            let (prefix, suffixes) = match parse_prefix_and_suffixes(state) {
+                ParserResult::Value(value) => value,
+                ParserResult::LexerMoved => return ParserResult::LexerMoved,
+                ParserResult::NotFound => {
+                    unreachable!("identifier found but parse_prefix_and_suffixes didn't even move")
+                }
+            };
+
+            if suffixes.is_empty() {
+                match prefix {
+                    ast::Prefix::Expression(expression) => ParserResult::Value(*expression),
+                    ast::Prefix::Name(name) => ParserResult::Value(Expression::Var(ast::Var::Name(name))),
+                }
+            } else if matches!(suffixes.last().unwrap(), ast::Suffix::Call(_)) {
+                ParserResult::Value(Expression::FunctionCall(ast::FunctionCall { prefix, suffixes }))
+            } else {
+                ParserResult::Value(Expression::Var(ast::Var::Expression(Box::new(ast::VarExpression {
+                    prefix,
+                    suffixes,
+                }))))
+            }
+        }
+
+        TokenType::Symbol { symbol: Symbol::Minus | Symbol::Not | Symbol::Hash | Symbol::Tilde } => {
+            let unary_operator_token = state.consume().unwrap();
+            parse_unary_expression(state, unary_operator_token)
+        }
+
+        TokenType::Symbol { symbol: Symbol::LeftBrace } => {
+            let left_brace = state.consume().unwrap();
+            ParserResult::Value(ast::Expression::TableConstructor(force_table_constructor(state, left_brace)))
+        }
+
+        TokenType::Symbol { symbol: Symbol::If } => {
+            let if_token = state.consume().unwrap();
+            match expect_if_else_expression(state, if_token) {
+                Ok(if_expression) => ParserResult::Value(ast::Expression::IfExpression(if_expression)),
+                Err(_) => ParserResult::LexerMoved,
+            }
+        }
+
+        _ => ParserResult::NotFound,
+    };
+
+    match expression {
+        ParserResult::Value(expression) => {
+            if let Some(assertion_op) = state.consume_if(Symbol::TwoColons) {
+                let ParserResult::Value(cast_to) = parse_type(state) else {
+                    return ParserResult::LexerMoved;
+                };
+                ParserResult::Value(ast::Expression::TypeAssertion {
+                    expression: Box::new(expression),
+                    type_assertion: ast::TypeAssertion { assertion_op, cast_to },
+                })
+            } else {
+                ParserResult::Value(expression)
+            }
+        }
+        _ => expression,
+    }
+}
+
+// rewrite todo: i think this should be iterative instead of recursive
+fn parse_expression_with_precedence(
+    state: &mut ParserState,
+    mut lhs: Expression,
+    precedence: u8,
+) -> ParserResult<Expression> {
+    loop {
+        let Some(bin_op_precedence) = ast::BinOp::precedence_of_token(match state.current() {
+            Ok(token) => token,
+            Err(()) => return ParserResult::Value(lhs),
+        }) else {
+            return ParserResult::Value(lhs);
+        };
+
+        if bin_op_precedence < precedence {
+            return ParserResult::Value(lhs);
+        }
+
+        let bin_op = ast::BinOp::consume(state).unwrap();
+
+        let mut rhs = match parse_primary_expression(state) {
+            ParserResult::Value(expression) => expression,
+            ParserResult::NotFound => {
+                state.token_error(bin_op.token().clone(), "expected expression after binary operator");
+                return ParserResult::Value(lhs);
+            }
+            ParserResult::LexerMoved => return ParserResult::LexerMoved,
+        };
+
+        while let Ok(next_bin_op_token) = state.current() {
+            let Some(next_bin_op_precedence) = ast::BinOp::precedence_of_token(next_bin_op_token) else {
+                break;
+            };
+
+            let precedence_to_search = if next_bin_op_precedence > bin_op_precedence {
+                bin_op_precedence + 1
+            } else if ast::BinOp::is_right_associative_token(next_bin_op_token)
+                && next_bin_op_precedence == bin_op_precedence
+            {
+                bin_op_precedence
+            } else {
+                break;
+            };
+
+            rhs = match parse_expression_with_precedence(state, rhs, precedence_to_search) {
+                ParserResult::Value(expression) => expression,
+                ParserResult::NotFound => {
+                    state.token_error(bin_op.token().clone(), "expected expression after binary operator");
+                    return ParserResult::Value(lhs);
+                }
+                ParserResult::LexerMoved => return ParserResult::Value(lhs),
+            };
+        }
+
+        lhs = Expression::BinaryOperator { lhs: Box::new(lhs), binop: bin_op, rhs: Box::new(rhs) };
+    }
+}
+
+fn parse_unary_expression(
+    state: &mut ParserState,
+    unary_operator_token: ast::TokenReference,
+) -> ParserResult<ast::Expression> {
+    let unary_operator = match unary_operator_token.token_type() {
+        TokenType::Symbol { symbol } => match symbol {
+            Symbol::Minus => ast::UnOp::Minus(unary_operator_token),
+            Symbol::Not => ast::UnOp::Not(unary_operator_token),
+            Symbol::Hash => ast::UnOp::Hash(unary_operator_token),
+            Symbol::Tilde => ast::UnOp::Tilde(unary_operator_token),
+            _ => unreachable!(),
+        },
+
+        _ => unreachable!(),
+    };
+
+    let primary_expression = match parse_primary_expression(state) {
+        ParserResult::Value(expression) => expression,
+        ParserResult::NotFound => {
+            state.token_error(
+                unary_operator.token().clone(),
+                format!("expected an expression after {}", unary_operator.token().token()),
+            );
+            return ParserResult::NotFound;
+        }
+        ParserResult::LexerMoved => return ParserResult::LexerMoved,
+    };
+
+    let expression = match parse_expression_with_precedence(state, primary_expression, ast::UnOp::precedence()) {
+        ParserResult::Value(expression) => expression,
+        ParserResult::LexerMoved => return ParserResult::LexerMoved,
+        ParserResult::NotFound => {
+            state.token_error(
+                unary_operator.token().clone(),
+                format!("expected an expression after {}", unary_operator.token().token()),
+            );
+            return ParserResult::LexerMoved;
+        }
+    };
+
+    ParserResult::Value(Expression::UnaryOperator { unop: unary_operator, expression: Box::new(expression) })
+}
+
+fn parse_function_body(state: &mut ParserState) -> ParserResult<FunctionBody> {
+    let Some(left_parenthesis) = state.consume_if(Symbol::LeftParen) else {
+        return ParserResult::NotFound;
+    };
+
+    let mut parameters = Punctuated::new();
+    let mut type_specifiers = Vec::new();
+    let right_parenthesis;
+
+    let unfinished_function_body = |left_parenthesis: TokenReference, mut parameters: Punctuated<Parameter>| {
+        if matches!(parameters.last(), Some(Pair::Punctuated(..))) {
+            let last_parameter = parameters.pop().unwrap();
+            parameters.push(Pair::End(last_parameter.into_value()));
+        }
+
+        // rewrite todo: we should appropriately recover the parsed type_specifiers here but it
+        // becomes messy with cfg feature toggles and moves.
+        ParserResult::Value(FunctionBody {
+            parameters_parentheses: ContainedSpan::new(left_parenthesis, TokenReference::basic_symbol(")")),
+            parameters,
+            type_specifiers: Vec::new(), // rewrite todo: fix
+            return_type: None,
+            block: ast::Block::new(),
+            end_token: TokenReference::basic_symbol("end"),
+        })
+    };
+
+    loop {
+        match state.current() {
+            Ok(token) if token.is_symbol(Symbol::RightParen) => {
+                right_parenthesis = state.consume().unwrap();
+                break;
+            }
+
+            Ok(TokenReference { token: Token { token_type: TokenType::Identifier { .. }, .. }, .. }) => {
+                let name_parameter = match parse_name_with_type_specifiers(state) {
+                    ParserResult::Value(Name { name, type_specifier, .. }) => {
+                        type_specifiers.push(type_specifier);
+                        ast::Parameter { name }
+                    }
+                    _ => unreachable!(),
+                };
+
+                let Some(comma) = state.consume_if(Symbol::Comma) else {
+                    parameters.push(Pair::End(name_parameter));
+                    match state.require(Symbol::RightParen, "expected a `)`") {
+                        Some(new_right_parenthesis) => {
+                            right_parenthesis = new_right_parenthesis;
+                            break;
+                        }
+                        None => return unfinished_function_body(left_parenthesis, parameters),
+                    };
+                };
+
+                parameters.push(Pair::Punctuated(name_parameter, comma));
+            }
+
+            Ok(token) => {
+                state.token_error(token.clone(), "expected a parameter name or `)`");
+                return unfinished_function_body(left_parenthesis, parameters);
+            }
+
+            Err(()) => return unfinished_function_body(left_parenthesis, parameters),
+        }
+    }
+
+    if matches!(parameters.last(), Some(Pair::Punctuated(..))) {
+        let last_parameter = parameters.pop().unwrap();
+        state
+            .token_error(last_parameter.punctuation().unwrap().clone(), "trailing commas in arguments are not allowed");
+        parameters.push(Pair::End(last_parameter.into_value()));
+    }
+
+    let return_type = if let Some(punctuation) = state.consume_if(Symbol::Colon) {
+        match parse_return_type(state) {
+            ParserResult::Value(type_info) => Some(ast::TypeSpecifier { punctuation, type_info }),
+            _ => return ParserResult::LexerMoved,
+        }
+    } else if let Some(punctuation) = state.consume_if(Symbol::ThinArrow) {
+        state.token_error(punctuation.clone(), "function return type annotations should use `:` instead of `->`");
+        match parse_return_type(state) {
+            ParserResult::Value(type_info) => Some(ast::TypeSpecifier { punctuation, type_info }),
+            _ => return ParserResult::LexerMoved,
+        }
+    } else {
+        None
+    };
+
+    let (block, end) = match expect_block_with_end(state, "function body", &right_parenthesis) {
+        Ok((block, end)) => (block, end),
+        Err(()) => return ParserResult::LexerMoved,
+    };
+
+    ParserResult::Value(FunctionBody {
+        parameters_parentheses: ContainedSpan::new(left_parenthesis, right_parenthesis),
+        parameters,
+        type_specifiers,
+        return_type,
+        block,
+        end_token: end,
+    })
+}
+
+fn expect_if_else_expression(state: &mut ParserState, if_token: TokenReference) -> Result<ast::IfExpression, ()> {
+    let condition = parse_expression(state).ok_or(())?;
+    let then_token = state
+        .require(Symbol::Then, "expected `then` after condition")
+        .ok_or(())?;
+    let if_expression = parse_expression(state).ok_or(())?;
+
+    let mut else_if_expressions = Vec::new();
+    while let Some(else_if_token) = state.consume_ifs(&[Symbol::ElseIf, Symbol::ElIf]) {
+        let condition = parse_expression(state).ok_or(())?;
+        let then_token = state
+            .require(Symbol::Then, "expected `then` after condition")
+            .ok_or(())?;
+        let expression = parse_expression(state).ok_or(())?;
+        else_if_expressions.push(ast::ElseIfExpression { else_if_token, condition, then_token, expression })
+    }
+
+    let else_token = state
+        .require(Symbol::Else, "expected `else` to end if-else expression")
+        .ok_or(())?;
+    let else_expression = parse_expression(state).ok_or(())?;
+
+    Ok(ast::IfExpression {
+        if_token,
+        condition: Box::new(condition),
+        then_token,
+        if_expression: Box::new(if_expression),
+        else_if_expressions: if else_if_expressions.is_empty() { None } else { Some(else_if_expressions) },
+        else_token,
+        else_expression: Box::new(else_expression),
+    })
+}
+
+fn parse_type(state: &mut ParserState) -> ParserResult<ast::TypeInfo> {
+    let ParserResult::Value(simple_type) = parse_simple_type(state) else {
+        return ParserResult::LexerMoved;
+    };
+
+    let mut current_type = simple_type;
+    while let Some(question_mark) = state.consume_if(Symbol::QuestionMark) {
+        current_type = ast::TypeInfo::Optional { base: Box::new(current_type), question_mark };
+    }
+    ParserResult::Value(current_type)
+}
+
+fn parse_simple_type(state: &mut ParserState) -> ParserResult<ast::TypeInfo> {
+    let Ok(current_token) = state.current() else {
+        return ParserResult::NotFound;
+    };
+
+    match current_token.token_type() {
+        TokenType::Symbol { symbol: Symbol::Nil } => {
+            let nil_token = state.consume().unwrap();
+            ParserResult::Value(ast::TypeInfo::Basic(nil_token))
+        }
+        TokenType::Identifier { .. } => {
+            let name = state.consume().unwrap();
+            if name.to_string() == "typeof" {
+                let left_parenthesis = match state.require(Symbol::LeftParen, "expected `(` after `typeof`") {
+                    Some(token) => token,
+                    None => TokenReference::basic_symbol("("),
+                };
+
+                let ParserResult::Value(expression) = parse_expression(state) else {
+                    return ParserResult::LexerMoved;
+                };
+
+                let right_parenthesis = match state.require_with_reference_token(
+                    Symbol::RightParen,
+                    "expected `)` to close typeof call",
+                    &left_parenthesis,
+                ) {
+                    Some(token) => token,
+                    None => TokenReference::basic_symbol(")"),
+                };
+
+                ParserResult::Value(ast::TypeInfo::Typeof {
+                    typeof_token: name,
+                    parentheses: ContainedSpan::new(left_parenthesis, right_parenthesis),
+                    inner: Box::new(expression),
+                })
+            } else {
+                ParserResult::Value(ast::TypeInfo::Basic(name))
+            }
+        }
+        TokenType::Symbol { symbol: Symbol::LeftBrace } => {
+            let left_brace = state.consume().unwrap();
+            match expect_type_table(state, left_brace) {
+                Ok(table) => ParserResult::Value(table),
+                Err(_) => ParserResult::LexerMoved,
+            }
+        }
+        TokenType::Symbol { symbol: Symbol::LeftParen } => match expect_function_type(state) {
+            Ok(type_info) => ParserResult::Value(type_info),
+            Err(_) => ParserResult::LexerMoved,
+        },
+        _ => ParserResult::NotFound,
+    }
+}
+
+fn expect_type_table(state: &mut ParserState, left_brace: TokenReference) -> Result<ast::TypeInfo, ()> {
+    let mut fields = Punctuated::new();
+    let mut has_indexer = false;
+    let mut array_type = None;
+
+    loop {
+        let current_token = state.current()?;
+
+        let field = if current_token.is_symbol(Symbol::RightBrace) {
+            debug_assert!(array_type.is_none(), "consuming right brace in loop but have seen array type");
+            let braces = ContainedSpan::new(left_brace, state.consume().unwrap());
+            return Ok(ast::TypeInfo::Table { braces, fields });
+        } else if current_token.is_symbol(Symbol::LeftBracket) {
+            let left_brace = state.consume().unwrap();
+            let key = match parse_type(state) {
+                ParserResult::Value(value) => value,
+                ParserResult::NotFound => {
+                    state.token_error(state.current().unwrap().clone(), "expected type for type field key");
+                    return Err(());
+                }
+                ParserResult::LexerMoved => return Err(()),
+            };
+            let right_brace = state
+                .require(Symbol::RightBracket, "expected `]` to close `[` for type table field")
+                .ok_or(())?;
+            let colon = state
+                .require(Symbol::Colon, "expected `:` after type field key")
+                .ok_or(())?;
+
+            let value = match parse_type(state) {
+                ParserResult::Value(value) => value,
+                ParserResult::NotFound => {
+                    state.token_error(state.current().unwrap().clone(), "expected type after type field key");
+                    return Err(());
+                }
+                ParserResult::LexerMoved => return Err(()),
+            };
+
+            if has_indexer {
+                state.token_error_ranged(
+                    left_brace.clone(),
+                    "cannot have more than one table indexer",
+                    &left_brace,
+                    value.tokens().last().unwrap(),
+                );
+            }
+            has_indexer = true;
+
+            ast::TypeField {
+                key: ast::TypeFieldKey::IndexSignature {
+                    brackets: ContainedSpan::new(left_brace, right_brace),
+                    inner: key,
+                },
+                colon,
+                value,
+            }
+        } else if fields.is_empty()
+            && !has_indexer
+            && !(current_token.token_kind() == TokenKind::Identifier
+                && matches!(state.peek(), Ok(token) if token.is_symbol(Symbol::Colon)))
+        {
+            array_type = Some(match parse_type(state) {
+                ParserResult::Value(value) => value,
+                ParserResult::NotFound => {
+                    state.token_error(state.current().unwrap().clone(), "expected type for table array");
+                    return Err(());
+                }
+                ParserResult::LexerMoved => return Err(()),
+            });
+            break;
+        } else {
+            match parse_name(state) {
+                ParserResult::Value(name) => {
+                    let colon = state
+                        .require(Symbol::Colon, "expected `:` after type field key")
+                        .ok_or(())?;
+                    let value = match parse_type(state) {
+                        ParserResult::Value(value) => value,
+                        ParserResult::NotFound => {
+                            state.token_error(state.current().unwrap().clone(), "expected type after type field key");
+                            return Err(());
+                        }
+                        ParserResult::LexerMoved => return Err(()),
+                    };
+                    ast::TypeField { key: ast::TypeFieldKey::Name(name.name), colon, value }
+                }
+                ParserResult::NotFound => break,
+                ParserResult::LexerMoved => return Err(()),
+            }
+        };
+
+        match state.current() {
+            Ok(token) => {
+                if token.in_symbols(&[Symbol::Comma, Symbol::Semicolon]) {
+                    fields.push(Pair::Punctuated(field, state.consume().unwrap()))
+                } else {
+                    fields.push(Pair::End(field));
+                    break;
+                }
+            }
+
+            Err(()) => {
+                fields.push(Pair::End(field));
+                break;
+            }
+        };
+    }
+
+    let right_brace = state
+        .require(Symbol::RightBrace, "expected `}` to close type table")
+        .unwrap_or_else(|| TokenReference::basic_symbol("}"));
+
+    let braces = ContainedSpan::new(left_brace, right_brace);
+
+    if let Some(type_info) = array_type {
+        Ok(ast::TypeInfo::Array { braces, type_info: Box::new(type_info) })
+    } else {
+        Ok(ast::TypeInfo::Table { braces, fields })
+    }
+}
+
+fn expect_function_type(state: &mut ParserState) -> Result<ast::TypeInfo, ()> {
+    let mut arguments = Punctuated::new();
+    let left_paren = state.require(Symbol::LeftParen, "expected `(`").ok_or(())?;
+
+    while !matches!(state.current(), Ok(token) if token.is_symbol(Symbol::RightParen)) {
+        let current_token = state.current()?;
+        let name = if current_token.token_kind() == TokenKind::Identifier
+            && matches!(state.peek(), Ok(token) if token.is_symbol(Symbol::Colon))
+        {
+            Some((state.consume().unwrap(), state.consume().unwrap()))
+        } else {
+            None
+        };
+
+        let type_info = parse_type(state).ok_or(())?;
+        let type_argument = ast::TypeArgument { name, type_info };
+        if !matches!(state.current(), Ok(token) if token.is_symbol(Symbol::Comma)) {
+            arguments.push(Pair::End(type_argument));
+            break;
+        }
+
+        let punctuation = state.consume().unwrap();
+        arguments.push(Pair::Punctuated(type_argument, punctuation));
+        if matches!(state.current(), Ok(token) if token.is_symbol(Symbol::RightParen)) {
+            state.token_error(state.current().unwrap().clone(), "expected type after `,` but got `)` instead");
+            break;
+        }
+    }
+
+    let right_paren = state
+        .require(Symbol::RightParen, "expected `)` to close `(`")
+        .ok_or(())?;
+
+    let parentheses = ContainedSpan::new(left_paren, right_paren);
+
+    if !arguments.iter().any(|arg: &ast::TypeArgument| arg.name().is_some())
+        && !matches!(state.current(), Ok(token) if token.is_symbol(Symbol::ThinArrow))
+        && !arguments.is_empty()
+    {
+        let types = arguments
+            .into_pairs()
+            .map(|pair| pair.map(|argument| argument.type_info))
+            .collect();
+        return Ok(ast::TypeInfo::Tuple { parentheses, types });
+    }
+
+    let arrow = state
+        .require(Symbol::ThinArrow, "expected `->` after `()` for function type")
+        .ok_or(())?;
+    let return_type = parse_return_type(state).ok_or(())?;
+
+    Ok(ast::TypeInfo::Callback { parentheses, arguments, arrow, return_type: Box::new(return_type) })
+}
+
+fn expect_type_specifier(state: &mut ParserState, punctuation: TokenReference) -> Result<ast::TypeSpecifier, ()> {
+    let ParserResult::Value(type_info) = parse_type(state) else {
+        state.token_error(punctuation, "expected type info after `:`");
+        return Err(());
+    };
+    Ok(ast::TypeSpecifier { punctuation, type_info })
+}
+
+fn parse_return_type(state: &mut ParserState) -> ParserResult<ast::TypeInfo> {
+    parse_type(state)
+        .ok()
+        .map(ParserResult::Value)
+        .unwrap_or(ParserResult::LexerMoved)
+}
+
+#[derive(Clone)]
+struct Name {
+    name: TokenReference,
+    attribute: Option<super::Attribute>,
+    type_specifier: Option<ast::TypeSpecifier>,
+}
+
+fn parse_name(state: &mut ParserState) -> ParserResult<Name> {
+    let Ok(current_token) = state.current() else {
+        return ParserResult::NotFound;
+    };
+
+    match current_token.token_type() {
+        TokenType::Identifier { .. } => {
+            let name_token = state.consume().unwrap();
+            ParserResult::Value(force_name(state, name_token))
+        }
+
+        _ => ParserResult::NotFound,
+    }
+}
+
+fn parse_identifier(state: &mut ParserState) -> ParserResult<TokenReference> {
+    let Ok(current_token) = state.current() else {
+        return ParserResult::NotFound;
+    };
+    let token = match current_token.token_type() {
+        TokenType::Identifier { .. } => state.consume().unwrap(),
+        _ => {
+            state.token_error(current_token.clone(), "expected an identifier");
+            return ParserResult::NotFound;
+        }
+    };
+    ParserResult::Value(token)
+}
+
+fn parse_name_with_attributes(state: &mut ParserState) -> ParserResult<Name> {
+    let Ok(current_token) = state.current() else {
+        return ParserResult::NotFound;
+    };
+
+    match current_token.token_type() {
+        TokenType::Identifier { .. } => {
+            let name_token = state.consume().unwrap();
+            ParserResult::Value(force_name_with_attributes(state, name_token))
+        }
+
+        _ => ParserResult::NotFound,
+    }
+}
+
+fn parse_name_with_type_specifiers(state: &mut ParserState) -> ParserResult<Name> {
+    let Ok(current_token) = state.current() else {
+        return ParserResult::NotFound;
+    };
+    match current_token.token_type() {
+        TokenType::Identifier { .. } => {
+            let name_token = state.consume().unwrap();
+            ParserResult::Value(force_name_with_type_specifiers(state, name_token))
+        }
+        _ => ParserResult::NotFound,
+    }
+}
+
+fn force_name(_state: &mut ParserState, name: TokenReference) -> Name {
+    Name { name, attribute: None, type_specifier: None }
+}
+
+fn force_name_with_attributes(state: &mut ParserState, name: TokenReference) -> Name {
+    // NOTE: whenever attributes can be parsed, type specifiers are possible
+    // so we should fall back to parsing type specifiers if an attribute is not found.
+    // NOTE: we do not attempt to parse both type specifiers and attributes at the same time
+
+    if let Some(left_angle_bracket) = state.consume_if(Symbol::LessThan) {
+        const ERROR_INVALID_ATTRIBUTE: &str = "expected identifier after `<` for attribute";
+
+        let attribute_name = match state.current() {
+            Ok(token) if matches!(token.token_type(), TokenType::Identifier { .. }) => state.consume().unwrap(),
+            Ok(token) => {
+                state.token_error_ranged(token.clone(), ERROR_INVALID_ATTRIBUTE, &left_angle_bracket, &token.clone());
+                return Name { name, attribute: None, type_specifier: None };
+            }
+            Err(()) => {
+                state.token_error(left_angle_bracket, ERROR_INVALID_ATTRIBUTE);
+                return Name { name, attribute: None, type_specifier: None };
+            }
+        };
+
+        let Some(right_angle_bracket) = state.require(Symbol::GreaterThan, "expected `>` to close attribute") else {
+            return Name {
+                name,
+                attribute: Some(super::Attribute {
+                    brackets: ContainedSpan::new(left_angle_bracket, TokenReference::basic_symbol(">")),
+                    name: attribute_name,
+                }),
+                type_specifier: None,
+            };
+        };
+
+        return Name {
+            name,
+            attribute: Some(super::Attribute {
+                brackets: ContainedSpan::new(left_angle_bracket, right_angle_bracket),
+                name: attribute_name,
+            }),
+            type_specifier: None,
+        };
+    }
+
+    force_name_with_type_specifiers(state, name)
+}
+
+fn force_name_with_type_specifiers(state: &mut ParserState, name: TokenReference) -> Name {
+    match state.consume_if(Symbol::Colon).map(|p| expect_type_specifier(state, p)) {
+        Some(Ok(type_specifier)) => Name { name, attribute: None, type_specifier: Some(type_specifier) },
+        Some(Err(())) => Name { name, attribute: None, type_specifier: None },
+        None => force_name(state, name),
+    }
+}
+
+fn one_or_more<T, F: Fn(&mut ParserState) -> ParserResult<T>>(
+    state: &mut ParserState,
+    parser: F,
+    delimiter: Symbol,
+) -> ParserResult<Punctuated<T>> {
+    let mut values = Punctuated::new();
+
+    loop {
+        let value = match parser(state) {
+            ParserResult::Value(value) => value,
+            ParserResult::NotFound | ParserResult::LexerMoved => break,
+        };
+
+        match state.consume_if(delimiter) {
+            Some(delimiter) => values.push(Pair::Punctuated(value, delimiter)),
+            None => {
+                values.push(Pair::End(value));
+                break;
+            }
+        }
+    }
+
+    if values.is_empty() {
+        return ParserResult::NotFound;
+    }
+
+    if let Some(Pair::Punctuated(..)) = values.last() {
+        let last_value = values.pop().unwrap();
+        state.token_error(last_value.punctuation().unwrap().clone(), "trailing commas are not allowed");
+        values.push(Pair::End(last_value.into_value()));
+    }
+
+    ParserResult::Value(values)
+}
+
+fn parse_name_list(state: &mut ParserState) -> ParserResult<Punctuated<Name>> {
+    one_or_more(state, parse_name_with_type_specifiers, Symbol::Comma)
+}
+
+fn parse_expression_list(state: &mut ParserState) -> ParserResult<Punctuated<Expression>> {
+    one_or_more(state, parse_expression, Symbol::Comma)
+}
diff --git a/src/Rust/vvs_parser/src/ast/parsers/structs/ast_result.rs b/src/Rust/vvs_parser/src/ast/parsers/structs/ast_result.rs
new file mode 100644
index 00000000..9d4ab190
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/parsers/structs/ast_result.rs
@@ -0,0 +1,117 @@
+use crate::{
+    ast::{
+        parsers::{parse_block, ParserResult, ParserState},
+        Ast,
+    },
+    tokenizer::{Lexer, LexerResult, TokenKind},
+};
+
+/// A produced [`Ast`](crate::ast::Ast), along with any errors found during parsing.
+/// This Ast may not be exactly the same as the input code, as reconstruction may have occurred.
+/// For more information, read the documentation for [`parse_fallible`](crate::parse_fallible).
+pub struct AstResult {
+    ast: Ast,
+    errors: Vec<crate::Error>,
+}
+
+impl AstResult {
+    /// Returns a reference to the [`Ast`](crate::ast::Ast) that was parsed.
+    /// If there were any errors, this will not be exactly the same,
+    /// as reconstruction will have occurred.
+    /// For more information, read the documentation for [`parse_fallible`](crate::parse_fallible).
+    pub fn ast(&self) -> &Ast {
+        &self.ast
+    }
+
+    /// Consumes the [`Ast`](crate::ast::Ast) that was parsed.
+    /// If there were any errors, this will not be exactly the same,
+    /// as reconstruction will have occurred.
+    /// For more information, read the documentation for [`parse_fallible`](crate::parse_fallible).
+    pub fn into_ast(self) -> Ast {
+        self.ast
+    }
+
+    /// Returns all errors that occurred during parsing.
+    pub fn errors(&self) -> &[crate::Error] {
+        &self.errors
+    }
+
+    pub(crate) fn parse_fallible(code: &str) -> Self {
+        use crate::{ast::AstError, Error};
+        const UNEXPECTED_TOKEN_ERROR: &str = "unexpected token, this needs to be a statement";
+
+        let lexer = Lexer::new(code);
+        let mut parser_state = ParserState::new(lexer);
+        let mut block = parse_block(&mut parser_state).unwrap_or_defaut();
+
+        loop {
+            match parser_state.lexer.current() {
+                Some(LexerResult::Ok(token)) if token.token_kind() == TokenKind::Eof => break,
+                Some(LexerResult::Ok(_) | LexerResult::Recovered(_, _)) => {
+                    let ParserResult::Value(new_block) = parse_block(&mut parser_state) else {
+                        continue;
+                    };
+                    if new_block.stmts.is_empty() {
+                        match parser_state.current() {
+                            Ok(token) if token.token_kind() == TokenKind::Eof => break,
+                            _ => {}
+                        }
+                        match parser_state.consume() {
+                            ParserResult::Value(token) => match parser_state.errors.last() {
+                                Some(Error::AstError(AstError { additional, .. }))
+                                    if additional == UNEXPECTED_TOKEN_ERROR =>
+                                {
+                                    continue
+                                }
+                                Some(Error::AstError(AstError { .. })) => {
+                                    parser_state.token_error(token, UNEXPECTED_TOKEN_ERROR)
+                                }
+                                _ => parser_state.token_error(token, UNEXPECTED_TOKEN_ERROR),
+                            },
+                            ParserResult::LexerMoved => {}
+                            ParserResult::NotFound => unreachable!(),
+                        }
+                        continue;
+                    }
+                    block.merge_blocks(new_block);
+                }
+                Some(LexerResult::Fatal(_)) => parser_state.errors.extend(
+                    Option::unwrap(parser_state.lexer.consume())
+                        .unwrap_errors()
+                        .into_iter()
+                        .map(Error::TokenizerError),
+                ),
+                None => break,
+            }
+        }
+
+        let eof = match parser_state.lexer.consume().unwrap() {
+            LexerResult::Ok(token) => token,
+            LexerResult::Recovered(token, errors) => {
+                parser_state
+                    .errors
+                    .extend(errors.into_iter().map(Error::TokenizerError));
+                token
+            }
+            LexerResult::Fatal(error) => unreachable!("error: {error:?}"),
+        };
+
+        debug_assert_eq!(eof.token_kind(), TokenKind::Eof);
+        Self { ast: Ast { nodes: block, eof }, errors: parser_state.errors }
+    }
+
+    /// Consumes this AstResult, returning the [`Ast`](crate::ast::Ast) that was parsed.
+    pub fn into_result(self) -> Result<Ast, Vec<crate::Error>> {
+        self.into()
+    }
+}
+
+impl From<AstResult> for Result<Ast, Vec<crate::Error>> {
+    fn from(ast_result: AstResult) -> Self {
+        if ast_result.errors.is_empty() {
+            Ok(ast_result.ast)
+        } else {
+            Err(ast_result.errors)
+        }
+    }
+}
diff --git a/src/Rust/vvs_parser/src/ast/parsers/structs/mod.rs b/src/Rust/vvs_parser/src/ast/parsers/structs/mod.rs
new file mode 100644
index 00000000..6dc9ff19
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/parsers/structs/mod.rs
@@ -0,0 +1,148 @@
+use crate::{
+    tokenizer::{Lexer, LexerResult, Symbol, TokenKind, TokenReference},
+    traits::MaybeLazyString,
+};
+use std::borrow::Cow;
+
+mod ast_result;
+mod option_table_result;
+mod result;
+
+pub use crate::ast::parsers::structs::{ast_result::*, option_table_result::*, result::*};
+
+pub struct ParserState {
+    errors: Vec<crate::Error>,
+    lexer: Lexer,
+}
+
+impl ParserState {
+    pub fn new(lexer: Lexer) -> Self {
+        Self { errors: Vec::new(), lexer }
+    }
+
+    pub fn current(&self) -> Result<&TokenReference, ()> {
+        match self.lexer.current() {
+            Some(LexerResult::Ok(token) | LexerResult::Recovered(token, _)) => Ok(token),
+            Some(LexerResult::Fatal(_)) => Err(()),
+            None => unreachable!("current() called past EOF"),
+        }
+    }
+
+    pub fn peek(&self) -> Result<&TokenReference, ()> {
+        match self.lexer.peek() {
+            Some(LexerResult::Ok(token) | LexerResult::Recovered(token, _)) => Ok(token),
+            Some(LexerResult::Fatal(_)) => Err(()),
+            None => unreachable!("peek() called past EOF"),
+        }
+    }
+
+    pub fn consume(&mut self) -> ParserResult<TokenReference> {
+        match self.lexer.consume() {
+            Some(LexerResult::Ok(token)) => ParserResult::Value(token),
+            Some(LexerResult::Recovered(token, errors)) => {
+                self.errors.extend(errors.into_iter().map(crate::Error::TokenizerError));
+                ParserResult::Value(token)
+            }
+            Some(LexerResult::Fatal(errors)) => {
+                self.errors.extend(errors.into_iter().map(crate::Error::TokenizerError));
+                ParserResult::LexerMoved
+            }
+            None => ParserResult::NotFound,
+        }
+    }
+
+    pub fn consume_ifs(&mut self, symbols: &[Symbol]) -> Option<TokenReference> {
+        symbols.iter().copied().find_map(|symbol| self.consume_if(symbol))
+    }
+
+    pub fn consume_if(&mut self, symbol: Symbol) -> Option<TokenReference> {
+        self.current().ok()?.is_symbol(symbol).then(|| self.consume().unwrap())
+    }
+
+    pub fn consume_kind(&mut self, kind: TokenKind) -> Option<TokenReference> {
+        if self.current().ok()?.is_kind(kind) {
+            Some(self.consume().unwrap())
+        } else {
+            self.token_error(self.current().unwrap().clone(), format!("expected a token of type {kind:?}"));
+            None
+        }
+    }
+
+    pub fn require(&mut self, symbol: Symbol, error: &'static str) -> Option<TokenReference> {
+        if self.current().ok()?.is_symbol(symbol) {
+            Some(self.consume().unwrap())
+        } else {
+            self.token_error(self.current().ok()?.clone(), error);
+            None
+        }
+    }
+
+    pub fn require_with_reference_token(
+        &mut self,
+        symbol: Symbol,
+        error: &'static str,
+        reference_token: &TokenReference,
+    ) -> Option<TokenReference> {
+        if self.current().ok()?.is_symbol(symbol) {
+            Some(self.consume().unwrap())
+        } else {
+            self.token_error(reference_token.clone(), error);
+            None
+        }
+    }
+
+    pub fn require_with_reference_range(
+        &mut self,
+        symbol: Symbol,
+        error: impl MaybeLazyString,
+        start_token: &TokenReference,
+        end_token: &TokenReference,
+    ) -> Option<TokenReference> {
+        let token = self.current().ok()?;
+        if token.is_symbol(symbol) {
+            Some(self.consume().unwrap())
+        } else {
+            self.token_error_ranged(token.clone(), error.to_str(), start_token, end_token);
+            None
+        }
+    }
+
+    pub fn require_with_reference_range_callback(
+        &mut self,
+        symbol: Symbol,
+        error: impl MaybeLazyString,
+        tokens: impl FnOnce() -> (TokenReference, TokenReference),
+    ) -> Option<TokenReference> {
+        let token = self.current().ok()?;
+        if token.is_symbol(symbol) {
+            Some(self.consume().unwrap())
+        } else {
+            let (start_token, end_token) = tokens();
+            self.token_error_ranged(token.clone(), error.to_str(), &start_token, &end_token);
+            None
+        }
+    }
+
+    pub fn token_error(&mut self, token_reference: TokenReference, error: impl Into<Cow<'static, str>>) {
+        self.errors.push(crate::Error::AstError(crate::ast::AstError {
+            token: token_reference.token,
+            additional: error.into(),
+            range: None,
+        }));
+    }
+
+    // This takes start_token and end_token as owned references because otherwise, we tend to stack an immutable over mutable borrow.
+    pub fn token_error_ranged(
+        &mut self,
+        token_reference: TokenReference,
+        error: impl Into<Cow<'static, str>>,
+        start_token: &TokenReference,
+        end_token: &TokenReference,
+    ) {
+        self.errors.push(crate::Error::AstError(crate::ast::AstError {
+            token: token_reference.token,
+            additional: error.into(),
+            range: Some((start_token.start_position(), end_token.end_position())),
+        }));
+    }
+}
diff --git a/src/Rust/vvs_parser/src/ast/parsers/structs/option_table_result.rs b/src/Rust/vvs_parser/src/ast/parsers/structs/option_table_result.rs
new file mode 100644
index 00000000..8c8a260e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/parsers/structs/option_table_result.rs
@@ -0,0 +1,56 @@
+use crate::{
+    ast::{
+        parsers::{parse_option_table, ParserState},
+        OptionTable,
+    },
+    tokenizer::Lexer,
+};
+
+/// A produced [`OptionTable`](crate::ast::OptionTable), along with any errors found during
+/// parsing. This option table may not be exactly the same as the input code, as reconstruction may
+/// have occurred. For more information.
+pub struct OptionTableResult {
+    option_table: OptionTable,
+    errors: Vec<crate::Error>,
+}
+
+impl OptionTableResult {
+    /// Returns a reference to the [OptionTable] that was parsed. If there were any errors, this
+    /// will not be exactly the same, as reconstruction will have occurred.
+    pub fn option_table(&self) -> &OptionTable {
+        &self.option_table
+    }
+
+    /// Consumes the [OptionTable] that was parsed. If there were any errors, this will not be
+    /// exactly the same, as reconstruction will have occurred.
+    pub fn into_option_table(self) -> OptionTable {
+        self.option_table
+    }
+
+    /// Returns all errors that occurred during parsing.
+    pub fn errors(&self) -> &[crate::Error] {
+        &self.errors
+    }
+
+    pub(crate) fn parse_fallible(code: &str) -> Self {
+        let lexer = Lexer::new(code);
+        let mut parser_state = ParserState::new(lexer);
+        let option_table = parse_option_table(&mut parser_state).unwrap_or_defaut();
+        Self { option_table, errors: parser_state.errors }
+    }
+
+    /// Consumes this OptionTableResult, returning the [OptionTable] that was parsed.
+    pub fn into_result(self) -> Result<OptionTable, Vec<crate::Error>> {
+        self.into()
+    }
+}
+
+impl From<OptionTableResult> for Result<OptionTable, Vec<crate::Error>> {
+    fn from(result: OptionTableResult) -> Self {
+        if result.errors.is_empty() {
+            Ok(result.option_table)
+        } else {
+            Err(result.errors)
+        }
+    }
+}
diff --git a/src/Rust/vvs_parser/src/ast/parsers/structs/result.rs b/src/Rust/vvs_parser/src/ast/parsers/structs/result.rs
new file mode 100644
index 00000000..8231bb82
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/parsers/structs/result.rs
@@ -0,0 +1,57 @@
+#[derive(Debug)]
+pub enum ParserResult<T> {
+    // This doesn't necessarily mean that there were no errors,
+    // because this can sometimes be a recovered value.
+    Value(T),
+
+    // Couldn't get any sort of value, but the lexer has moved.
+    // This should always come with an error.
+    LexerMoved,
+
+    NotFound,
+}
+
+impl<T> ParserResult<T> {
+    pub fn ok(self) -> Option<T> {
+        match self {
+            ParserResult::Value(value) => Some(value),
+            ParserResult::LexerMoved | ParserResult::NotFound => None,
+        }
+    }
+
+    pub fn ok_or<E>(self, error: E) -> Result<T, E> {
+        self.ok().ok_or(error)
+    }
+
+    pub fn expect(self, msg: &str) -> T {
+        self.ok().expect(msg)
+    }
+
+    pub fn unwrap(self) -> T {
+        match self {
+            ParserResult::Value(value) => value,
+            ParserResult::LexerMoved => panic!("unwrap() called when value was LexerMoved"),
+            ParserResult::NotFound => panic!("unwrap() called when value was NotFound"),
+        }
+    }
+
+    pub fn unwrap_or(self, default: T) -> T {
+        match self {
+            ParserResult::Value(value) => value,
+            _ => default,
+        }
+    }
+
+    pub fn unwrap_or_else(self, cb: impl FnOnce() -> T) -> T {
+        match self {
+            ParserResult::Value(value) => value,
+            _ => cb(),
+        }
+    }
+}
+
+impl<T: Default> ParserResult<T> {
+    pub fn unwrap_or_defaut(self) -> T {
+        self.unwrap_or_else(Default::default)
+    }
+}
diff --git a/src/Rust/vvs_parser/src/ast/parsers/util.rs b/src/Rust/vvs_parser/src/ast/parsers/util.rs
new file mode 100644
index 00000000..1daef713
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/parsers/util.rs
@@ -0,0 +1,16 @@
+// Consumes a ParserResult into an Option<T>.
+// If the ParserResult is LexerMoved, this signifies an unrecoverable error, and
+// the function exits early.
+// I wish we had Try traits.
+#[doc(hidden)]
+#[macro_export]
+macro_rules! try_parser {
+    ($result:expr) => {{
+        use $crate::ast::parsers::ParserResult;
+        match $result {
+            ParserResult::Value(value) => Some(value),
+            ParserResult::NotFound => None,
+            ParserResult::LexerMoved => return ParserResult::LexerMoved,
+        }
+    }};
+}
diff --git a/src/Rust/vvs_parser/src/ast/punctuated.rs b/src/Rust/vvs_parser/src/ast/punctuated.rs
new file mode 100644
index 00000000..cb070f68
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/punctuated.rs
@@ -0,0 +1,487 @@
+//! A punctuated sequence of syntax tree nodes separated by punctuation (tokens).
+//!
+//! Examples of punctuated sequences include:
+//! - Arguments in a function call are `Punctuated<Expression>`
+//! - Names and definitions in a local assignment are `Punctuated<TokenReference>` and `Punctuated<Expression>` respectively
+//! - The values of a return statement are `Punctuated<Expression>`
+//!
+//! Everything with punctuation uses the [`Punctuated<T>`](Punctuated) type with the following logic.
+
+use crate::{
+    node::{Node, TokenItem, Tokens},
+    private::Sealed,
+    tokenizer::{Position, TokenReference},
+    util,
+    visitors::{Visit, VisitMut, Visitor, VisitorMut},
+};
+use derive_more::Display;
+use serde::{Deserialize, Serialize};
+use std::iter::FromIterator;
+
+/// A punctuated sequence of node `T` separated by
+/// [`TokenReference`](crate::tokenizer::TokenReference).
+/// Refer to the [module documentation](index.html) for more details.
+#[derive(Clone, Debug, Display, PartialEq, Eq, Deserialize, Serialize)]
+#[display(bound(T: Display))]
+#[display("{}", util::join_vec(pairs))]
+pub struct Punctuated<T> {
+    pairs: Vec<Pair<T>>,
+}
+
+impl<T> Punctuated<T> {
+    /// Creates an empty punctuated sequence
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated: Punctuated<i32> = Punctuated::new();
+    /// ```
+    pub const fn new() -> Self {
+        Self { pairs: Vec::new() }
+    }
+
+    /// Constructs a new, empty [Punctuated<T>] with at least the specified capacity.
+    ///
+    /// The vector will be able to hold at least `capacity` elements without
+    /// reallocating. This method is allowed to allocate for more elements than
+    /// `capacity`. If `capacity` is 0, the vector will not allocate.
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::<bool>::with_capacity(10);
+    /// assert!(punctuated.is_empty());
+    /// ```
+    pub fn with_capacity(capacity: usize) -> Self {
+        Self { pairs: Vec::with_capacity(capacity) }
+    }
+
+    /// Returns whether there's any nodes in the punctuated sequence
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// assert!(punctuated.is_empty());
+    /// punctuated.push(Pair::new((), None));
+    /// assert!(!punctuated.is_empty());
+    /// ```
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
+    /// Returns the number of pairs in the punctuated sequence
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// assert_eq!(punctuated.len(), 0);
+    /// punctuated.push(Pair::new((), None));
+    /// assert_eq!(punctuated.len(), 1);
+    /// ```
+    pub fn len(&self) -> usize {
+        self.pairs.len()
+    }
+
+    /// Returns an iterator over references of the sequence values, ignoring punctuation
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// punctuated.push(Pair::new(1, None));
+    /// let mut iterator = punctuated.iter();
+    /// assert_eq!(iterator.next(), Some(&1));
+    /// assert_eq!(iterator.next(), None);
+    /// ```
+    pub fn iter(&self) -> Iter<'_, T> {
+        self.into_iter()
+    }
+
+    /// Returns an iterator over mutable references of the sequence values, ignoring punctuation
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// punctuated.push(Pair::new(1, None));
+    /// for item in punctuated.iter_mut() {
+    ///     *item += 1;
+    /// }
+    /// assert_eq!(punctuated.pop(), Some(Pair::new(2, None)));
+    /// ```
+    pub fn iter_mut(&mut self) -> IterMut<'_, T> {
+        self.into_iter()
+    }
+
+    /// Returns an iterator over pairs
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// punctuated.push(Pair::new(1, None));
+    /// let mut iterator = punctuated.into_pairs();
+    /// assert_eq!(iterator.next(), Some(Pair::new(1, None)));
+    /// assert_eq!(iterator.next(), None);
+    /// ```
+    pub fn into_pairs(self) -> impl Iterator<Item = Pair<T>> {
+        self.pairs.into_iter()
+    }
+
+    /// Returns the first pair in the sequence
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// assert_eq!(punctuated.first(), None);
+    /// punctuated.push(Pair::new(1, None));
+    /// assert_eq!(punctuated.first(), Some(&Pair::new(1, None)));
+    /// ```
+    pub fn first(&self) -> Option<&Pair<T>> {
+        self.pairs.first()
+    }
+
+    /// Returns the last pair in the sequence
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// punctuated.push(Pair::new(1, None));
+    /// assert_eq!(punctuated.last(), Some(&Pair::new(1, None)));
+    /// ```
+    pub fn last(&self) -> Option<&Pair<T>> {
+        self.pairs.last()
+    }
+
+    /// Returns an iterator over pairs as references
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// punctuated.push(Pair::new(1, None));
+    /// let mut iterator = punctuated.pairs();
+    /// assert_eq!(iterator.next(), Some(&Pair::new(1, None)));
+    /// assert_eq!(iterator.next(), None);
+    /// ```
+    pub fn pairs(&self) -> impl Iterator<Item = &Pair<T>> {
+        self.pairs.iter()
+    }
+
+    /// Returns an iterator over pairs as mutable references
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// punctuated.push(Pair::new(1, None));
+    /// for item in punctuated.pairs_mut() {
+    ///     *item.value_mut() += 1;
+    /// }
+    /// assert_eq!(punctuated.pop(), Some(Pair::new(2, None)));
+    /// ```
+    pub fn pairs_mut(&mut self) -> impl Iterator<Item = &mut Pair<T>> {
+        self.pairs.iter_mut()
+    }
+
+    /// Pops off the last pair if it isn't empty
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// punctuated.push(Pair::new(1, None));
+    /// assert_eq!(punctuated.pop(), Some(Pair::new(1, None)));
+    /// ```
+    pub fn pop(&mut self) -> Option<Pair<T>> {
+        self.pairs.pop()
+    }
+
+    /// Pushes a new pair onto the sequence
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut punctuated = Punctuated::new();
+    /// punctuated.push(Pair::new(1, None));
+    /// assert_eq!(punctuated.pop(), Some(Pair::new(1, None)));
+    /// ```
+    pub fn push(&mut self, pair: Pair<T>) {
+        self.pairs.push(pair);
+    }
+
+    /// Pushes a new node `T` onto the sequence, with the given punctuation.
+    /// Will apply the punctuation to the last item, which must exist.
+    pub fn push_punctuated(&mut self, value: T, punctuation: TokenReference) {
+        let last_pair = self
+            .pairs
+            .pop()
+            .expect("push_punctuated adds the punctuation onto the last element, but there are no elements");
+
+        if last_pair.punctuation().is_some() {
+            self.pairs.push(last_pair);
+            panic!("push_punctuated adds the punctuation onto the last element, but the last element already has punctuation");
+        }
+
+        self.pairs.push(Pair::Punctuated(last_pair.into_value(), punctuation));
+        self.pairs.push(Pair::new(value, None));
+    }
+}
+
+impl<T> Default for Punctuated<T> {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+impl<T> Sealed for Punctuated<T> {}
+
+impl<T: Node> Node for Punctuated<T> {
+    fn start_position(&self) -> Option<Position> {
+        self.pairs.first()?.start_position()
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        self.pairs.last()?.end_position()
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        self.into_iter()
+            .collect::<Vec<_>>()
+            .similar(&other.into_iter().collect::<Vec<_>>())
+    }
+
+    fn tokens(&self) -> Tokens {
+        self.pairs.tokens()
+    }
+}
+
+impl<T: Visit> Visit for Punctuated<T> {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        self.pairs.visit(visitor);
+    }
+}
+
+impl<T: VisitMut> VisitMut for Punctuated<T> {
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self {
+        Punctuated { pairs: self.pairs.visit_mut(visitor) }
+    }
+}
+
+impl<T> std::iter::Extend<Pair<T>> for Punctuated<T> {
+    fn extend<I: IntoIterator<Item = Pair<T>>>(&mut self, iter: I) {
+        self.pairs.extend(iter);
+    }
+}
+
+impl<T> IntoIterator for Punctuated<T> {
+    type Item = T;
+    type IntoIter = IntoIter<T>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        IntoIter { inner: self.pairs.into_iter() }
+    }
+}
+
+impl<T> FromIterator<Pair<T>> for Punctuated<T> {
+    fn from_iter<I: IntoIterator<Item = Pair<T>>>(iter: I) -> Self {
+        Punctuated { pairs: iter.into_iter().collect() }
+    }
+}
+
+impl<'a, T> IntoIterator for &'a Punctuated<T> {
+    type Item = &'a T;
+    type IntoIter = Iter<'a, T>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        Iter { inner: self.pairs.iter() }
+    }
+}
+
+impl<'a, T> IntoIterator for &'a mut Punctuated<T> {
+    type Item = &'a mut T;
+    type IntoIter = IterMut<'a, T>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        IterMut { inner: self.pairs.iter_mut() }
+    }
+}
+
+/// An iterator over owned values of type `T`.
+/// Refer to the [module documentation](index.html) for more details.
+pub struct IntoIter<T> {
+    inner: std::vec::IntoIter<Pair<T>>,
+}
+
+impl<T> Iterator for IntoIter<T> {
+    type Item = T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        Some(self.inner.next()?.into_value())
+    }
+}
+
+/// An iterator over borrowed values of type `&T`.
+/// Refer to the [module documentation](index.html) for more details.
+pub struct Iter<'a, T> {
+    inner: std::slice::Iter<'a, Pair<T>>,
+}
+
+impl<'a, T> Iterator for Iter<'a, T> {
+    type Item = &'a T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        Some(self.inner.next()?.value())
+    }
+}
+
+/// An iterator over borrowed values of type `&mut T`.
+/// Refer to the [module documentation](index.html) for more details.
+pub struct IterMut<'a, T> {
+    inner: std::slice::IterMut<'a, Pair<T>>,
+}
+
+impl<'a, T> Iterator for IterMut<'a, T> {
+    type Item = &'a mut T;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        Some(self.inner.next()?.value_mut())
+    }
+}
+
+/// A node `T` followed by the possible trailing
+/// [`TokenReference`](crate::tokenizer::TokenReference).
+/// Refer to the [module documentation](index.html) for more details.
+#[derive(Clone, Debug, Display, PartialEq, Eq, Deserialize, Serialize)]
+#[display(bound(T: Display))]
+pub enum Pair<T> {
+    /// A node `T` with no trailing punctuation
+    #[display("{_0}")]
+    End(T),
+
+    /// A node `T` followed by punctuation (in the form of a
+    /// [`TokenReference`](crate::tokenizer::TokenReference))
+    #[display("{_0}{_1}")]
+    Punctuated(T, TokenReference),
+}
+
+impl<T> Pair<T> {
+    /// Creates a `Pair` with node `T` and optional punctuation
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let pair = Pair::new(1, None);
+    /// ```
+    pub fn new(value: T, punctuation: Option<TokenReference>) -> Self {
+        match punctuation {
+            None => Pair::End(value),
+            Some(punctuation) => Pair::Punctuated(value, punctuation),
+        }
+    }
+
+    /// Takes the `Pair` and returns the node `T` and the punctuation, if it exists as a tuple
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let pair = Pair::new(1, None);
+    /// assert_eq!(pair.into_tuple(), (1, None));
+    /// ```
+    pub fn into_tuple(self) -> (T, Option<TokenReference>) {
+        match self {
+            Pair::End(value) => (value, None),
+            Pair::Punctuated(value, punctuation) => (value, Some(punctuation)),
+        }
+    }
+
+    /// Takes the `Pair` and returns the node `T`
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let pair = Pair::new(1, None);
+    /// assert_eq!(pair.into_value(), 1);
+    /// ```
+    pub fn into_value(self) -> T {
+        self.into_tuple().0
+    }
+
+    /// Returns a reference to the node `T`
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let pair = Pair::new(1, None);
+    /// assert_eq!(pair.value(), &1);
+    /// ```
+    pub fn value(&self) -> &T {
+        match self {
+            Pair::End(value) => value,
+            Pair::Punctuated(value, _) => value,
+        }
+    }
+
+    /// Returns a mutable reference to the node `T`
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let mut pair = Pair::new(1, None);
+    /// *pair.value_mut() += 1;
+    /// assert_eq!(pair.into_value(), 2);
+    /// ```
+    pub fn value_mut(&mut self) -> &mut T {
+        match self {
+            Pair::End(value) => value,
+            Pair::Punctuated(value, _) => value,
+        }
+    }
+
+    /// Returns the trailing punctuation, if it exists
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let pair = Pair::new(1, None);
+    /// assert_eq!(pair.punctuation(), None);
+    /// ```
+    pub fn punctuation(&self) -> Option<&TokenReference> {
+        match self {
+            Pair::End(_) => None,
+            Pair::Punctuated(_, punctuation) => Some(punctuation),
+        }
+    }
+
+    /// Maps a `Pair<T>` to a `Pair<U>` by applying a function to the value of the pair,
+    /// while preserving punctuation if it is not the end.
+    /// ```rust
+    /// # use vvs_parser::prelude::ast::*;
+    /// let pair = Pair::new(2, None);
+    /// assert_eq!(*pair.map(|i| i * 2).value(), 4);
+    /// ```
+    pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> Pair<U> {
+        match self {
+            Pair::End(value) => Pair::End(f(value)),
+            Pair::Punctuated(value, punctuated) => Pair::Punctuated(f(value), punctuated),
+        }
+    }
+}
+
+impl<T> Sealed for Pair<T> {}
+
+impl<T: Node> Node for Pair<T> {
+    fn start_position(&self) -> Option<Position> {
+        self.value().start_position()
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        self.punctuation()
+            .and_then(Node::end_position)
+            .or_else(|| self.value().end_position())
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        self.value().similar(other.value())
+    }
+
+    fn tokens(&self) -> Tokens {
+        match self {
+            Pair::Punctuated(node, separator) => {
+                let mut items = node.tokens().items;
+                items.push(TokenItem::TokenReference(separator));
+                Tokens { items }
+            }
+            Pair::End(node) => node.tokens(),
+        }
+    }
+}
+
+impl<T: Visit> Visit for Pair<T> {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        match self {
+            Pair::End(value) => value.visit(visitor),
+            Pair::Punctuated(value, punctuation) => {
+                value.visit(visitor);
+                punctuation.visit(visitor);
+            }
+        }
+    }
+}
+
+impl<T: VisitMut> VisitMut for Pair<T> {
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self {
+        match self {
+            Pair::End(value) => Pair::End(value.visit_mut(visitor)),
+            Pair::Punctuated(value, punctuation) => {
+                Pair::Punctuated(value.visit_mut(visitor), punctuation.visit_mut(visitor))
+            }
+        }
+    }
+}
diff --git a/src/Rust/vvs_parser/src/ast/span.rs b/src/Rust/vvs_parser/src/ast/span.rs
new file mode 100644
index 00000000..1b14ca1d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/span.rs
@@ -0,0 +1,55 @@
+//! A representation of a "contained span", or a span within specific bounds.
+//!
+//! Examples of contained spans include:
+//! - Arguments in a function call use parentheses `(...)`
+//! - Indexing a table uses brackets `[...]`
+//! - Creating a table uses braces `{...}`
+//!
+//! Contained spans don't contain the inner data, just the start and end bounds.
+
+use crate::{
+    node::{Node, Tokens},
+    private::Sealed,
+    tokenizer::{Position, TokenReference},
+};
+use serde::{Deserialize, Serialize};
+use vvs_parser_derive::Visit;
+
+/// A contained span with the beginning and ending bounds.
+/// Refer to the [module documentation](index.html) for more details.
+#[derive(Clone, Debug, PartialEq, Eq, Visit, Deserialize, Serialize)]
+pub struct ContainedSpan {
+    pub(crate) tokens: (TokenReference, TokenReference),
+}
+
+impl ContainedSpan {
+    /// Creates a contained span from the start and end bounds
+    pub fn new(start: TokenReference, end: TokenReference) -> Self {
+        Self { tokens: (start, end) }
+    }
+
+    /// Returns the start and end bounds in a tuple as references
+    pub fn tokens(&self) -> (&TokenReference, &TokenReference) {
+        (&self.tokens.0, &self.tokens.1)
+    }
+}
+
+impl Node for ContainedSpan {
+    fn start_position(&self) -> Option<Position> {
+        self.tokens.0.start_position()
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        self.tokens.1.end_position()
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        self.tokens.0.similar(&other.tokens.0) && self.tokens.1.similar(&other.tokens.1)
+    }
+
+    fn tokens(&self) -> Tokens {
+        self.tokens.tokens()
+    }
+}
+
+impl Sealed for ContainedSpan {}
diff --git a/src/Rust/vvs_parser/src/ast/update_positions.rs b/src/Rust/vvs_parser/src/ast/update_positions.rs
new file mode 100644
index 00000000..6939b6f9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/update_positions.rs
@@ -0,0 +1,87 @@
+use crate::{
+    ast::Ast,
+    tokenizer::{Position, Token, TokenKind, TokenReference},
+    visitors::VisitorMut,
+};
+
+#[derive(Default)]
+struct UpdatePositionsRewriter {
+    start_position: Position,
+    next_is_new_line: bool,
+}
+
+impl UpdatePositionsRewriter {
+    fn update_token(&mut self, token: &Token) -> Token {
+        let display = token.to_string();
+        let mut end_position = self.start_position;
+        if token.token_kind() != TokenKind::Eof {
+            for character in display.chars() {
+                if self.next_is_new_line {
+                    self.next_is_new_line = false;
+                    end_position.line += 1;
+                    end_position.character = 1;
+                }
+
+                if character == '\n' {
+                    self.next_is_new_line = true;
+                } else {
+                    end_position.character += 1;
+                }
+
+                end_position.bytes += character.len_utf8();
+            }
+        }
+
+        let result =
+            Token { start_position: self.start_position, end_position, token_type: token.token_type.to_owned() };
+
+        if self.next_is_new_line {
+            self.next_is_new_line = false;
+            end_position.line += 1;
+            end_position.character = 1;
+        }
+
+        self.start_position = end_position;
+        result
+    }
+}
+
+impl VisitorMut for UpdatePositionsRewriter {
+    fn visit_token_reference(&mut self, token: TokenReference) -> TokenReference {
+        TokenReference::new(
+            token.leading_trivia().map(|token| self.update_token(token)).collect(),
+            self.update_token(token.token()),
+            token.trailing_trivia().map(|token| self.update_token(token)).collect(),
+        )
+    }
+}
+
+impl Ast {
+    /// Will update the positions of all the tokens in the tree
+    /// Necessary if you are both mutating the tree and need the positions of the tokens
+    pub fn update_positions(self) -> Self {
+        UpdatePositionsRewriter { start_position: Position { bytes: 0, character: 1, line: 1 }, ..Default::default() }
+            .visit_ast(self)
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::{node::Node, prelude::parser::parse_lua_tree};
+
+    #[test]
+    fn test_update_positions_validity() {
+        let ast = parse_lua_tree("local foo = 1\nlocal bar = 2").unwrap();
+        let old_positions: Vec<_> = ast
+            .tokens()
+            .map(|token| (token.start_position(), token.end_position()))
+            .collect();
+        let ast = ast.update_positions();
+        assert_eq!(
+            old_positions,
+            ast.tokens()
+                .map(|token| (token.start_position(), token.end_position()))
+                .collect::<Vec<_>>(),
+        );
+    }
+}
diff --git a/src/Rust/vvs_parser/src/ast/visitors.rs b/src/Rust/vvs_parser/src/ast/visitors.rs
new file mode 100644
index 00000000..b95353f3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/ast/visitors.rs
@@ -0,0 +1,526 @@
+// Implementations of Visit and VisitMut that are not able to be automatically derived yet.
+// Ideally everything would be derived.
+use super::*;
+use crate::visitors::{Visit, VisitMut, Visitor, VisitorMut};
+
+// The following have `ContainedSpan`, which when automatically derived will visit the tokens containing
+// before they visit what they're actually containing.
+// For example, if there is an AST node that represents `(foo)`...
+// Then visitors will visit this as `()foo`.
+// This is fixed for structs with `#[visit(contains = "...")], but this is not supported on enums.
+
+impl Visit for Field {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_field(self);
+        match self {
+            Field::ExpressionKey { brackets, key, equal, value } => {
+                brackets.tokens.0.visit(visitor);
+                key.visit(visitor);
+                brackets.tokens.1.visit(visitor);
+                equal.visit(visitor);
+                value.visit(visitor);
+            }
+            Field::NameKey { key, equal, value } => {
+                key.visit(visitor);
+                equal.visit(visitor);
+                value.visit(visitor);
+            }
+            Field::NoKey(self_0) => self_0.visit(visitor),
+        };
+        visitor.visit_field_end(self);
+    }
+}
+
+impl VisitMut for Field {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_field(self);
+        self = match self {
+            Field::ExpressionKey { mut brackets, mut key, equal, value } => {
+                brackets.tokens.0 = brackets.tokens.0.visit_mut(visitor);
+                key = key.visit_mut(visitor);
+                brackets.tokens.1 = brackets.tokens.1.visit_mut(visitor);
+                Field::ExpressionKey { brackets, key, equal: equal.visit_mut(visitor), value: value.visit_mut(visitor) }
+            }
+            Field::NameKey { key, equal, value } => Field::NameKey {
+                key: key.visit_mut(visitor),
+                equal: equal.visit_mut(visitor),
+                value: value.visit_mut(visitor),
+            },
+            Field::NoKey(self_0) => Field::NoKey(self_0.visit_mut(visitor)),
+        };
+        self = visitor.visit_field_end(self);
+        self
+    }
+}
+
+impl Visit for Expression {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_expression(self);
+        match self {
+            Expression::BinaryOperator { lhs, binop, rhs } => {
+                lhs.visit(visitor);
+                binop.visit(visitor);
+                rhs.visit(visitor);
+            }
+            Expression::Parentheses { contained, expression } => {
+                contained.tokens.0.visit(visitor);
+                expression.visit(visitor);
+                contained.tokens.1.visit(visitor);
+            }
+            Expression::UnaryOperator { unop, expression } => {
+                unop.visit(visitor);
+                expression.visit(visitor);
+            }
+            Expression::Function(func) => {
+                func.0.visit(visitor);
+                func.1.visit(visitor);
+            }
+            Expression::TypeAssertion { expression, type_assertion } => {
+                expression.visit(visitor);
+                type_assertion.visit(visitor);
+            }
+            Expression::Number(token) | Expression::String(token) | Expression::Symbol(token) => {
+                token.visit(visitor);
+            }
+            Expression::FunctionCall(function_call) => function_call.visit(visitor),
+            Expression::IfExpression(if_expression) => if_expression.visit(visitor),
+            Expression::TableConstructor(table_constructor) => table_constructor.visit(visitor),
+            Expression::Var(var) => var.visit(visitor),
+        };
+        visitor.visit_expression_end(self);
+    }
+}
+
+impl VisitMut for Expression {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_expression(self);
+        self = match self {
+            Expression::BinaryOperator { lhs, binop, rhs } => Expression::BinaryOperator {
+                lhs: lhs.visit_mut(visitor),
+                binop: binop.visit_mut(visitor),
+                rhs: rhs.visit_mut(visitor),
+            },
+            Expression::Parentheses { mut contained, mut expression } => {
+                contained.tokens.0 = contained.tokens.0.visit_mut(visitor);
+                expression = expression.visit_mut(visitor);
+                contained.tokens.1 = contained.tokens.1.visit_mut(visitor);
+                Expression::Parentheses { contained, expression }
+            }
+            Expression::UnaryOperator { unop, expression } => {
+                Expression::UnaryOperator { unop: unop.visit_mut(visitor), expression: expression.visit_mut(visitor) }
+            }
+            Expression::Function(func) => {
+                Expression::Function(Box::new((func.0.visit_mut(visitor), func.1.visit_mut(visitor))))
+            }
+            Expression::FunctionCall(function_call) => Expression::FunctionCall(function_call.visit_mut(visitor)),
+            Expression::IfExpression(if_expression) => Expression::IfExpression(if_expression.visit_mut(visitor)),
+            Expression::TableConstructor(table_constructor) => {
+                Expression::TableConstructor(table_constructor.visit_mut(visitor))
+            }
+            Expression::TypeAssertion { expression, type_assertion } => Expression::TypeAssertion {
+                expression: expression.visit_mut(visitor),
+                type_assertion: type_assertion.visit_mut(visitor),
+            },
+            Expression::Number(token) => Expression::Number(token.visit_mut(visitor)),
+            Expression::String(token) => Expression::String(token.visit_mut(visitor)),
+            Expression::Symbol(token) => Expression::Symbol(token.visit_mut(visitor)),
+            Expression::Var(var) => Expression::Var(var.visit_mut(visitor)),
+        };
+        self = visitor.visit_expression_end(self);
+        self
+    }
+}
+
+impl Visit for Index {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_index(self);
+        match self {
+            Index::Brackets { brackets, expression } => {
+                brackets.tokens.0.visit(visitor);
+                expression.visit(visitor);
+                brackets.tokens.1.visit(visitor);
+            }
+            Index::Dot { dot, name } => {
+                dot.visit(visitor);
+                name.visit(visitor);
+            }
+        };
+        visitor.visit_index_end(self);
+    }
+}
+
+impl VisitMut for Index {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_index(self);
+        self = match self {
+            Index::Brackets { mut brackets, mut expression } => {
+                brackets.tokens.0 = brackets.tokens.0.visit_mut(visitor);
+                expression = expression.visit_mut(visitor);
+                brackets.tokens.1 = brackets.tokens.1.visit_mut(visitor);
+                Index::Brackets { brackets, expression }
+            }
+            Index::Dot { dot, name } => Index::Dot { dot: dot.visit_mut(visitor), name: name.visit_mut(visitor) },
+        };
+        self = visitor.visit_index_end(self);
+        self
+    }
+}
+
+impl Visit for FunctionArgs {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_function_args(self);
+        match self {
+            FunctionArgs::Parentheses { parentheses, arguments } => {
+                parentheses.tokens.0.visit(visitor);
+                arguments.visit(visitor);
+                parentheses.tokens.1.visit(visitor);
+            }
+            FunctionArgs::String(self_0) => self_0.visit(visitor),
+            FunctionArgs::TableConstructor(self_0) => self_0.visit(visitor),
+        };
+        visitor.visit_function_args_end(self);
+    }
+}
+
+impl VisitMut for FunctionArgs {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_function_args(self);
+        self = match self {
+            FunctionArgs::Parentheses { mut parentheses, mut arguments } => {
+                parentheses.tokens.0 = parentheses.tokens.0.visit_mut(visitor);
+                arguments = arguments.visit_mut(visitor);
+                parentheses.tokens.1 = parentheses.tokens.1.visit_mut(visitor);
+                FunctionArgs::Parentheses { parentheses, arguments }
+            }
+            FunctionArgs::String(self_0) => FunctionArgs::String(self_0.visit_mut(visitor)),
+            FunctionArgs::TableConstructor(self_0) => FunctionArgs::TableConstructor(self_0.visit_mut(visitor)),
+        };
+        self = visitor.visit_function_args_end(self);
+        self
+    }
+}
+
+// The following contain type signatures, which are addendums to previous identities
+impl Visit for FunctionBody {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_function_body(self);
+        self.parameters_parentheses.tokens.0.visit(visitor);
+        let mut type_specifiers = self.type_specifiers();
+
+        for parameter in &self.parameters {
+            parameter.visit(visitor);
+            type_specifiers.next().visit(visitor);
+        }
+
+        self.parameters_parentheses.tokens.1.visit(visitor);
+        self.return_type.visit(visitor);
+        self.block.visit(visitor);
+        self.end_token.visit(visitor);
+        visitor.visit_function_body_end(self);
+    }
+}
+
+impl VisitMut for FunctionBody {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_function_body(self);
+        self.parameters_parentheses.tokens.0 = self.parameters_parentheses.tokens.0.visit_mut(visitor);
+        let mut type_specifiers = self.type_specifiers.into_iter();
+        let mut new_type_specifiers = Vec::new();
+        let mut new_parameters = Punctuated::new();
+
+        for parameter_pair in self.parameters.into_pairs() {
+            let parameter_tuple = parameter_pair.into_tuple();
+            let parameter = parameter_tuple.0.visit_mut(visitor);
+            let type_specifier = type_specifiers
+                .next()
+                .and_then(|type_specifier| type_specifier)
+                .map(|type_specifier| type_specifier.visit_mut(visitor));
+            new_type_specifiers.push(type_specifier);
+            let punctuation = parameter_tuple.1.visit_mut(visitor);
+            new_parameters.push(Pair::new(parameter, punctuation));
+        }
+
+        self.parameters = new_parameters;
+        self.type_specifiers = new_type_specifiers;
+        self.parameters_parentheses.tokens.1 = self.parameters_parentheses.tokens.1.visit_mut(visitor);
+        self.return_type = self.return_type.visit_mut(visitor);
+        self.block = self.block.visit_mut(visitor);
+        self.end_token = self.end_token.visit_mut(visitor);
+        self = visitor.visit_function_body_end(self);
+        self
+    }
+}
+
+impl Visit for LocalAssignment {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_local_assignment(self);
+        self.local_token.visit(visitor);
+
+        let mut attributes = self.attributes();
+        let mut type_specifiers = self.type_specifiers();
+        for name in &self.name_list {
+            name.visit(visitor);
+            attributes.next().visit(visitor);
+            type_specifiers.next().visit(visitor);
+        }
+
+        self.equal_token.visit(visitor);
+        self.expr_list.visit(visitor);
+        visitor.visit_local_assignment_end(self);
+    }
+}
+
+impl VisitMut for LocalAssignment {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_local_assignment(self);
+        self.local_token = self.local_token.visit_mut(visitor);
+
+        let mut attributes = self.attributes.into_iter();
+        let mut type_specifiers = self.type_specifiers.into_iter();
+        let mut new_attributes = Vec::new();
+        let mut new_type_specifiers = Vec::new();
+        let mut new_names = Punctuated::new();
+
+        for parameter_pair in self.name_list.into_pairs() {
+            let parameter_tuple = parameter_pair.into_tuple();
+            let parameter = parameter_tuple.0.visit_mut(visitor);
+            let attribute = attributes
+                .next()
+                .flatten()
+                .map(|attribute| attribute.visit_mut(visitor));
+            let type_specifier = type_specifiers
+                .next()
+                .flatten()
+                .map(|type_specifier| type_specifier.visit_mut(visitor));
+
+            let punctuation = parameter_tuple.1.visit_mut(visitor);
+            new_attributes.push(attribute);
+            new_type_specifiers.push(type_specifier);
+            new_names.push(Pair::new(parameter, punctuation));
+        }
+
+        self.name_list = new_names;
+        self.attributes = new_attributes;
+        self.type_specifiers = new_type_specifiers;
+        self.equal_token = self.equal_token.visit_mut(visitor);
+        self.expr_list = self.expr_list.visit_mut(visitor);
+        self = visitor.visit_local_assignment_end(self);
+        self
+    }
+}
+
+impl Visit for GenericFor {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_generic_for(self);
+        self.for_token.visit(visitor);
+
+        let mut type_specifiers = self.type_specifiers();
+        for name in &self.names {
+            name.visit(visitor);
+            type_specifiers.next().visit(visitor);
+        }
+
+        self.in_token.visit(visitor);
+        self.expr_list.visit(visitor);
+        self.do_token.visit(visitor);
+        self.block.visit(visitor);
+        self.end_token.visit(visitor);
+
+        visitor.visit_generic_for_end(self);
+    }
+}
+
+impl VisitMut for GenericFor {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_generic_for(self);
+        self.for_token = self.for_token.visit_mut(visitor);
+
+        let mut type_specifiers = self.type_specifiers.into_iter();
+        let mut new_type_specifiers = Vec::new();
+        let mut new_names = Punctuated::new();
+
+        for parameter_pair in self.names.into_pairs() {
+            let parameter_tuple = parameter_pair.into_tuple();
+            let parameter = parameter_tuple.0.visit_mut(visitor);
+            let type_specifier = type_specifiers
+                .next()
+                .and_then(|type_specifier| type_specifier)
+                .map(|type_specifier| type_specifier.visit_mut(visitor));
+
+            let punctuation = parameter_tuple.1.visit_mut(visitor);
+            new_type_specifiers.push(type_specifier);
+            new_names.push(Pair::new(parameter, punctuation));
+        }
+
+        self.names = new_names;
+        self.type_specifiers = new_type_specifiers;
+        self.in_token = self.in_token.visit_mut(visitor);
+        self.expr_list = self.expr_list.visit_mut(visitor);
+        self.do_token = self.do_token.visit_mut(visitor);
+        self.block = self.block.visit_mut(visitor);
+        self.end_token = self.end_token.visit_mut(visitor);
+
+        self = visitor.visit_generic_for_end(self);
+        self
+    }
+}
+
+impl Visit for NumericFor {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_numeric_for(self);
+        self.for_token.visit(visitor);
+        self.index_variable.visit(visitor);
+        self.type_specifier.visit(visitor);
+        self.equal_token.visit(visitor);
+        self.start.visit(visitor);
+        self.start_end_comma.visit(visitor);
+        self.end.visit(visitor);
+        self.end_step_comma.visit(visitor);
+        self.step.visit(visitor);
+        self.do_token.visit(visitor);
+        self.block.visit(visitor);
+        self.end_token.visit(visitor);
+        visitor.visit_numeric_for_end(self);
+    }
+}
+
+impl VisitMut for NumericFor {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_numeric_for(self);
+        self.for_token = self.for_token.visit_mut(visitor);
+        self.index_variable = self.index_variable.visit_mut(visitor);
+        self.type_specifier = self.type_specifier.visit_mut(visitor);
+        self.equal_token = self.equal_token.visit_mut(visitor);
+        self.start = self.start.visit_mut(visitor);
+        self.start_end_comma = self.start_end_comma.visit_mut(visitor);
+        self.end = self.end.visit_mut(visitor);
+        self.end_step_comma = self.end_step_comma.visit_mut(visitor);
+        self.step = self.step.visit_mut(visitor);
+        self.do_token = self.do_token.visit_mut(visitor);
+        self.block = self.block.visit_mut(visitor);
+        self.end_token = self.end_token.visit_mut(visitor);
+        self = visitor.visit_numeric_for_end(self);
+        self
+    }
+}
+
+impl Visit for TypeInfo {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_type_info(self);
+        match self {
+            TypeInfo::Array { braces, type_info } => {
+                braces.tokens.0.visit(visitor);
+                type_info.visit(visitor);
+                braces.tokens.1.visit(visitor);
+            }
+            TypeInfo::Basic(self_0) => self_0.visit(visitor),
+            TypeInfo::Callback { parentheses, arguments, arrow, return_type } => {
+                parentheses.tokens.0.visit(visitor);
+                arguments.visit(visitor);
+                parentheses.tokens.1.visit(visitor);
+                arrow.visit(visitor);
+                return_type.visit(visitor);
+            }
+            TypeInfo::Optional { base, question_mark } => {
+                base.visit(visitor);
+                question_mark.visit(visitor);
+            }
+            TypeInfo::Table { braces, fields } => {
+                braces.tokens.0.visit(visitor);
+                fields.visit(visitor);
+                braces.tokens.1.visit(visitor);
+            }
+            TypeInfo::Typeof { typeof_token, parentheses, inner } => {
+                typeof_token.visit(visitor);
+                parentheses.tokens.0.visit(visitor);
+                inner.visit(visitor);
+                parentheses.tokens.1.visit(visitor);
+            }
+            TypeInfo::Tuple { parentheses, types } => {
+                parentheses.tokens.0.visit(visitor);
+                types.visit(visitor);
+                parentheses.tokens.1.visit(visitor);
+            }
+        };
+        visitor.visit_type_info_end(self);
+    }
+}
+
+impl VisitMut for TypeInfo {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_type_info(self);
+        self = match self {
+            TypeInfo::Array { mut braces, mut type_info } => {
+                braces.tokens.0 = braces.tokens.0.visit_mut(visitor);
+                type_info = type_info.visit_mut(visitor);
+                braces.tokens.1 = braces.tokens.1.visit_mut(visitor);
+                TypeInfo::Array { braces, type_info }
+            }
+            TypeInfo::Basic(self_0) => TypeInfo::Basic(self_0.visit_mut(visitor)),
+            TypeInfo::Callback { mut parentheses, mut arguments, mut arrow, mut return_type } => {
+                parentheses.tokens.0 = parentheses.tokens.0.visit_mut(visitor);
+                arguments = arguments.visit_mut(visitor);
+                parentheses.tokens.1 = parentheses.tokens.1.visit_mut(visitor);
+                arrow = arrow.visit_mut(visitor);
+                return_type = return_type.visit_mut(visitor);
+                TypeInfo::Callback { parentheses, arguments, arrow, return_type }
+            }
+            TypeInfo::Optional { base, question_mark } => {
+                TypeInfo::Optional { base: base.visit_mut(visitor), question_mark: question_mark.visit_mut(visitor) }
+            }
+            TypeInfo::Table { mut braces, mut fields } => {
+                braces.tokens.0 = braces.tokens.0.visit_mut(visitor);
+                fields = fields.visit_mut(visitor);
+                braces.tokens.1 = braces.tokens.1.visit_mut(visitor);
+                TypeInfo::Table { braces, fields }
+            }
+            TypeInfo::Typeof { mut typeof_token, mut parentheses, mut inner } => {
+                typeof_token = typeof_token.visit_mut(visitor);
+                parentheses.tokens.0 = parentheses.tokens.0.visit_mut(visitor);
+                inner = inner.visit_mut(visitor);
+                parentheses.tokens.1 = parentheses.tokens.1.visit_mut(visitor);
+                TypeInfo::Typeof { typeof_token, parentheses, inner }
+            }
+            TypeInfo::Tuple { mut parentheses, mut types } => {
+                parentheses.tokens.0 = parentheses.tokens.0.visit_mut(visitor);
+                types = types.visit_mut(visitor);
+                parentheses.tokens.1 = parentheses.tokens.1.visit_mut(visitor);
+                TypeInfo::Tuple { parentheses, types }
+            }
+        };
+        self = visitor.visit_type_info_end(self);
+        self
+    }
+}
+
+impl Visit for TypeFieldKey {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_type_field_key(self);
+        match self {
+            TypeFieldKey::Name(self_0) => self_0.visit(visitor),
+            TypeFieldKey::IndexSignature { brackets, inner } => {
+                brackets.tokens.0.visit(visitor);
+                inner.visit(visitor);
+                brackets.tokens.1.visit(visitor);
+            }
+        };
+        visitor.visit_type_field_key_end(self);
+    }
+}
+
+impl VisitMut for TypeFieldKey {
+    fn visit_mut<V: VisitorMut>(mut self, visitor: &mut V) -> Self {
+        self = visitor.visit_type_field_key(self);
+        self = match self {
+            TypeFieldKey::Name(self_0) => TypeFieldKey::Name(self_0.visit_mut(visitor)),
+            TypeFieldKey::IndexSignature { mut brackets, mut inner } => {
+                brackets.tokens.0 = brackets.tokens.0.visit_mut(visitor);
+                inner = inner.visit_mut(visitor);
+                brackets.tokens.1 = brackets.tokens.1.visit_mut(visitor);
+                TypeFieldKey::IndexSignature { brackets, inner }
+            }
+        };
+        self = visitor.visit_type_field_key_end(self);
+        self
+    }
+}
diff --git a/src/Rust/vvs_parser/src/error.rs b/src/Rust/vvs_parser/src/error.rs
new file mode 100644
index 00000000..226e331f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/error.rs
@@ -0,0 +1,59 @@
+//! Special errors for the Vivy Script package, so we don't expose anything with anyhow.
+
+use crate::{
+    ast::AstError,
+    tokenizer::{Position, TokenizerError},
+};
+use derive_more::{Display, From};
+use serde::{Deserialize, Serialize};
+use std::{borrow::Cow, ops};
+
+/// An error type that consists of both [`AstError`](ast::AstError) and [`TokenizerError`](tokenizer::TokenizerError)
+/// Used by [`parse`]
+#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, From, Display)]
+pub enum Error {
+    /// Triggered if there's an issue creating an AST, but tokenizing must have succeeded
+    #[display("error occurred while creating ast: {_0}")]
+    AstError(AstError),
+
+    /// Triggered if there's an issue when tokenizing, and an AST can't be made
+    #[display("error occurred while tokenizing: {_0}")]
+    TokenizerError(TokenizerError),
+}
+
+impl Error {
+    /// Returns a human readable error message
+    pub fn error_message(&self) -> Cow<'static, str> {
+        match self {
+            Error::AstError(error) => error.error_message(),
+            Error::TokenizerError(error) => error.to_string().into(),
+        }
+    }
+
+    /// Returns the range of the error
+    pub fn range(&self) -> (Position, Position) {
+        match self {
+            Error::AstError(error) => error.range(),
+            Error::TokenizerError(error) => error.range(),
+        }
+    }
+
+    /// Returns the range of the error in bytes
+    pub fn byte_range(&self) -> ops::Range<usize> {
+        let (start, end) = match self {
+            Error::AstError(error) => error.range(),
+            Error::TokenizerError(error) => error.range(),
+        };
+        start.bytes()..end.bytes()
+    }
+
+    /// Get the error code.
+    pub fn error_code(&self) -> &'static str {
+        match self {
+            Error::AstError(_) => "ast",
+            Error::TokenizerError(_) => "tokenizer",
+        }
+    }
+}
+
+impl std::error::Error for Error {}
diff --git a/src/Rust/vvs_parser/src/lib.rs b/src/Rust/vvs_parser/src/lib.rs
new file mode 100644
index 00000000..63d28204
--- /dev/null
+++ b/src/Rust/vvs_parser/src/lib.rs
@@ -0,0 +1,57 @@
+#![warn(missing_docs)]
+#![allow(clippy::large_enum_variant)]
+
+//! # Vivy Script Parser.
+//!
+//! `vvs_parser` is a lossless parser for Vivy Script, inspired by Lua and Luau.
+
+mod ast;
+mod error;
+mod node;
+mod private;
+mod short_string;
+mod tokenizer;
+mod traits;
+mod util;
+mod visitors;
+mod vivy;
+
+#[cfg(test)]
+mod tests;
+
+use crate::{error::Error, short_string::ShortString};
+
+/// Crates depending upon [vss_parser] may import the prelude.
+pub mod prelude {
+    /// Re-export everything that is linked to the [Ast].
+    pub mod ast {
+        pub use crate::{ast::*, node::*, short_string::ShortString, tokenizer::*, visitors::*};
+    }
+
+    /// Parsers, get the raw representation of things without transforming or checking the
+    /// resulting things. May be used for debug or test only.
+    pub mod parser {
+        /// Creates an [`Ast`](ast::Ast) for VivyScript code.
+        ///
+        /// Note that the resulting code may not be entirely valid! You need to pass it into the
+        /// [CompilerPipeline] for that!
+        ///
+        /// # Errors
+        /// If the code passed cannot be tokenized, a TokenizerError will be returned.
+        /// If the code passed is not valid Lua 5.1 code, an AstError will be returned,
+        /// specifically AstError::UnexpectedToken.
+        pub fn parse_lua_tree(code: &str) -> Result<crate::ast::Ast, Vec<crate::Error>> {
+            crate::ast::AstResult::parse_fallible(code).into_result()
+        }
+
+        /// Given code, will produce an [`ast::OptionTableResult`]. This OptionTableResult always produces
+        /// some [OptionTableResult], regardless of errors. If a partial Ast is produced (i.e. if there are
+        /// any errors), a few guarantees are lost. The same remarks can be made as [parse_fallible].
+        pub fn parse_options_tree(code: &str) -> Result<crate::ast::OptionTable, Vec<crate::Error>> {
+            crate::ast::OptionTableResult::parse_fallible(code).into_result()
+        }
+    }
+
+    pub use crate::error::Error as VVSParserError;
+    pub use crate::vivy::*;
+}
diff --git a/src/Rust/vvs_parser/src/node.rs b/src/Rust/vvs_parser/src/node.rs
new file mode 100644
index 00000000..dfe90349
--- /dev/null
+++ b/src/Rust/vvs_parser/src/node.rs
@@ -0,0 +1,264 @@
+//! Contains the `Node` trait, implemented on all nodes
+
+use crate::{
+    ast::Ast,
+    private,
+    tokenizer::{Position, Token, TokenReference},
+};
+use std::fmt;
+
+/// Used to represent nodes such as tokens or function definitions
+///
+/// This trait is sealed and cannot be implemented for types outside of `full-moon`
+pub trait Node: private::Sealed {
+    /// The start position of a node. None if can't be determined
+    fn start_position(&self) -> Option<Position>;
+
+    /// The end position of a node. None if it can't be determined
+    fn end_position(&self) -> Option<Position>;
+
+    /// Whether another node of the same type is the same as this one semantically, ignoring position
+    fn similar(&self, other: &Self) -> bool
+    where
+        Self: Sized;
+
+    /// The token references that comprise a node
+    fn tokens(&self) -> Tokens;
+
+    /// The full range of a node, if it has both start and end positions
+    fn range(&self) -> Option<(Position, Position)> {
+        Some((self.start_position()?, self.end_position()?))
+    }
+
+    /// The tokens surrounding a node that are ignored and not accessible through the node's own accessors.
+    /// Use this if you want to get surrounding comments or whitespace.
+    /// Returns a tuple of the leading and trailing trivia.
+    fn surrounding_trivia(&self) -> (Vec<&Token>, Vec<&Token>) {
+        let mut tokens = self.tokens();
+        let leading = tokens.next().map(|token| token.leading_trivia().collect());
+        let trailing = tokens.next_back().map(|token| token.trailing_trivia().collect());
+        (leading.unwrap_or_default(), trailing.unwrap_or_default())
+    }
+}
+
+pub(crate) enum TokenItem<'a> {
+    MoreTokens(&'a dyn Node),
+    TokenReference(&'a TokenReference),
+}
+
+impl fmt::Debug for TokenItem<'_> {
+    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            TokenItem::MoreTokens(_) => write!(formatter, "TokenItem::MoreTokens"),
+            TokenItem::TokenReference(token) => {
+                write!(formatter, "TokenItem::TokenReference({token})")
+            }
+        }
+    }
+}
+
+/// An iterator that iterates over the tokens of a node
+/// Returned by [`Node::tokens`]
+#[derive(Default)]
+pub struct Tokens<'a> {
+    pub(crate) items: Vec<TokenItem<'a>>,
+}
+
+impl<'a> Iterator for Tokens<'a> {
+    type Item = &'a TokenReference;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        if self.items.is_empty() {
+            return None;
+        }
+
+        match self.items.remove(0) {
+            TokenItem::TokenReference(reference) => Some(reference),
+            TokenItem::MoreTokens(node) => {
+                let mut tokens = node.tokens();
+                tokens.items.append(&mut self.items);
+                self.items = tokens.items;
+                self.next()
+            }
+        }
+    }
+}
+
+impl<'a> DoubleEndedIterator for Tokens<'a> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        if self.items.is_empty() {
+            return None;
+        }
+
+        match self.items.pop()? {
+            TokenItem::TokenReference(reference) => Some(reference),
+            TokenItem::MoreTokens(node) => {
+                let mut tokens = node.tokens();
+                self.items.append(&mut tokens.items);
+                self.next_back()
+            }
+        }
+    }
+}
+
+impl Node for Ast {
+    fn start_position(&self) -> Option<Position> {
+        self.nodes().start_position()
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        self.nodes().end_position()
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        self.nodes().similar(other.nodes())
+    }
+
+    fn tokens(&self) -> Tokens {
+        self.nodes().tokens()
+    }
+}
+
+impl<T: Node> Node for Box<T> {
+    fn start_position(&self) -> Option<Position> {
+        (**self).start_position()
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        (**self).end_position()
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        (**self).similar(other)
+    }
+
+    fn tokens(&self) -> Tokens {
+        (**self).tokens()
+    }
+}
+
+impl<T: Node> Node for &T {
+    fn start_position(&self) -> Option<Position> {
+        (**self).start_position()
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        (**self).end_position()
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        (**self).similar(other)
+    }
+
+    fn tokens(&self) -> Tokens {
+        (**self).tokens()
+    }
+}
+
+impl<T: Node> Node for &mut T {
+    fn start_position(&self) -> Option<Position> {
+        (**self).start_position()
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        (**self).end_position()
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        (**self).similar(other)
+    }
+
+    fn tokens(&self) -> Tokens {
+        (**self).tokens()
+    }
+}
+
+impl Node for TokenReference {
+    fn start_position(&self) -> Option<Position> {
+        Some((**self).start_position())
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        Some((**self).end_position())
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        *self.token_type() == *other.token_type()
+    }
+
+    fn tokens(&self) -> Tokens {
+        Tokens { items: vec![TokenItem::TokenReference(self)] }
+    }
+}
+
+impl<T: Node> Node for Option<T> {
+    fn start_position(&self) -> Option<Position> {
+        self.as_ref().and_then(Node::start_position)
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        self.as_ref().and_then(Node::end_position)
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        match (self.as_ref(), other.as_ref()) {
+            (Some(x), Some(y)) => x.similar(y),
+            (None, None) => true,
+            _ => false,
+        }
+    }
+
+    fn tokens(&self) -> Tokens {
+        self.as_ref().map(|node| node.tokens()).unwrap_or_default()
+    }
+}
+
+impl<T: Node> Node for Vec<T> {
+    fn start_position(&self) -> Option<Position> {
+        self.first()?.start_position()
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        self.last()?.end_position()
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        if self.len() == other.len() {
+            self.iter().zip(other.iter()).all(|(x, y)| x.similar(y))
+        } else {
+            false
+        }
+    }
+
+    fn tokens(&self) -> Tokens {
+        Tokens { items: self.iter().flat_map(|node| node.tokens().items).collect() }
+    }
+}
+
+impl<A: Node, B: Node> Node for (A, B) {
+    fn start_position(&self) -> Option<Position> {
+        match (self.0.start_position(), self.1.start_position()) {
+            (Some(x), Some(y)) => Some(std::cmp::min(x, y)),
+            (Some(x), None) | (None, Some(x)) => Some(x),
+            (None, None) => None,
+        }
+    }
+
+    fn end_position(&self) -> Option<Position> {
+        match (self.0.end_position(), self.1.end_position()) {
+            (Some(x), Some(y)) => Some(std::cmp::max(x, y)),
+            (Some(x), None) | (None, Some(x)) => Some(x),
+            (None, None) => None,
+        }
+    }
+
+    fn similar(&self, other: &Self) -> bool {
+        self.0.similar(&other.0) && self.1.similar(&other.1)
+    }
+
+    fn tokens(&self) -> Tokens {
+        let mut items = self.0.tokens().items;
+        items.append(&mut self.1.tokens().items);
+        Tokens { items }
+    }
+}
diff --git a/src/Rust/vvs_parser/src/private.rs b/src/Rust/vvs_parser/src/private.rs
new file mode 100644
index 00000000..8483d03c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/private.rs
@@ -0,0 +1,23 @@
+use crate::{
+    ast::{Ast, AstError},
+    tokenizer::{Token, TokenReference, TokenType, TokenizerError},
+    Error,
+};
+use std::borrow::Cow;
+
+pub trait Sealed {}
+
+impl<T> Sealed for &T {}
+impl<T> Sealed for &mut T {}
+impl<T: ToOwned> Sealed for Cow<'_, T> {}
+impl Sealed for Ast {}
+impl Sealed for AstError {}
+impl Sealed for Error {}
+impl Sealed for Token {}
+impl Sealed for TokenizerError {}
+impl Sealed for TokenReference {}
+impl Sealed for TokenType {}
+impl<T> Sealed for Box<T> {}
+impl<T> Sealed for Option<T> {}
+impl<T> Sealed for Vec<T> {}
+impl<A, B> Sealed for (A, B) {}
diff --git a/src/Rust/vvs_parser/src/short_string.rs b/src/Rust/vvs_parser/src/short_string.rs
new file mode 100644
index 00000000..130edaee
--- /dev/null
+++ b/src/Rust/vvs_parser/src/short_string.rs
@@ -0,0 +1,118 @@
+//! A small string, with short string optimization.
+
+use serde::{Deserialize, Serialize};
+use smol_str::SmolStr;
+use std::{borrow::Borrow, fmt::Display, ops::Deref};
+
+/// A string as used in [crate::tokenizer::TokenType] and such. Does short string optimization.
+#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize, Hash, PartialOrd, Ord)]
+#[serde(transparent)]
+pub struct ShortString(SmolStr);
+
+impl ShortString {
+    /// Creates a new ShortString from the given text.
+    pub fn new<T: Into<String> + AsRef<str>>(text: T) -> Self
+    where
+        SmolStr: From<T>,
+    {
+        ShortString(SmolStr::from(text))
+    }
+
+    /// Constructs inline variant of [ShortString].
+    ///
+    /// Panics if `text.len() > 23`. (See [SmolStr::new_inline])
+    #[inline]
+    pub const fn new_inline(text: &str) -> Self {
+        ShortString(SmolStr::new_inline(text))
+    }
+
+    /// Constructs [ShortString]. Never allocates nor panic.
+    #[inline]
+    pub const fn new_static(text: &'static str) -> Self {
+        if text.len() <= 23 {
+            Self::new_inline(text)
+        } else {
+            ShortString(SmolStr::new_static(text))
+        }
+    }
+
+    /// Returns a `&str` representation of the ShortString.
+    pub fn as_str(&self) -> &str {
+        self.0.as_str()
+    }
+
+    /// Returns the length of the ShortString.
+    pub fn len(&self) -> usize {
+        self.0.len()
+    }
+
+    /// Returns whether or not the ShortString is empty.
+    pub fn is_empty(&self) -> bool {
+        self.0.is_empty()
+    }
+}
+
+impl Display for ShortString {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        self.0.fmt(f)
+    }
+}
+
+impl Deref for ShortString {
+    type Target = str;
+
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+
+impl Borrow<str> for ShortString {
+    fn borrow(&self) -> &str {
+        self.as_str()
+    }
+}
+
+impl AsRef<str> for ShortString {
+    fn as_ref(&self) -> &str {
+        self.as_str()
+    }
+}
+
+impl<T: Into<String> + AsRef<str>> From<T> for ShortString
+where
+    SmolStr: From<T>,
+{
+    fn from(value: T) -> Self {
+        ShortString(SmolStr::from(value))
+    }
+}
+
+impl From<&ShortString> for ShortString {
+    fn from(value: &ShortString) -> Self {
+        value.clone()
+    }
+}
+
+impl From<ShortString> for String {
+    fn from(value: ShortString) -> Self {
+        value.0.to_string()
+    }
+}
+
+impl FromIterator<char> for ShortString {
+    fn from_iter<I: IntoIterator<Item = char>>(iter: I) -> Self {
+        ShortString(SmolStr::from_iter(iter))
+    }
+}
+
+#[test]
+fn test_build_inline() {
+    assert_eq!(ShortString::new_inline("12345678901234567890123").len(), 23);
+    assert_eq!(ShortString::new_static("123456789012345678901230").len(), 24);
+}
+
+#[test]
+#[should_panic]
+fn test_oversized_inline() {
+    let _ = ShortString::new_inline("123456789012345678901230");
+}
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/ast.snap
new file mode 100644
index 00000000..2166604e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/ast.snap
@@ -0,0 +1,71 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/assignment-1
+---
+nodes:
+  stmts:
+    - - Assignment:
+          var_list:
+            pairs:
+              - End:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 0
+                        line: 1
+                        character: 1
+                      end_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      token_type:
+                        type: Identifier
+                        identifier: x
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 1
+                          line: 1
+                          character: 2
+                        end_position:
+                          bytes: 2
+                          line: 1
+                          character: 3
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia: []
+          expr_list:
+            pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 3
+      line: 1
+      character: 4
+    end_position:
+      bytes: 3
+      line: 1
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/ast_to_string.snap
new file mode 100644
index 00000000..72e2e410
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/assignment-1
+---
+x =
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/error_display.snap
new file mode 100644
index 00000000..dd052ce7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/assignment-1
+---
+error[ast]: expected values to set to
+  ┌─ source.lua:1:3
+  │
+1 │ x =
+  │   ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/errors.snap
new file mode 100644
index 00000000..8fdfabb4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/assignment-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 2
+        line: 1
+        character: 3
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: expected values to set to
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/source.lua
new file mode 100644
index 00000000..03c979a2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/source.lua
@@ -0,0 +1 @@
+x =
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/tokens.snap
new file mode 100644
index 00000000..f4fa4fa5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/assignment-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/ast.snap
new file mode 100644
index 00000000..163310d0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/ast.snap
@@ -0,0 +1,82 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/assignment-2
+---
+nodes:
+  stmts:
+    - - Assignment:
+          var_list:
+            pairs:
+              - End:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 0
+                        line: 1
+                        character: 1
+                      end_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      token_type:
+                        type: Identifier
+                        identifier: x
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 1
+                          line: 1
+                          character: 2
+                        end_position:
+                          bytes: 2
+                          line: 1
+                          character: 3
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 7
+      line: 1
+      character: 8
+    end_position:
+      bytes: 7
+      line: 1
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/ast_to_string.snap
new file mode 100644
index 00000000..3aac9908
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/assignment-2
+---
+"x = "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/error_display.snap
new file mode 100644
index 00000000..94e9ebe9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/assignment-2
+---
+error[ast]: expected values to set to
+  ┌─ source.lua:1:3
+  │
+1 │ x = end
+  │   ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:5
+  │
+1 │ x = end
+  │     ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/errors.snap
new file mode 100644
index 00000000..a2865863
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/assignment-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 2
+        line: 1
+        character: 3
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: expected values to set to
+- AstError:
+    token:
+      start_position:
+        bytes: 4
+        line: 1
+        character: 5
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/source.lua
new file mode 100644
index 00000000..07817690
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/source.lua
@@ -0,0 +1 @@
+x = end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/tokens.snap
new file mode 100644
index 00000000..cbed2bba
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-2/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/assignment-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/ast.snap
new file mode 100644
index 00000000..1a91149a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/assignment-3
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 1
+      character: 10
+    end_position:
+      bytes: 9
+      line: 1
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/ast_to_string.snap
new file mode 100644
index 00000000..8adbdbca
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/assignment-3
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/error_display.snap
new file mode 100644
index 00000000..384242f5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/assignment-3
+---
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:1
+  │
+1 │ until = 3
+  │ ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/errors.snap
new file mode 100644
index 00000000..48344c4d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/assignment-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/source.lua
new file mode 100644
index 00000000..43f04f25
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/source.lua
@@ -0,0 +1 @@
+until = 3
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/tokens.snap
new file mode 100644
index 00000000..57970b57
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/assignment-3/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/assignment-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/ast.snap
new file mode 100644
index 00000000..53a108c4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/ast.snap
@@ -0,0 +1,81 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/bin-op-1
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      end_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 10
+      line: 1
+      character: 11
+    end_position:
+      bytes: 10
+      line: 1
+      character: 11
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/ast_to_string.snap
new file mode 100644
index 00000000..5c1cf3b1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/bin-op-1
+---
+"return 1 "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/error_display.snap
new file mode 100644
index 00000000..751e6d01
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/bin-op-1
+---
+error[ast]: expected expression after binary operator
+  ┌─ source.lua:1:10
+  │
+1 │ return 1 +
+  │          ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/errors.snap
new file mode 100644
index 00000000..89abb66f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/bin-op-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: +
+    additional: expected expression after binary operator
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/source.lua
new file mode 100644
index 00000000..b6842ad8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/source.lua
@@ -0,0 +1 @@
+return 1 +
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/tokens.snap
new file mode 100644
index 00000000..33281938
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-1/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/bin-op-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/ast.snap
new file mode 100644
index 00000000..244911f1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/ast.snap
@@ -0,0 +1,81 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/bin-op-2
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      end_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 1
+      character: 17
+    end_position:
+      bytes: 16
+      line: 1
+      character: 17
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/ast_to_string.snap
new file mode 100644
index 00000000..f0d37dcb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/bin-op-2
+---
+"return 1 "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/error_display.snap
new file mode 100644
index 00000000..606bcb79
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/bin-op-2
+---
+error[ast]: expected expression after binary operator
+  ┌─ source.lua:1:10
+  │
+1 │ return 1 + until
+  │          ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:12
+  │
+1 │ return 1 + until
+  │            ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/errors.snap
new file mode 100644
index 00000000..6cdc9042
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/bin-op-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: +
+    additional: expected expression after binary operator
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/source.lua
new file mode 100644
index 00000000..f18ec0a9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/source.lua
@@ -0,0 +1 @@
+return 1 + until
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/tokens.snap
new file mode 100644
index 00000000..77070672
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/bin-op-2/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/bin-op-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/ast.snap
new file mode 100644
index 00000000..5842f226
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/ast.snap
@@ -0,0 +1,77 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/call-1
+---
+nodes:
+  stmts:
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Identifier
+                  identifier: call
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 4
+                              line: 1
+                              character: 5
+                            end_position:
+                              bytes: 5
+                              line: 1
+                              character: 6
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 0
+                              line: 1
+                              character: 1
+                            end_position:
+                              bytes: 1
+                              line: 1
+                              character: 2
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    arguments:
+                      pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 5
+      line: 1
+      character: 6
+    end_position:
+      bytes: 5
+      line: 1
+      character: 6
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/ast_to_string.snap
new file mode 100644
index 00000000..004a49c7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/call-1
+---
+call()
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/error_display.snap
new file mode 100644
index 00000000..fe2ed585
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/call-1
+---
+error[ast]: expected `)` to close function call
+  ┌─ source.lua:1:5
+  │
+1 │ call(
+  │     ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/errors.snap
new file mode 100644
index 00000000..b1efc06a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/call-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 4
+        line: 1
+        character: 5
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected `)` to close function call"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/source.lua
new file mode 100644
index 00000000..f3433589
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/source.lua
@@ -0,0 +1 @@
+call(
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/tokens.snap
new file mode 100644
index 00000000..0c665ccf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-1/tokens.snap
@@ -0,0 +1,39 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/call-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/ast.snap
new file mode 100644
index 00000000..ab8efbb4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/ast.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/call-2
+---
+nodes:
+  stmts:
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Identifier
+                  identifier: call
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 4
+                              line: 1
+                              character: 5
+                            end_position:
+                              bytes: 5
+                              line: 1
+                              character: 6
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 0
+                              line: 1
+                              character: 1
+                            end_position:
+                              bytes: 1
+                              line: 1
+                              character: 2
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    arguments:
+                      pairs:
+                        - End:
+                            String:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 5
+                                  line: 1
+                                  character: 6
+                                end_position:
+                                  bytes: 12
+                                  line: 1
+                                  character: 13
+                                token_type:
+                                  type: StringLiteral
+                                  literal: hello
+                                  quote_type: Double
+                              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 12
+      line: 1
+      character: 13
+    end_position:
+      bytes: 12
+      line: 1
+      character: 13
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/ast_to_string.snap
new file mode 100644
index 00000000..894dba2d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/call-2
+---
+"call(\"hello\")"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/error_display.snap
new file mode 100644
index 00000000..b00135ec
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/call-2
+---
+error[ast]: expected `)` to close function call
+  ┌─ source.lua:1:5
+  │
+1 │ call("hello"
+  │     ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/errors.snap
new file mode 100644
index 00000000..55506155
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/call-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 4
+        line: 1
+        character: 5
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected `)` to close function call"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/source.lua
new file mode 100644
index 00000000..5457ce11
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/source.lua
@@ -0,0 +1 @@
+call("hello"
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/tokens.snap
new file mode 100644
index 00000000..cea03670
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-2/tokens.snap
@@ -0,0 +1,51 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/call-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: StringLiteral
+    literal: hello
+    quote_type: Double
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/ast.snap
new file mode 100644
index 00000000..beadf471
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/ast.snap
@@ -0,0 +1,136 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/call-3
+---
+nodes:
+  stmts:
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Identifier
+                  identifier: call
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 4
+                              line: 1
+                              character: 5
+                            end_position:
+                              bytes: 5
+                              line: 1
+                              character: 6
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 0
+                              line: 1
+                              character: 1
+                            end_position:
+                              bytes: 1
+                              line: 1
+                              character: 2
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    arguments:
+                      pairs:
+                        - Punctuated:
+                            - String:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 5
+                                    line: 1
+                                    character: 6
+                                  end_position:
+                                    bytes: 12
+                                    line: 1
+                                    character: 13
+                                  token_type:
+                                    type: StringLiteral
+                                    literal: hello
+                                    quote_type: Double
+                                trailing_trivia: []
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 12
+                                  line: 1
+                                  character: 13
+                                end_position:
+                                  bytes: 13
+                                  line: 1
+                                  character: 14
+                                token_type:
+                                  type: Symbol
+                                  symbol: ","
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 13
+                                    line: 1
+                                    character: 14
+                                  end_position:
+                                    bytes: 14
+                                    line: 1
+                                    character: 15
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                        - End:
+                            String:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 14
+                                  line: 1
+                                  character: 15
+                                end_position:
+                                  bytes: 21
+                                  line: 1
+                                  character: 22
+                                token_type:
+                                  type: StringLiteral
+                                  literal: world
+                                  quote_type: Double
+                              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 21
+      line: 1
+      character: 22
+    end_position:
+      bytes: 21
+      line: 1
+      character: 22
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/ast_to_string.snap
new file mode 100644
index 00000000..04ae5b44
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/call-3
+---
+"call(\"hello\", \"world\")"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/error_display.snap
new file mode 100644
index 00000000..eb09a070
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/call-3
+---
+error[ast]: expected `)` to close function call
+  ┌─ source.lua:1:5
+  │
+1 │ call("hello", "world"
+  │     ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/errors.snap
new file mode 100644
index 00000000..083784b6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/call-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 4
+        line: 1
+        character: 5
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected `)` to close function call"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/source.lua
new file mode 100644
index 00000000..30bd9201
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/source.lua
@@ -0,0 +1 @@
+call("hello", "world"
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/tokens.snap
new file mode 100644
index 00000000..f04e3f04
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-3/tokens.snap
@@ -0,0 +1,85 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/call-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: StringLiteral
+    literal: hello
+    quote_type: Double
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: StringLiteral
+    literal: world
+    quote_type: Double
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/ast.snap
new file mode 100644
index 00000000..215fa487
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/ast.snap
@@ -0,0 +1,77 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/call-4
+---
+nodes:
+  stmts:
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Identifier
+                  identifier: call
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 4
+                              line: 1
+                              character: 5
+                            end_position:
+                              bytes: 5
+                              line: 1
+                              character: 6
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 0
+                              line: 1
+                              character: 1
+                            end_position:
+                              bytes: 1
+                              line: 1
+                              character: 2
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    arguments:
+                      pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 1
+      character: 10
+    end_position:
+      bytes: 9
+      line: 1
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/ast_to_string.snap
new file mode 100644
index 00000000..9571c27f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/call-4
+---
+call()
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/error_display.snap
new file mode 100644
index 00000000..8e453c8d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/call-4
+---
+error[ast]: expected `)` to close function call
+  ┌─ source.lua:1:5
+  │
+1 │ call(end)
+  │     ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:6
+  │
+1 │ call(end)
+  │      ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/errors.snap
new file mode 100644
index 00000000..904d3da4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/call-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 4
+        line: 1
+        character: 5
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected `)` to close function call"
+- AstError:
+    token:
+      start_position:
+        bytes: 5
+        line: 1
+        character: 6
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/source.lua
new file mode 100644
index 00000000..80e92aba
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/source.lua
@@ -0,0 +1 @@
+call(end)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/tokens.snap
new file mode 100644
index 00000000..638e16b1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/call-4/tokens.snap
@@ -0,0 +1,61 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/call-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/ast.snap
new file mode 100644
index 00000000..c13b270f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/ast.snap
@@ -0,0 +1,133 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/do-1
+---
+nodes:
+  stmts:
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 3
+                              line: 2
+                              character: 1
+                            end_position:
+                              bytes: 4
+                              line: 2
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 2
+                            character: 2
+                          end_position:
+                            bytes: 8
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 8
+                                        line: 2
+                                        character: 6
+                                      end_position:
+                                        bytes: 9
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 9
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 10
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+                - ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 10
+      line: 2
+      character: 8
+    end_position:
+      bytes: 10
+      line: 2
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/ast_to_string.snap
new file mode 100644
index 00000000..94e4a870
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/do-1
+---
+"do\n\tcall()end"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/error_display.snap
new file mode 100644
index 00000000..25649313
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/do-1
+---
+error[ast]: expected `end` to close do block
+  ┌─ source.lua:2:2
+  │
+2 │     call()
+  │     ^^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/errors.snap
new file mode 100644
index 00000000..289afb58
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/errors.snap
@@ -0,0 +1,26 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/do-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 10
+        line: 2
+        character: 8
+      end_position:
+        bytes: 10
+        line: 2
+        character: 8
+      token_type:
+        type: Eof
+    additional: "expected `end` to close do block"
+    range:
+      - bytes: 4
+        line: 2
+        character: 2
+      - bytes: 10
+        line: 2
+        character: 8
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/source.lua
new file mode 100644
index 00000000..d280f93e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/source.lua
@@ -0,0 +1,2 @@
+do
+	call()
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/tokens.snap
new file mode 100644
index 00000000..51f12052
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-1/tokens.snap
@@ -0,0 +1,83 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/do-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 3
+    line: 2
+    character: 1
+  end_position:
+    bytes: 4
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 4
+    line: 2
+    character: 2
+  end_position:
+    bytes: 8
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 8
+    line: 2
+    character: 6
+  end_position:
+    bytes: 9
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 9
+    line: 2
+    character: 7
+  end_position:
+    bytes: 10
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 10
+    line: 2
+    character: 8
+  end_position:
+    bytes: 10
+    line: 2
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/ast.snap
new file mode 100644
index 00000000..73409e15
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/ast.snap
@@ -0,0 +1,68 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/do-2
+---
+nodes:
+  stmts:
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 12
+      line: 1
+      character: 13
+    end_position:
+      bytes: 12
+      line: 1
+      character: 13
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/ast_to_string.snap
new file mode 100644
index 00000000..a8587734
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/do-2
+---
+do end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/error_display.snap
new file mode 100644
index 00000000..cc5ae9ca
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/do-2
+---
+error[ast]: expected `end` to close do block
+  ┌─ source.lua:1:1
+  │
+1 │ do until end
+  │ ^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:4
+  │
+1 │ do until end
+  │    ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/errors.snap
new file mode 100644
index 00000000..e8441877
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/errors.snap
@@ -0,0 +1,41 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/do-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 3
+        line: 1
+        character: 4
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "expected `end` to close do block"
+    range:
+      - bytes: 0
+        line: 1
+        character: 1
+      - bytes: 2
+        line: 1
+        character: 3
+- AstError:
+    token:
+      start_position:
+        bytes: 3
+        line: 1
+        character: 4
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/source.lua
new file mode 100644
index 00000000..de672635
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/source.lua
@@ -0,0 +1 @@
+do until end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/tokens.snap
new file mode 100644
index 00000000..19783774
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/do-2/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/do-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/ast.snap
new file mode 100644
index 00000000..de634353
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/function-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 8
+      line: 1
+      character: 9
+    end_position:
+      bytes: 8
+      line: 1
+      character: 9
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/ast_to_string.snap
new file mode 100644
index 00000000..906b407c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/function-1
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/error_display.snap
new file mode 100644
index 00000000..3d606636
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/function-1
+---
+error[ast]: expected function name
+  ┌─ source.lua:1:9
+  │
+1 │ function
+  │         ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/errors.snap
new file mode 100644
index 00000000..7f753354
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/function-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Eof
+    additional: expected function name
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/source.lua
new file mode 100644
index 00000000..b2e1f122
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/source.lua
@@ -0,0 +1 @@
+function
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/tokens.snap
new file mode 100644
index 00000000..938768d0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-1/tokens.snap
@@ -0,0 +1,28 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/function-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/ast.snap
new file mode 100644
index 00000000..cde02936
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/function-2
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 12
+      line: 1
+      character: 13
+    end_position:
+      bytes: 12
+      line: 1
+      character: 13
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/ast_to_string.snap
new file mode 100644
index 00000000..8812d23d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/function-2
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/error_display.snap
new file mode 100644
index 00000000..827de55e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/function-2
+---
+error[ast]: expected function name
+  ┌─ source.lua:1:10
+  │
+1 │ function end
+  │          ^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:10
+  │
+1 │ function end
+  │          ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/errors.snap
new file mode 100644
index 00000000..28aa6419
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/function-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: expected function name
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/source.lua
new file mode 100644
index 00000000..5e3e2e83
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/source.lua
@@ -0,0 +1 @@
+function end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/tokens.snap
new file mode 100644
index 00000000..8ab216d8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-2/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/function-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/ast.snap
new file mode 100644
index 00000000..7f93d136
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/function-3
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 14
+      line: 1
+      character: 15
+    end_position:
+      bytes: 14
+      line: 1
+      character: 15
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/ast_to_string.snap
new file mode 100644
index 00000000..851f72c6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/function-3
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/error_display.snap
new file mode 100644
index 00000000..226d16c4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/error_display.snap
@@ -0,0 +1,25 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/function-3
+---
+error[ast]: expected function name
+  ┌─ source.lua:1:9
+  │
+1 │ function() end
+  │         ^
+
+error[ast]: expected an expression after `(`
+  ┌─ source.lua:1:9
+  │
+1 │ function() end
+  │         ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:10
+  │
+1 │ function() end
+  │          ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/errors.snap
new file mode 100644
index 00000000..b7209132
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/errors.snap
@@ -0,0 +1,48 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/function-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: expected function name
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected an expression after `(`"
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: )
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/source.lua
new file mode 100644
index 00000000..793ec7ed
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/source.lua
@@ -0,0 +1 @@
+function() end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/tokens.snap
new file mode 100644
index 00000000..d1155e11
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-3/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/function-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/ast.snap
new file mode 100644
index 00000000..3d453548
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/ast.snap
@@ -0,0 +1,120 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/function-4
+---
+nodes:
+  stmts:
+    - - FunctionDeclaration:
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 8
+                line: 1
+                character: 9
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            names:
+              pairs:
+                - End:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      end_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      token_type:
+                        type: Identifier
+                        identifier: x
+                    trailing_trivia: []
+            colon_name: ~
+          body:
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 0
+                      line: 1
+                      character: 1
+                    end_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia: []
+            parameters:
+              pairs: []
+            block:
+              stmts: []
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 11
+      line: 1
+      character: 12
+    end_position:
+      bytes: 11
+      line: 1
+      character: 12
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/ast_to_string.snap
new file mode 100644
index 00000000..43856080
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/function-4
+---
+function x()end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/error_display.snap
new file mode 100644
index 00000000..2eba71d8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/function-4
+---
+error[ast]: expected a parameter name or `)`
+  ┌─ source.lua:1:12
+  │
+1 │ function x(
+  │            ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/errors.snap
new file mode 100644
index 00000000..a7b350d2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/function-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 11
+        line: 1
+        character: 12
+      token_type:
+        type: Eof
+    additional: "expected a parameter name or `)`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/source.lua
new file mode 100644
index 00000000..447d4a17
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/source.lua
@@ -0,0 +1 @@
+function x(
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/tokens.snap
new file mode 100644
index 00000000..7ae41340
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-4/tokens.snap
@@ -0,0 +1,61 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/function-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/ast.snap
new file mode 100644
index 00000000..87d5c55d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/function-5
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 20
+      line: 1
+      character: 21
+    end_position:
+      bytes: 20
+      line: 1
+      character: 21
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/ast_to_string.snap
new file mode 100644
index 00000000..91e673b7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/function-5
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/error_display.snap
new file mode 100644
index 00000000..cec5bb6b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/error_display.snap
@@ -0,0 +1,31 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/function-5
+---
+error[ast]: expected function name
+  ┌─ source.lua:1:10
+  │
+1 │ function local() end
+  │          ^^^^^
+
+error[ast]: expected either a variable name or `function`
+  ┌─ source.lua:1:15
+  │
+1 │ function local() end
+  │               ^
+
+error[ast]: expected an expression after `(`
+  ┌─ source.lua:1:15
+  │
+1 │ function local() end
+  │               ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:16
+  │
+1 │ function local() end
+  │                ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/errors.snap
new file mode 100644
index 00000000..34442324
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/errors.snap
@@ -0,0 +1,62 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/function-5
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 14
+        line: 1
+        character: 15
+      token_type:
+        type: Symbol
+        symbol: local
+    additional: expected function name
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 1
+        character: 15
+      end_position:
+        bytes: 15
+        line: 1
+        character: 16
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected either a variable name or `function`"
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 1
+        character: 15
+      end_position:
+        bytes: 15
+        line: 1
+        character: 16
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected an expression after `(`"
+- AstError:
+    token:
+      start_position:
+        bytes: 15
+        line: 1
+        character: 16
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: Symbol
+        symbol: )
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/source.lua
new file mode 100644
index 00000000..c6fc7862
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/source.lua
@@ -0,0 +1 @@
+function local() end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/tokens.snap
new file mode 100644
index 00000000..1d146429
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-5/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/function-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/ast.snap
new file mode 100644
index 00000000..bc169761
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/ast.snap
@@ -0,0 +1,120 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/function-6
+---
+nodes:
+  stmts:
+    - - FunctionDeclaration:
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 8
+                line: 1
+                character: 9
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            names:
+              pairs:
+                - End:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      end_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      token_type:
+                        type: Identifier
+                        identifier: x
+                    trailing_trivia: []
+            colon_name: ~
+          body:
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    end_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia: []
+            parameters:
+              pairs: []
+            block:
+              stmts: []
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 12
+      line: 1
+      character: 13
+    end_position:
+      bytes: 12
+      line: 1
+      character: 13
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/ast_to_string.snap
new file mode 100644
index 00000000..e7cd0ba7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/function-6
+---
+function x()end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/error_display.snap
new file mode 100644
index 00000000..2153c867
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/function-6
+---
+error[ast]: expected `end` to close function body block
+  ┌─ source.lua:1:12
+  │
+1 │ function x()
+  │            ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/errors.snap
new file mode 100644
index 00000000..b9ee670c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/errors.snap
@@ -0,0 +1,26 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/function-6
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 12
+        line: 1
+        character: 13
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Eof
+    additional: "expected `end` to close function body block"
+    range:
+      - bytes: 11
+        line: 1
+        character: 12
+      - bytes: 12
+        line: 1
+        character: 13
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/source.lua
new file mode 100644
index 00000000..dc4f6505
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/source.lua
@@ -0,0 +1 @@
+function x()
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/tokens.snap
new file mode 100644
index 00000000..81f1cb73
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-6/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/function-6
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/ast.snap
new file mode 100644
index 00000000..fc5e2f60
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/ast.snap
@@ -0,0 +1,136 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/function-7
+---
+nodes:
+  stmts:
+    - - FunctionDeclaration:
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 8
+                line: 1
+                character: 9
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            names:
+              pairs:
+                - End:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      end_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      token_type:
+                        type: Identifier
+                        identifier: x
+                    trailing_trivia: []
+            colon_name: ~
+          body:
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 0
+                      line: 1
+                      character: 1
+                    end_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia: []
+            parameters:
+              pairs:
+                - End:
+                    Ellipse:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        end_position:
+                          bytes: 14
+                          line: 1
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: "..."
+                      trailing_trivia: []
+            block:
+              stmts: []
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 22
+      line: 2
+      character: 4
+    end_position:
+      bytes: 22
+      line: 2
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/ast_to_string.snap
new file mode 100644
index 00000000..245a4a88
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/function-7
+---
+function x(...)end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/error_display.snap
new file mode 100644
index 00000000..67de43c3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/error_display.snap
@@ -0,0 +1,31 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/function-7
+---
+error[ast]: expected a `)`
+  ┌─ source.lua:1:15
+  │
+1 │ function x(..., a)
+  │               ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:15
+  │
+1 │ function x(..., a)
+  │               ^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:18
+  │
+1 │ function x(..., a)
+  │                  ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:18
+  │
+1 │ function x(..., a)
+  │                  ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/errors.snap
new file mode 100644
index 00000000..55df5d9f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/errors.snap
@@ -0,0 +1,62 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/function-7
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 1
+        character: 15
+      end_position:
+        bytes: 15
+        line: 1
+        character: 16
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: "expected a `)`"
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 1
+        character: 15
+      end_position:
+        bytes: 15
+        line: 1
+        character: 16
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 18
+        line: 1
+        character: 19
+      token_type:
+        type: Symbol
+        symbol: )
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 18
+        line: 1
+        character: 19
+      token_type:
+        type: Symbol
+        symbol: )
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/source.lua
new file mode 100644
index 00000000..f6289473
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/source.lua
@@ -0,0 +1,2 @@
+function x(..., a)
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/tokens.snap
new file mode 100644
index 00000000..463022fc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-7/tokens.snap
@@ -0,0 +1,138 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/function-7
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "..."
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 2
+    character: 1
+  end_position:
+    bytes: 22
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 22
+    line: 2
+    character: 4
+  end_position:
+    bytes: 22
+    line: 2
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/ast.snap
new file mode 100644
index 00000000..afa57b90
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/function-8
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 21
+      line: 1
+      character: 22
+    end_position:
+      bytes: 21
+      line: 1
+      character: 22
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/ast_to_string.snap
new file mode 100644
index 00000000..c19595d0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/function-8
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/error_display.snap
new file mode 100644
index 00000000..bc83b3fe
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/error_display.snap
@@ -0,0 +1,31 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/function-8
+---
+error[ast]: expected name after `:`
+  ┌─ source.lua:1:15
+  │
+1 │ function name:3() end
+  │               ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:15
+  │
+1 │ function name:3() end
+  │               ^
+
+error[ast]: expected an expression after `(`
+  ┌─ source.lua:1:16
+  │
+1 │ function name:3() end
+  │                ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:17
+  │
+1 │ function name:3() end
+  │                 ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/errors.snap
new file mode 100644
index 00000000..11c643fe
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/errors.snap
@@ -0,0 +1,62 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/function-8
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 1
+        character: 15
+      end_position:
+        bytes: 15
+        line: 1
+        character: 16
+      token_type:
+        type: Number
+        text: "3"
+    additional: "expected name after `:`"
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 1
+        character: 15
+      end_position:
+        bytes: 15
+        line: 1
+        character: 16
+      token_type:
+        type: Number
+        text: "3"
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 15
+        line: 1
+        character: 16
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected an expression after `(`"
+- AstError:
+    token:
+      start_position:
+        bytes: 16
+        line: 1
+        character: 17
+      end_position:
+        bytes: 17
+        line: 1
+        character: 18
+      token_type:
+        type: Symbol
+        symbol: )
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/source.lua
new file mode 100644
index 00000000..7f185b65
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/source.lua
@@ -0,0 +1 @@
+function name:3() end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/tokens.snap
new file mode 100644
index 00000000..c9ff1ce7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/function-8/tokens.snap
@@ -0,0 +1,116 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/function-8
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/ast.snap
new file mode 100644
index 00000000..a53668a6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/generic-for-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 8
+      line: 1
+      character: 9
+    end_position:
+      bytes: 8
+      line: 1
+      character: 9
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/ast_to_string.snap
new file mode 100644
index 00000000..1c545d69
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/generic-for-1
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/error_display.snap
new file mode 100644
index 00000000..27048f70
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/generic-for-1
+---
+error[ast]: expected expressions after `in`
+  ┌─ source.lua:1:7
+  │
+1 │ for x in
+  │       ^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/errors.snap
new file mode 100644
index 00000000..99949dca
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/generic-for-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: in
+    additional: "expected expressions after `in`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/source.lua
new file mode 100644
index 00000000..f433096f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/source.lua
@@ -0,0 +1 @@
+for x in
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/tokens.snap
new file mode 100644
index 00000000..9952424c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-1/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/generic-for-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: in
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/ast.snap
new file mode 100644
index 00000000..578e0015
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/ast.snap
@@ -0,0 +1,210 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/generic-for-2
+---
+nodes:
+  stmts:
+    - - GenericFor:
+          for_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: for
+            trailing_trivia:
+              - start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          names:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 5
+                        line: 1
+                        character: 6
+                      end_position:
+                        bytes: 6
+                        line: 1
+                        character: 7
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          in_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 8
+                line: 1
+                character: 9
+              token_type:
+                type: Symbol
+                symbol: in
+            trailing_trivia:
+              - start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 9
+                            line: 1
+                            character: 10
+                          end_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          token_type:
+                            type: Identifier
+                            identifier: pairs
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 14
+                                        line: 1
+                                        character: 15
+                                      end_position:
+                                        bytes: 15
+                                        line: 1
+                                        character: 16
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 16
+                                        line: 1
+                                        character: 17
+                                      end_position:
+                                        bytes: 17
+                                        line: 1
+                                        character: 18
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs:
+                                  - End:
+                                      Var:
+                                        Name:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 15
+                                              line: 1
+                                              character: 16
+                                            end_position:
+                                              bytes: 16
+                                              line: 1
+                                              character: 17
+                                            token_type:
+                                              type: Identifier
+                                              identifier: y
+                                          trailing_trivia: []
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 17
+      line: 1
+      character: 18
+    end_position:
+      bytes: 17
+      line: 1
+      character: 18
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/ast_to_string.snap
new file mode 100644
index 00000000..920bfe9e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/generic-for-2
+---
+for x in pairs(y)doend
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/error_display.snap
new file mode 100644
index 00000000..67fae56e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/generic-for-2
+---
+error[ast]: expected `do` after expression list
+  ┌─ source.lua:1:18
+  │
+1 │ for x in pairs(y)
+  │                  ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/errors.snap
new file mode 100644
index 00000000..8f834d21
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/generic-for-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 17
+        line: 1
+        character: 18
+      token_type:
+        type: Eof
+    additional: "expected `do` after expression list"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/source.lua
new file mode 100644
index 00000000..88e9a0b7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/source.lua
@@ -0,0 +1 @@
+for x in pairs(y)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/tokens.snap
new file mode 100644
index 00000000..f3f3f884
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-2/tokens.snap
@@ -0,0 +1,127 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/generic-for-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: in
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: pairs
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/ast.snap
new file mode 100644
index 00000000..7972c504
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/ast.snap
@@ -0,0 +1,221 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/generic-for-3
+---
+nodes:
+  stmts:
+    - - GenericFor:
+          for_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: for
+            trailing_trivia:
+              - start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          names:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 5
+                        line: 1
+                        character: 6
+                      end_position:
+                        bytes: 6
+                        line: 1
+                        character: 7
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          in_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 8
+                line: 1
+                character: 9
+              token_type:
+                type: Symbol
+                symbol: in
+            trailing_trivia:
+              - start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 9
+                            line: 1
+                            character: 10
+                          end_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          token_type:
+                            type: Identifier
+                            identifier: pairs
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 14
+                                        line: 1
+                                        character: 15
+                                      end_position:
+                                        bytes: 15
+                                        line: 1
+                                        character: 16
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 16
+                                        line: 1
+                                        character: 17
+                                      end_position:
+                                        bytes: 17
+                                        line: 1
+                                        character: 18
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 17
+                                          line: 1
+                                          character: 18
+                                        end_position:
+                                          bytes: 18
+                                          line: 1
+                                          character: 19
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                              arguments:
+                                pairs:
+                                  - End:
+                                      Var:
+                                        Name:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 15
+                                              line: 1
+                                              character: 16
+                                            end_position:
+                                              bytes: 16
+                                              line: 1
+                                              character: 17
+                                            token_type:
+                                              type: Identifier
+                                              identifier: y
+                                          trailing_trivia: []
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 18
+                line: 1
+                character: 19
+              end_position:
+                bytes: 20
+                line: 1
+                character: 21
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 20
+      line: 1
+      character: 21
+    end_position:
+      bytes: 20
+      line: 1
+      character: 21
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/ast_to_string.snap
new file mode 100644
index 00000000..f739f29b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/generic-for-3
+---
+for x in pairs(y) doend
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/error_display.snap
new file mode 100644
index 00000000..2e9cf822
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/generic-for-3
+---
+error[ast]: expected `end` to close for loop block
+  ┌─ source.lua:1:19
+  │
+1 │ for x in pairs(y) do
+  │                   ^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/errors.snap
new file mode 100644
index 00000000..a7760826
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/errors.snap
@@ -0,0 +1,26 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/generic-for-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 20
+        line: 1
+        character: 21
+      end_position:
+        bytes: 20
+        line: 1
+        character: 21
+      token_type:
+        type: Eof
+    additional: "expected `end` to close for loop block"
+    range:
+      - bytes: 18
+        line: 1
+        character: 19
+      - bytes: 20
+        line: 1
+        character: 21
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/source.lua
new file mode 100644
index 00000000..1636a9e1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/source.lua
@@ -0,0 +1 @@
+for x in pairs(y) do
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/tokens.snap
new file mode 100644
index 00000000..e4ef33dd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-3/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/generic-for-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: in
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: pairs
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/ast.snap
new file mode 100644
index 00000000..9ebd07a6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/ast.snap
@@ -0,0 +1,150 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/generic-for-4
+---
+nodes:
+  stmts:
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 20
+                  line: 1
+                  character: 21
+                end_position:
+                  bytes: 25
+                  line: 1
+                  character: 26
+                token_type:
+                  type: Identifier
+                  identifier: pairs
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 25
+                              line: 1
+                              character: 26
+                            end_position:
+                              bytes: 26
+                              line: 1
+                              character: 27
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 30
+                              line: 1
+                              character: 31
+                            end_position:
+                              bytes: 31
+                              line: 1
+                              character: 32
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 31
+                                line: 1
+                                character: 32
+                              end_position:
+                                bytes: 32
+                                line: 1
+                                character: 33
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                    arguments:
+                      pairs:
+                        - End:
+                            Var:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 26
+                                    line: 1
+                                    character: 27
+                                  end_position:
+                                    bytes: 30
+                                    line: 1
+                                    character: 31
+                                  token_type:
+                                    type: Identifier
+                                    identifier: list
+                                trailing_trivia: []
+      - ~
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 32
+                line: 1
+                character: 33
+              end_position:
+                bytes: 34
+                line: 1
+                character: 35
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 34
+                  line: 1
+                  character: 35
+                end_position:
+                  bytes: 35
+                  line: 1
+                  character: 36
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 35
+                line: 1
+                character: 36
+              end_position:
+                bytes: 38
+                line: 1
+                character: 39
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 38
+      line: 1
+      character: 39
+    end_position:
+      bytes: 38
+      line: 1
+      character: 39
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/ast_to_string.snap
new file mode 100644
index 00000000..80b3ee21
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/generic-for-4
+---
+pairs(list) do end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/error_display.snap
new file mode 100644
index 00000000..22df6589
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/error_display.snap
@@ -0,0 +1,31 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/generic-for-4
+---
+error[ast]: trailing commas are not allowed
+  ┌─ source.lua:1:10
+  │
+1 │ for index, local in pairs(list) do end
+  │          ^
+
+error[ast]: expected `in` after name list
+  ┌─ source.lua:1:12
+  │
+1 │ for index, local in pairs(list) do end
+  │            ^^^^^
+
+error[ast]: expected either a variable name or `function`
+  ┌─ source.lua:1:18
+  │
+1 │ for index, local in pairs(list) do end
+  │                  ^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:18
+  │
+1 │ for index, local in pairs(list) do end
+  │                  ^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/errors.snap
new file mode 100644
index 00000000..c2e5d95d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/errors.snap
@@ -0,0 +1,62 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/generic-for-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: trailing commas are not allowed
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: Symbol
+        symbol: local
+    additional: "expected `in` after name list"
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 19
+        line: 1
+        character: 20
+      token_type:
+        type: Symbol
+        symbol: in
+    additional: "expected either a variable name or `function`"
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 19
+        line: 1
+        character: 20
+      token_type:
+        type: Symbol
+        symbol: in
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/source.lua
new file mode 100644
index 00000000..0ef1ebda
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/source.lua
@@ -0,0 +1 @@
+for index, local in pairs(list) do end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/tokens.snap
new file mode 100644
index 00000000..520288b7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/generic-for-4/tokens.snap
@@ -0,0 +1,204 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/generic-for-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: index
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: in
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: pairs
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 30
+    line: 1
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: list
+- start_position:
+    bytes: 30
+    line: 1
+    character: 31
+  end_position:
+    bytes: 31
+    line: 1
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 31
+    line: 1
+    character: 32
+  end_position:
+    bytes: 32
+    line: 1
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 32
+    line: 1
+    character: 33
+  end_position:
+    bytes: 34
+    line: 1
+    character: 35
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 34
+    line: 1
+    character: 35
+  end_position:
+    bytes: 35
+    line: 1
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 35
+    line: 1
+    character: 36
+  end_position:
+    bytes: 38
+    line: 1
+    character: 39
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 38
+    line: 1
+    character: 39
+  end_position:
+    bytes: 38
+    line: 1
+    character: 39
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/ast.snap
new file mode 100644
index 00000000..175f404d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/ast.snap
@@ -0,0 +1,114 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/if-1
+---
+nodes:
+  stmts:
+    - - If:
+          if_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: if
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          condition:
+            Var:
+              Name:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 3
+                    line: 1
+                    character: 4
+                  end_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          then_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: then
+            trailing_trivia: []
+          block:
+            stmts: []
+          else_if: ~
+          else_token: ~
+          else: ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 1
+      character: 10
+    end_position:
+      bytes: 9
+      line: 1
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/ast_to_string.snap
new file mode 100644
index 00000000..9a5d68df
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/if-1
+---
+if x thenend
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/error_display.snap
new file mode 100644
index 00000000..fcb0be21
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/if-1
+---
+error[ast]: expected `end` to conclude `if`
+  ┌─ source.lua:1:10
+  │
+1 │ if x then
+  │          ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/errors.snap
new file mode 100644
index 00000000..19e156e5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/if-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Eof
+    additional: "expected `end` to conclude `if`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/source.lua
new file mode 100644
index 00000000..a3f9a84a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/source.lua
@@ -0,0 +1 @@
+if x then
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/tokens.snap
new file mode 100644
index 00000000..6cdda87b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-1/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/if-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/ast.snap
new file mode 100644
index 00000000..c9be7781
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/ast.snap
@@ -0,0 +1,216 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/if-2
+---
+nodes:
+  stmts:
+    - - If:
+          if_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: if
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          condition:
+            Var:
+              Name:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 3
+                    line: 1
+                    character: 4
+                  end_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          then_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: then
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts: []
+          else_if: ~
+          else_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 10
+                line: 2
+                character: 1
+              end_position:
+                bytes: 14
+                line: 2
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: else
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 2
+                  character: 5
+                end_position:
+                  bytes: 15
+                  line: 2
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          else:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 15
+                              line: 3
+                              character: 1
+                            end_position:
+                              bytes: 16
+                              line: 3
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 16
+                            line: 3
+                            character: 2
+                          end_position:
+                            bytes: 20
+                            line: 3
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 20
+                                        line: 3
+                                        character: 6
+                                      end_position:
+                                        bytes: 21
+                                        line: 3
+                                        character: 7
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 21
+                                        line: 3
+                                        character: 7
+                                      end_position:
+                                        bytes: 22
+                                        line: 3
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+                - ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 22
+      line: 3
+      character: 8
+    end_position:
+      bytes: 22
+      line: 3
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/ast_to_string.snap
new file mode 100644
index 00000000..748f4d41
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/if-2
+---
+"if x then\nelse\n\tcall()end"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/error_display.snap
new file mode 100644
index 00000000..c69c5395
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/if-2
+---
+error[ast]: expected `end` to conclude `if`
+  ┌─ source.lua:3:8
+  │
+3 │     call()
+  │           ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/errors.snap
new file mode 100644
index 00000000..e06a8961
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/if-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 22
+        line: 3
+        character: 8
+      end_position:
+        bytes: 22
+        line: 3
+        character: 8
+      token_type:
+        type: Eof
+    additional: "expected `end` to conclude `if`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/source.lua
new file mode 100644
index 00000000..76b5f4e0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/source.lua
@@ -0,0 +1,3 @@
+if x then
+else
+	call()
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/tokens.snap
new file mode 100644
index 00000000..1effc926
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-2/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/if-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 14
+    line: 2
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 14
+    line: 2
+    character: 5
+  end_position:
+    bytes: 15
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 3
+    character: 1
+  end_position:
+    bytes: 16
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 16
+    line: 3
+    character: 2
+  end_position:
+    bytes: 20
+    line: 3
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 20
+    line: 3
+    character: 6
+  end_position:
+    bytes: 21
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 21
+    line: 3
+    character: 7
+  end_position:
+    bytes: 22
+    line: 3
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 22
+    line: 3
+    character: 8
+  end_position:
+    bytes: 22
+    line: 3
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/ast.snap
new file mode 100644
index 00000000..1ec7da5e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/if-3
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 17
+      line: 1
+      character: 18
+    end_position:
+      bytes: 17
+      line: 1
+      character: 18
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/ast_to_string.snap
new file mode 100644
index 00000000..fe1b1c2c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/if-3
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/error_display.snap
new file mode 100644
index 00000000..b1b5b87c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/error_display.snap
@@ -0,0 +1,25 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/if-3
+---
+error[ast]: expected condition after `if`
+  ┌─ source.lua:1:1
+  │
+1 │ if local then end
+  │ ^^
+
+error[ast]: expected either a variable name or `function`
+  ┌─ source.lua:1:10
+  │
+1 │ if local then end
+  │          ^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:10
+  │
+1 │ if local then end
+  │          ^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/errors.snap
new file mode 100644
index 00000000..ea1d4d90
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/errors.snap
@@ -0,0 +1,48 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/if-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 2
+        line: 1
+        character: 3
+      token_type:
+        type: Symbol
+        symbol: if
+    additional: "expected condition after `if`"
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 13
+        line: 1
+        character: 14
+      token_type:
+        type: Symbol
+        symbol: then
+    additional: "expected either a variable name or `function`"
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 13
+        line: 1
+        character: 14
+      token_type:
+        type: Symbol
+        symbol: then
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/source.lua
new file mode 100644
index 00000000..11aed1fa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/source.lua
@@ -0,0 +1 @@
+if local then end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/tokens.snap
new file mode 100644
index 00000000..1eed2f7a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-3/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/if-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/ast.snap
new file mode 100644
index 00000000..482fc269
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/ast.snap
@@ -0,0 +1,196 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/if-4
+---
+nodes:
+  stmts:
+    - - If:
+          if_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: if
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          condition:
+            Var:
+              Name:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 3
+                    line: 1
+                    character: 4
+                  end_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          then_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: then
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts: []
+          else_if:
+            - else_if_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 10
+                    line: 2
+                    character: 1
+                  end_position:
+                    bytes: 16
+                    line: 2
+                    character: 7
+                  token_type:
+                    type: Symbol
+                    symbol: elseif
+                trailing_trivia:
+                  - start_position:
+                      bytes: 16
+                      line: 2
+                      character: 7
+                    end_position:
+                      bytes: 17
+                      line: 2
+                      character: 8
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              condition:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 17
+                        line: 2
+                        character: 8
+                      end_position:
+                        bytes: 18
+                        line: 2
+                        character: 9
+                      token_type:
+                        type: Identifier
+                        identifier: y
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 18
+                          line: 2
+                          character: 9
+                        end_position:
+                          bytes: 19
+                          line: 2
+                          character: 10
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+              then_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 19
+                    line: 2
+                    character: 10
+                  end_position:
+                    bytes: 23
+                    line: 2
+                    character: 14
+                  token_type:
+                    type: Symbol
+                    symbol: then
+                trailing_trivia: []
+              block:
+                stmts: []
+          else_token: ~
+          else: ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 23
+      line: 2
+      character: 14
+    end_position:
+      bytes: 23
+      line: 2
+      character: 14
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/ast_to_string.snap
new file mode 100644
index 00000000..1adf8e81
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/if-4
+---
+"if x then\nelseif y thenend"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/error_display.snap
new file mode 100644
index 00000000..a4493dd0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/if-4
+---
+error[ast]: expected `end` to conclude `if`
+  ┌─ source.lua:2:14
+  │
+2 │ elseif y then
+  │              ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/errors.snap
new file mode 100644
index 00000000..4e4d9763
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/if-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 23
+        line: 2
+        character: 14
+      end_position:
+        bytes: 23
+        line: 2
+        character: 14
+      token_type:
+        type: Eof
+    additional: "expected `end` to conclude `if`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/source.lua
new file mode 100644
index 00000000..fcaba29b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/source.lua
@@ -0,0 +1,2 @@
+if x then
+elseif y then
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/tokens.snap
new file mode 100644
index 00000000..7a3e1820
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-4/tokens.snap
@@ -0,0 +1,138 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/if-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: elseif
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 2
+    character: 8
+  end_position:
+    bytes: 18
+    line: 2
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 18
+    line: 2
+    character: 9
+  end_position:
+    bytes: 19
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 10
+  end_position:
+    bytes: 23
+    line: 2
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 23
+    line: 2
+    character: 14
+  end_position:
+    bytes: 23
+    line: 2
+    character: 14
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/ast.snap
new file mode 100644
index 00000000..2a9e9111
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/ast.snap
@@ -0,0 +1,379 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/if-5
+---
+nodes:
+  stmts:
+    - - If:
+          if_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: if
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          condition:
+            Var:
+              Name:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 3
+                    line: 1
+                    character: 4
+                  end_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          then_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: then
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 10
+                              line: 2
+                              character: 1
+                            end_position:
+                              bytes: 11
+                              line: 2
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 11
+                            line: 2
+                            character: 2
+                          end_position:
+                            bytes: 16
+                            line: 2
+                            character: 7
+                          token_type:
+                            type: Identifier
+                            identifier: call1
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 16
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 17
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 17
+                                        line: 2
+                                        character: 8
+                                      end_position:
+                                        bytes: 18
+                                        line: 2
+                                        character: 9
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 18
+                                          line: 2
+                                          character: 9
+                                        end_position:
+                                          bytes: 19
+                                          line: 2
+                                          character: 9
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs: []
+                - ~
+          else_if: ~
+          else_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 19
+                line: 3
+                character: 1
+              end_position:
+                bytes: 23
+                line: 3
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: else
+            trailing_trivia:
+              - start_position:
+                  bytes: 23
+                  line: 3
+                  character: 5
+                end_position:
+                  bytes: 24
+                  line: 3
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          else:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 24
+                              line: 4
+                              character: 1
+                            end_position:
+                              bytes: 25
+                              line: 4
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 25
+                            line: 4
+                            character: 2
+                          end_position:
+                            bytes: 30
+                            line: 4
+                            character: 7
+                          token_type:
+                            type: Identifier
+                            identifier: call2
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 30
+                                        line: 4
+                                        character: 7
+                                      end_position:
+                                        bytes: 31
+                                        line: 4
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 31
+                                        line: 4
+                                        character: 8
+                                      end_position:
+                                        bytes: 32
+                                        line: 4
+                                        character: 9
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 32
+                                          line: 4
+                                          character: 9
+                                        end_position:
+                                          bytes: 33
+                                          line: 4
+                                          character: 9
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs: []
+                - ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia:
+                - start_position:
+                    bytes: 47
+                    line: 6
+                    character: 1
+                  end_position:
+                    bytes: 48
+                    line: 6
+                    character: 2
+                  token_type:
+                    type: Whitespace
+                    characters: "\t"
+              token:
+                start_position:
+                  bytes: 48
+                  line: 6
+                  character: 2
+                end_position:
+                  bytes: 53
+                  line: 6
+                  character: 7
+                token_type:
+                  type: Identifier
+                  identifier: call3
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 53
+                              line: 6
+                              character: 7
+                            end_position:
+                              bytes: 54
+                              line: 6
+                              character: 8
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 54
+                              line: 6
+                              character: 8
+                            end_position:
+                              bytes: 55
+                              line: 6
+                              character: 9
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 55
+                                line: 6
+                                character: 9
+                              end_position:
+                                bytes: 56
+                                line: 6
+                                character: 9
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    arguments:
+                      pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 59
+      line: 7
+      character: 4
+    end_position:
+      bytes: 59
+      line: 7
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/ast_to_string.snap
new file mode 100644
index 00000000..f7343c4e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/if-5
+---
+"if x then\n\tcall1()\nelse\n\tcall2()\nend\tcall3()\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/error_display.snap
new file mode 100644
index 00000000..c47c9ef3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/error_display.snap
@@ -0,0 +1,31 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/if-5
+---
+error[ast]: expected `end` to conclude `if`
+  ┌─ source.lua:5:1
+  │
+5 │ elseif y then
+  │ ^^^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:5:1
+  │
+5 │ elseif y then
+  │ ^^^^^^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:5:10
+  │
+5 │ elseif y then
+  │          ^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:5:10
+  │
+5 │ elseif y then
+  │          ^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/errors.snap
new file mode 100644
index 00000000..9af48a5a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/errors.snap
@@ -0,0 +1,62 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/if-5
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 33
+        line: 5
+        character: 1
+      end_position:
+        bytes: 39
+        line: 5
+        character: 7
+      token_type:
+        type: Symbol
+        symbol: elseif
+    additional: "expected `end` to conclude `if`"
+- AstError:
+    token:
+      start_position:
+        bytes: 33
+        line: 5
+        character: 1
+      end_position:
+        bytes: 39
+        line: 5
+        character: 7
+      token_type:
+        type: Symbol
+        symbol: elseif
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 42
+        line: 5
+        character: 10
+      end_position:
+        bytes: 46
+        line: 5
+        character: 14
+      token_type:
+        type: Symbol
+        symbol: then
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 42
+        line: 5
+        character: 10
+      end_position:
+        bytes: 46
+        line: 5
+        character: 14
+      token_type:
+        type: Symbol
+        symbol: then
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/source.lua
new file mode 100644
index 00000000..31487e7f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/source.lua
@@ -0,0 +1,7 @@
+if x then
+	call1()
+else
+	call2()
+elseif y then
+	call3()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/tokens.snap
new file mode 100644
index 00000000..d381cb1f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-5/tokens.snap
@@ -0,0 +1,347 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/if-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 11
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 2
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: call1
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 2
+    character: 8
+  end_position:
+    bytes: 18
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 18
+    line: 2
+    character: 9
+  end_position:
+    bytes: 19
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 3
+    character: 1
+  end_position:
+    bytes: 23
+    line: 3
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 23
+    line: 3
+    character: 5
+  end_position:
+    bytes: 24
+    line: 3
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 24
+    line: 4
+    character: 1
+  end_position:
+    bytes: 25
+    line: 4
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 25
+    line: 4
+    character: 2
+  end_position:
+    bytes: 30
+    line: 4
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: call2
+- start_position:
+    bytes: 30
+    line: 4
+    character: 7
+  end_position:
+    bytes: 31
+    line: 4
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 31
+    line: 4
+    character: 8
+  end_position:
+    bytes: 32
+    line: 4
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 32
+    line: 4
+    character: 9
+  end_position:
+    bytes: 33
+    line: 4
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 33
+    line: 5
+    character: 1
+  end_position:
+    bytes: 39
+    line: 5
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: elseif
+- start_position:
+    bytes: 39
+    line: 5
+    character: 7
+  end_position:
+    bytes: 40
+    line: 5
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 40
+    line: 5
+    character: 8
+  end_position:
+    bytes: 41
+    line: 5
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 41
+    line: 5
+    character: 9
+  end_position:
+    bytes: 42
+    line: 5
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 42
+    line: 5
+    character: 10
+  end_position:
+    bytes: 46
+    line: 5
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 46
+    line: 5
+    character: 14
+  end_position:
+    bytes: 47
+    line: 5
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 47
+    line: 6
+    character: 1
+  end_position:
+    bytes: 48
+    line: 6
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 48
+    line: 6
+    character: 2
+  end_position:
+    bytes: 53
+    line: 6
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: call3
+- start_position:
+    bytes: 53
+    line: 6
+    character: 7
+  end_position:
+    bytes: 54
+    line: 6
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 54
+    line: 6
+    character: 8
+  end_position:
+    bytes: 55
+    line: 6
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 55
+    line: 6
+    character: 9
+  end_position:
+    bytes: 56
+    line: 6
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 56
+    line: 7
+    character: 1
+  end_position:
+    bytes: 59
+    line: 7
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 59
+    line: 7
+    character: 4
+  end_position:
+    bytes: 59
+    line: 7
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/ast.snap
new file mode 100644
index 00000000..f632be91
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/ast.snap
@@ -0,0 +1,227 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/if-6
+---
+nodes:
+  stmts:
+    - - If:
+          if_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: if
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          condition:
+            Var:
+              Name:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 3
+                    line: 1
+                    character: 4
+                  end_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          then_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: then
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts: []
+          else_if: ~
+          else_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 10
+                line: 2
+                character: 1
+              end_position:
+                bytes: 14
+                line: 2
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: else
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 2
+                  character: 5
+                end_position:
+                  bytes: 15
+                  line: 2
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          else:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia:
+                - start_position:
+                    bytes: 20
+                    line: 3
+                    character: 1
+                  end_position:
+                    bytes: 21
+                    line: 3
+                    character: 2
+                  token_type:
+                    type: Whitespace
+                    characters: "\t"
+              token:
+                start_position:
+                  bytes: 21
+                  line: 3
+                  character: 2
+                end_position:
+                  bytes: 25
+                  line: 3
+                  character: 6
+                token_type:
+                  type: Identifier
+                  identifier: call
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 25
+                              line: 3
+                              character: 6
+                            end_position:
+                              bytes: 26
+                              line: 3
+                              character: 7
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 26
+                              line: 3
+                              character: 7
+                            end_position:
+                              bytes: 27
+                              line: 3
+                              character: 8
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 27
+                                line: 3
+                                character: 8
+                              end_position:
+                                bytes: 28
+                                line: 3
+                                character: 8
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    arguments:
+                      pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 31
+      line: 4
+      character: 4
+    end_position:
+      bytes: 31
+      line: 4
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/ast_to_string.snap
new file mode 100644
index 00000000..bd3740cb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/if-6
+---
+"if x then\nelse end\tcall()\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/error_display.snap
new file mode 100644
index 00000000..c8f4e254
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/if-6
+---
+error[ast]: expected `end` to conclude `if`
+  ┌─ source.lua:2:6
+  │
+2 │ else then
+  │      ^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:6
+  │
+2 │ else then
+  │      ^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/errors.snap
new file mode 100644
index 00000000..25bf982a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/if-6
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 15
+        line: 2
+        character: 6
+      end_position:
+        bytes: 19
+        line: 2
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: then
+    additional: "expected `end` to conclude `if`"
+- AstError:
+    token:
+      start_position:
+        bytes: 15
+        line: 2
+        character: 6
+      end_position:
+        bytes: 19
+        line: 2
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: then
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/source.lua
new file mode 100644
index 00000000..eac8a784
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/source.lua
@@ -0,0 +1,4 @@
+if x then
+else then
+	call()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/tokens.snap
new file mode 100644
index 00000000..6559e117
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-6/tokens.snap
@@ -0,0 +1,193 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/if-6
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 14
+    line: 2
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 14
+    line: 2
+    character: 5
+  end_position:
+    bytes: 15
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 2
+    character: 6
+  end_position:
+    bytes: 19
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 19
+    line: 2
+    character: 10
+  end_position:
+    bytes: 20
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 20
+    line: 3
+    character: 1
+  end_position:
+    bytes: 21
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 21
+    line: 3
+    character: 2
+  end_position:
+    bytes: 25
+    line: 3
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 25
+    line: 3
+    character: 6
+  end_position:
+    bytes: 26
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 26
+    line: 3
+    character: 7
+  end_position:
+    bytes: 27
+    line: 3
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 27
+    line: 3
+    character: 8
+  end_position:
+    bytes: 28
+    line: 3
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 28
+    line: 4
+    character: 1
+  end_position:
+    bytes: 31
+    line: 4
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 31
+    line: 4
+    character: 4
+  end_position:
+    bytes: 31
+    line: 4
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/ast.snap
new file mode 100644
index 00000000..a8bee9d9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/ast.snap
@@ -0,0 +1,170 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/if-7
+---
+nodes:
+  stmts:
+    - - If:
+          if_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: if
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          condition:
+            Var:
+              Name:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 3
+                    line: 1
+                    character: 4
+                  end_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          then_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: then
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          block:
+            stmts:
+              - - Do:
+                    do_token:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 10
+                          line: 1
+                          character: 11
+                        end_position:
+                          bytes: 12
+                          line: 1
+                          character: 13
+                        token_type:
+                          type: Symbol
+                          symbol: do
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 12
+                            line: 1
+                            character: 13
+                          end_position:
+                            bytes: 13
+                            line: 1
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                    block:
+                      stmts: []
+                    end_token:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 13
+                          line: 2
+                          character: 1
+                        end_position:
+                          bytes: 16
+                          line: 2
+                          character: 4
+                        token_type:
+                          type: Symbol
+                          symbol: end
+                      trailing_trivia: []
+                - ~
+          else_if: ~
+          else_token: ~
+          else: ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 2
+      character: 4
+    end_position:
+      bytes: 16
+      line: 2
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/ast_to_string.snap
new file mode 100644
index 00000000..942af31f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/if-7
+---
+"if x then do\nendend"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/error_display.snap
new file mode 100644
index 00000000..ee217fae
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/if-7
+---
+error[ast]: expected `end` to conclude `if`
+  ┌─ source.lua:2:4
+  │
+2 │ end
+  │    ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/errors.snap
new file mode 100644
index 00000000..e3e0debd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/if-7
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 16
+        line: 2
+        character: 4
+      end_position:
+        bytes: 16
+        line: 2
+        character: 4
+      token_type:
+        type: Eof
+    additional: "expected `end` to conclude `if`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/source.lua
new file mode 100644
index 00000000..40a78b95
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/source.lua
@@ -0,0 +1,2 @@
+if x then do
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/tokens.snap
new file mode 100644
index 00000000..660eb1b5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/if-7/tokens.snap
@@ -0,0 +1,116 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/if-7
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 1
+  end_position:
+    bytes: 16
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 16
+    line: 2
+    character: 4
+  end_position:
+    bytes: 16
+    line: 2
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/ast.snap
new file mode 100644
index 00000000..222e0dec
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/index-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 3
+      line: 1
+      character: 4
+    end_position:
+      bytes: 3
+      line: 1
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/ast_to_string.snap
new file mode 100644
index 00000000..bd24341f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/index-1
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/error_display.snap
new file mode 100644
index 00000000..9c69eac1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/index-1
+---
+error[ast]: expected `]` to close index expression
+  ┌─ source.lua:1:2
+  │
+1 │ x[2
+  │  ^^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:4
+  │
+1 │ x[2
+  │    ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/errors.snap
new file mode 100644
index 00000000..dfb0f219
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/errors.snap
@@ -0,0 +1,39 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/index-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 3
+        line: 1
+        character: 4
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Eof
+    additional: "expected `]` to close index expression"
+    range:
+      - bytes: 1
+        line: 1
+        character: 2
+      - bytes: 3
+        line: 1
+        character: 4
+- AstError:
+    token:
+      start_position:
+        bytes: 3
+        line: 1
+        character: 4
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Eof
+    additional: unexpected expression when looking for a statement
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/source.lua
new file mode 100644
index 00000000..5073f14e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/source.lua
@@ -0,0 +1 @@
+x[2
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/tokens.snap
new file mode 100644
index 00000000..c7666f35
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/index-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/ast.snap
new file mode 100644
index 00000000..9b6dfa6a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/index-2
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 2
+      line: 1
+      character: 3
+    end_position:
+      bytes: 2
+      line: 1
+      character: 3
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/ast_to_string.snap
new file mode 100644
index 00000000..929be64c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/index-2
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/error_display.snap
new file mode 100644
index 00000000..8c235bac
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/index-2
+---
+error[ast]: expected expression after `[`
+  ┌─ source.lua:1:2
+  │
+1 │ x[
+  │  ^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:3
+  │
+1 │ x[
+  │   ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/errors.snap
new file mode 100644
index 00000000..feb31115
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/errors.snap
@@ -0,0 +1,33 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/index-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 1
+        line: 1
+        character: 2
+      end_position:
+        bytes: 2
+        line: 1
+        character: 3
+      token_type:
+        type: Symbol
+        symbol: "["
+    additional: "expected expression after `[`"
+- AstError:
+    token:
+      start_position:
+        bytes: 2
+        line: 1
+        character: 3
+      end_position:
+        bytes: 2
+        line: 1
+        character: 3
+      token_type:
+        type: Eof
+    additional: unexpected expression when looking for a statement
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/source.lua
new file mode 100644
index 00000000..4ba02ce0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/source.lua
@@ -0,0 +1 @@
+x[
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/tokens.snap
new file mode 100644
index 00000000..a7314f44
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-2/tokens.snap
@@ -0,0 +1,39 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/index-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/ast.snap
new file mode 100644
index 00000000..71001217
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/index-3
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 7
+      line: 1
+      character: 8
+    end_position:
+      bytes: 7
+      line: 1
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/ast_to_string.snap
new file mode 100644
index 00000000..9603cdc4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/index-3
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/error_display.snap
new file mode 100644
index 00000000..5a4c49c3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/error_display.snap
@@ -0,0 +1,25 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/index-3
+---
+error[ast]: expected expression after `[`
+  ┌─ source.lua:1:2
+  │
+1 │ x[] = 1
+  │  ^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:3
+  │
+1 │ x[] = 1
+  │   ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:3
+  │
+1 │ x[] = 1
+  │   ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/errors.snap
new file mode 100644
index 00000000..76ffc51c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/errors.snap
@@ -0,0 +1,48 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/index-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 1
+        line: 1
+        character: 2
+      end_position:
+        bytes: 2
+        line: 1
+        character: 3
+      token_type:
+        type: Symbol
+        symbol: "["
+    additional: "expected expression after `[`"
+- AstError:
+    token:
+      start_position:
+        bytes: 2
+        line: 1
+        character: 3
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: "]"
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 2
+        line: 1
+        character: 3
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: "]"
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/source.lua
new file mode 100644
index 00000000..96f85a9d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/source.lua
@@ -0,0 +1 @@
+x[] = 1
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/tokens.snap
new file mode 100644
index 00000000..65167c72
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-3/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/index-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/ast.snap
new file mode 100644
index 00000000..5b390d31
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/ast.snap
@@ -0,0 +1,124 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/index-4
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: y
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Var:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 10
+                          line: 1
+                          character: 11
+                        end_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        token_type:
+                          type: Identifier
+                          identifier: x
+                      trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 1
+      character: 17
+    end_position:
+      bytes: 16
+      line: 1
+      character: 17
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/ast_to_string.snap
new file mode 100644
index 00000000..2c4d24a3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/index-4
+---
+local y = x
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/error_display.snap
new file mode 100644
index 00000000..69b67390
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/index-4
+---
+error[ast]: expected expression after `[`
+  ┌─ source.lua:1:12
+  │
+1 │ local y = x[end]
+  │            ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:13
+  │
+1 │ local y = x[end]
+  │             ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/errors.snap
new file mode 100644
index 00000000..c640f83f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/index-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Symbol
+        symbol: "["
+    additional: "expected expression after `[`"
+- AstError:
+    token:
+      start_position:
+        bytes: 12
+        line: 1
+        character: 13
+      end_position:
+        bytes: 15
+        line: 1
+        character: 16
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/source.lua
new file mode 100644
index 00000000..92169c41
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/source.lua
@@ -0,0 +1 @@
+local y = x[end]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/tokens.snap
new file mode 100644
index 00000000..7cb056ba
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-4/tokens.snap
@@ -0,0 +1,127 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/index-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/ast.snap
new file mode 100644
index 00000000..7440fbe5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/ast.snap
@@ -0,0 +1,71 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/index-5
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Identifier
+                        identifier: name
+                    trailing_trivia: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 17
+      line: 1
+      character: 18
+    end_position:
+      bytes: 17
+      line: 1
+      character: 18
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/ast_to_string.snap
new file mode 100644
index 00000000..5358da65
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/index-5
+---
+return name
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/error_display.snap
new file mode 100644
index 00000000..7fd11fc6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/index-5
+---
+error[ast]: expected identifier after `.`
+  ┌─ source.lua:1:12
+  │
+1 │ return name.until
+  │            ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:13
+  │
+1 │ return name.until
+  │             ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/errors.snap
new file mode 100644
index 00000000..c086086b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/index-5
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Symbol
+        symbol: "."
+    additional: "expected identifier after `.`"
+- AstError:
+    token:
+      start_position:
+        bytes: 12
+        line: 1
+        character: 13
+      end_position:
+        bytes: 17
+        line: 1
+        character: 18
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/source.lua
new file mode 100644
index 00000000..ebc7fd01
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/source.lua
@@ -0,0 +1 @@
+return name.until
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/tokens.snap
new file mode 100644
index 00000000..faaa37d9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/index-5/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/index-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/ast.snap
new file mode 100644
index 00000000..a85c6eb6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/ast.snap
@@ -0,0 +1,292 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 23
+expression: result.ast()
+input_file: full-moon/tests/cases/fail/parser/last-stmt-1
+---
+nodes:
+  stmts:
+    - - LocalFunction:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                end_position:
+                  bytes: 15
+                  line: 1
+                  character: 16
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 1
+                character: 16
+              end_position:
+                bytes: 16
+                line: 1
+                character: 17
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia: []
+          body:
+            generics: ~
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    end_position:
+                      bytes: 18
+                      line: 1
+                      character: 19
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 18
+                        line: 1
+                        character: 19
+                      end_position:
+                        bytes: 19
+                        line: 1
+                        character: 19
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            parameters:
+              pairs: []
+            type_specifiers: []
+            block:
+              stmts: []
+              last_stmt:
+                - Return:
+                    token:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 19
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 20
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 20
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 26
+                          line: 2
+                          character: 8
+                        token_type:
+                          type: Symbol
+                          symbol: return
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 26
+                            line: 2
+                            character: 8
+                          end_position:
+                            bytes: 27
+                            line: 2
+                            character: 9
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    returns:
+                      pairs:
+                        - End:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 27
+                                  line: 2
+                                  character: 9
+                                end_position:
+                                  bytes: 28
+                                  line: 2
+                                  character: 10
+                                token_type:
+                                  type: Number
+                                  text: "1"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 28
+                                    line: 2
+                                    character: 10
+                                  end_position:
+                                    bytes: 29
+                                    line: 2
+                                    character: 10
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                - ~
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia: []
+      - ~
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia:
+            - start_position:
+                bytes: 29
+                line: 3
+                character: 1
+              end_position:
+                bytes: 30
+                line: 3
+                character: 2
+              token_type:
+                type: Whitespace
+                characters: "\t"
+          token:
+            start_position:
+              bytes: 30
+              line: 3
+              character: 2
+            end_position:
+              bytes: 36
+              line: 3
+              character: 8
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 36
+                line: 3
+                character: 8
+              end_position:
+                bytes: 37
+                line: 3
+                character: 9
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 37
+                      line: 3
+                      character: 9
+                    end_position:
+                      bytes: 38
+                      line: 3
+                      character: 10
+                    token_type:
+                      type: Number
+                      text: "2"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 38
+                        line: 3
+                        character: 10
+                      end_position:
+                        bytes: 39
+                        line: 3
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 43
+      line: 5
+      character: 1
+    end_position:
+      bytes: 43
+      line: 5
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/ast_to_string.snap
new file mode 100644
index 00000000..a8f0478e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 28
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/last-stmt-1
+---
+"local function x()\n\treturn 1\nend\treturn 2\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/error_display.snap
new file mode 100644
index 00000000..aa58c713
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/last-stmt-1
+---
+error[ast]: expected `end` to close function body block
+  ┌─ source.lua:2:2
+  │
+2 │     return 1
+  │     ^^^^^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:4:1
+  │
+4 │ end
+  │ ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/errors.snap
new file mode 100644
index 00000000..d08c245e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/errors.snap
@@ -0,0 +1,41 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/last-stmt-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 30
+        line: 3
+        character: 2
+      end_position:
+        bytes: 36
+        line: 3
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: return
+    additional: "expected `end` to close function body block"
+    range:
+      - bytes: 20
+        line: 2
+        character: 2
+      - bytes: 28
+        line: 2
+        character: 10
+- AstError:
+    token:
+      start_position:
+        bytes: 39
+        line: 4
+        character: 1
+      end_position:
+        bytes: 42
+        line: 4
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/source.lua
new file mode 100644
index 00000000..82fa7719
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/source.lua
@@ -0,0 +1,4 @@
+local function x()
+	return 1
+	return 2
+end
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/tokens.snap
new file mode 100644
index 00000000..63be35e3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/last-stmt-1/tokens.snap
@@ -0,0 +1,237 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 68
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/last-stmt-1
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 2
+    character: 1
+  end_position:
+    bytes: 20
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 20
+    line: 2
+    character: 2
+  end_position:
+    bytes: 26
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 26
+    line: 2
+    character: 8
+  end_position:
+    bytes: 27
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 27
+    line: 2
+    character: 9
+  end_position:
+    bytes: 28
+    line: 2
+    character: 10
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 28
+    line: 2
+    character: 10
+  end_position:
+    bytes: 29
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 29
+    line: 3
+    character: 1
+  end_position:
+    bytes: 30
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 30
+    line: 3
+    character: 2
+  end_position:
+    bytes: 36
+    line: 3
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 36
+    line: 3
+    character: 8
+  end_position:
+    bytes: 37
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 37
+    line: 3
+    character: 9
+  end_position:
+    bytes: 38
+    line: 3
+    character: 10
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 38
+    line: 3
+    character: 10
+  end_position:
+    bytes: 39
+    line: 3
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 39
+    line: 4
+    character: 1
+  end_position:
+    bytes: 42
+    line: 4
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 42
+    line: 4
+    character: 4
+  end_position:
+    bytes: 43
+    line: 4
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 43
+    line: 5
+    character: 1
+  end_position:
+    bytes: 43
+    line: 5
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/ast.snap
new file mode 100644
index 00000000..ae6bfc2a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/ast.snap
@@ -0,0 +1,82 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-assignment-1
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token: ~
+          expr_list:
+            pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 1
+      character: 10
+    end_position:
+      bytes: 9
+      line: 1
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/ast_to_string.snap
new file mode 100644
index 00000000..460d2b64
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-1
+---
+"local x "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/error_display.snap
new file mode 100644
index 00000000..ef5a06f1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-1
+---
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:10
+  │
+1 │ local x y
+  │          ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/errors.snap
new file mode 100644
index 00000000..c96d5321
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-assignment-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Eof
+    additional: unexpected expression when looking for a statement
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/source.lua
new file mode 100644
index 00000000..0cf360b3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/source.lua
@@ -0,0 +1 @@
+local x y
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/tokens.snap
new file mode 100644
index 00000000..d6f53d92
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-1/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-assignment-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/ast.snap
new file mode 100644
index 00000000..59339fec
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/ast.snap
@@ -0,0 +1,96 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-assignment-2
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia: []
+          expr_list:
+            pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 1
+      character: 10
+    end_position:
+      bytes: 9
+      line: 1
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/ast_to_string.snap
new file mode 100644
index 00000000..6e832ffe
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-2
+---
+local x =
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/error_display.snap
new file mode 100644
index 00000000..2d3cc9bc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-2
+---
+error[ast]: expected an expression
+  ┌─ source.lua:1:9
+  │
+1 │ local x =
+  │         ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/errors.snap
new file mode 100644
index 00000000..96c0cc2a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-assignment-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: expected an expression
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/source.lua
new file mode 100644
index 00000000..2c2dc7b9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/source.lua
@@ -0,0 +1 @@
+local x =
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/tokens.snap
new file mode 100644
index 00000000..fa211a7d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-2/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-assignment-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/ast.snap
new file mode 100644
index 00000000..ae264791
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/ast.snap
@@ -0,0 +1,123 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-assignment-3
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 12
+      line: 1
+      character: 13
+    end_position:
+      bytes: 12
+      line: 1
+      character: 13
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/ast_to_string.snap
new file mode 100644
index 00000000..abf8f3d5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-3
+---
+local x = 1
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/error_display.snap
new file mode 100644
index 00000000..df0ad916
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-3
+---
+error[ast]: trailing commas are not allowed
+  ┌─ source.lua:1:12
+  │
+1 │ local x = 1,
+  │            ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/errors.snap
new file mode 100644
index 00000000..803e6f86
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-assignment-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: trailing commas are not allowed
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/source.lua
new file mode 100644
index 00000000..300b3219
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/source.lua
@@ -0,0 +1 @@
+local x = 1,
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/tokens.snap
new file mode 100644
index 00000000..b93054fc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-3/tokens.snap
@@ -0,0 +1,105 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-assignment-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/ast.snap
new file mode 100644
index 00000000..c2680a6d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-assignment-4
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 1
+      character: 10
+    end_position:
+      bytes: 9
+      line: 1
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/ast_to_string.snap
new file mode 100644
index 00000000..0c38b06a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-4
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/error_display.snap
new file mode 100644
index 00000000..1e8474d9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-4
+---
+error[ast]: expected either a variable name or `function`
+  ┌─ source.lua:1:7
+  │
+1 │ local end
+  │       ^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:7
+  │
+1 │ local end
+  │       ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/errors.snap
new file mode 100644
index 00000000..0986aef8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-assignment-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "expected either a variable name or `function`"
+- AstError:
+    token:
+      start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/source.lua
new file mode 100644
index 00000000..8caefb4e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/source.lua
@@ -0,0 +1 @@
+local end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/tokens.snap
new file mode 100644
index 00000000..75376bb3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-4/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-assignment-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/ast.snap
new file mode 100644
index 00000000..b0996b9e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/ast.snap
@@ -0,0 +1,107 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-assignment-5
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 13
+      line: 1
+      character: 14
+    end_position:
+      bytes: 13
+      line: 1
+      character: 14
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/ast_to_string.snap
new file mode 100644
index 00000000..176d6100
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-5
+---
+"local x = "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/error_display.snap
new file mode 100644
index 00000000..a0e10c78
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-5
+---
+error[ast]: expected an expression
+  ┌─ source.lua:1:9
+  │
+1 │ local x = end
+  │         ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:11
+  │
+1 │ local x = end
+  │           ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/errors.snap
new file mode 100644
index 00000000..24481c2e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-assignment-5
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: expected an expression
+- AstError:
+    token:
+      start_position:
+        bytes: 10
+        line: 1
+        character: 11
+      end_position:
+        bytes: 13
+        line: 1
+        character: 14
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/source.lua
new file mode 100644
index 00000000..3f05e71f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/source.lua
@@ -0,0 +1 @@
+local x = end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/tokens.snap
new file mode 100644
index 00000000..79c63ff5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-5/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-assignment-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/ast.snap
new file mode 100644
index 00000000..c028da36
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/ast.snap
@@ -0,0 +1,218 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 16
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-assignment-6
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          expr_list:
+            pairs: []
+      - ~
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 10
+                line: 2
+                character: 1
+              end_position:
+                bytes: 15
+                line: 2
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 15
+                  line: 2
+                  character: 6
+                end_position:
+                  bytes: 16
+                  line: 2
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 16
+                      line: 2
+                      character: 7
+                    end_position:
+                      bytes: 17
+                      line: 2
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: y
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 17
+                        line: 2
+                        character: 8
+                      end_position:
+                        bytes: 18
+                        line: 2
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 18
+                line: 2
+                character: 9
+              end_position:
+                bytes: 19
+                line: 2
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 19
+                  line: 2
+                  character: 10
+                end_position:
+                  bytes: 20
+                  line: 2
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 20
+                        line: 2
+                        character: 11
+                      end_position:
+                        bytes: 21
+                        line: 2
+                        character: 12
+                      token_type:
+                        type: Number
+                        text: "2"
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 21
+                          line: 2
+                          character: 12
+                        end_position:
+                          bytes: 22
+                          line: 2
+                          character: 12
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 22
+      line: 3
+      character: 1
+    end_position:
+      bytes: 22
+      line: 3
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/ast_to_string.snap
new file mode 100644
index 00000000..f2e679fd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-6
+---
+"local x =\nlocal y = 2\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/error_display.snap
new file mode 100644
index 00000000..5a0551bf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-assignment-6
+---
+error[ast]: expected an expression
+  ┌─ source.lua:1:9
+  │
+1 │ local x =
+  │         ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/errors.snap
new file mode 100644
index 00000000..4cd3d0c4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-assignment-6
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: expected an expression
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/source.lua
new file mode 100644
index 00000000..19f15f41
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/source.lua
@@ -0,0 +1,2 @@
+local x =
+local y = 2
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/tokens.snap
new file mode 100644
index 00000000..f139ed2f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-assignment-6/tokens.snap
@@ -0,0 +1,171 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 28
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-assignment-6
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 15
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 15
+    line: 2
+    character: 6
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 17
+    line: 2
+    character: 8
+  end_position:
+    bytes: 18
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 2
+    character: 9
+  end_position:
+    bytes: 19
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 19
+    line: 2
+    character: 10
+  end_position:
+    bytes: 20
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 2
+    character: 11
+  end_position:
+    bytes: 21
+    line: 2
+    character: 12
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 21
+    line: 2
+    character: 12
+  end_position:
+    bytes: 22
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 22
+    line: 3
+    character: 1
+  end_position:
+    bytes: 22
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/ast.snap
new file mode 100644
index 00000000..8f35e17d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-function-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 14
+      line: 1
+      character: 15
+    end_position:
+      bytes: 14
+      line: 1
+      character: 15
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/ast_to_string.snap
new file mode 100644
index 00000000..8d76b470
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-function-1
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/error_display.snap
new file mode 100644
index 00000000..b0f0828b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-function-1
+---
+error[ast]: expected a function name
+  ┌─ source.lua:1:15
+  │
+1 │ local function
+  │               ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/errors.snap
new file mode 100644
index 00000000..df14f81b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-function-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 1
+        character: 15
+      end_position:
+        bytes: 14
+        line: 1
+        character: 15
+      token_type:
+        type: Eof
+    additional: expected a function name
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/source.lua
new file mode 100644
index 00000000..4ed1c4ee
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/source.lua
@@ -0,0 +1 @@
+local function
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/tokens.snap
new file mode 100644
index 00000000..715bb932
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-function-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/ast.snap
new file mode 100644
index 00000000..b8d987d6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-function-2
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 1
+      character: 17
+    end_position:
+      bytes: 16
+      line: 1
+      character: 17
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/ast_to_string.snap
new file mode 100644
index 00000000..ce98dbbd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-function-2
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/error_display.snap
new file mode 100644
index 00000000..bcac5b4c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-function-2
+---
+error[ast]: expected a function body
+  ┌─ source.lua:1:7
+  │
+1 │ local function x
+  │       ^^^^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/errors.snap
new file mode 100644
index 00000000..deacbda1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-function-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 14
+        line: 1
+        character: 15
+      token_type:
+        type: Symbol
+        symbol: function
+    additional: expected a function body
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/source.lua
new file mode 100644
index 00000000..71294aa3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/source.lua
@@ -0,0 +1 @@
+local function x
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/tokens.snap
new file mode 100644
index 00000000..cbecbfda
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-2/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-function-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/ast.snap
new file mode 100644
index 00000000..a773c2b7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/ast.snap
@@ -0,0 +1,142 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-function-3
+---
+nodes:
+  stmts:
+    - - LocalFunction:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                end_position:
+                  bytes: 15
+                  line: 1
+                  character: 16
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 1
+                character: 16
+              end_position:
+                bytes: 16
+                line: 1
+                character: 17
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia: []
+          body:
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 0
+                      line: 1
+                      character: 1
+                    end_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia: []
+            parameters:
+              pairs: []
+            block:
+              stmts: []
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 17
+      line: 1
+      character: 18
+    end_position:
+      bytes: 17
+      line: 1
+      character: 18
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/ast_to_string.snap
new file mode 100644
index 00000000..dcd065bc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-function-3
+---
+local function x()end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/error_display.snap
new file mode 100644
index 00000000..5869ede9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-function-3
+---
+error[ast]: expected a parameter name or `)`
+  ┌─ source.lua:1:18
+  │
+1 │ local function x(
+  │                  ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/errors.snap
new file mode 100644
index 00000000..9eb9335c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-function-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 17
+        line: 1
+        character: 18
+      token_type:
+        type: Eof
+    additional: "expected a parameter name or `)`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/source.lua
new file mode 100644
index 00000000..77406ec9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/source.lua
@@ -0,0 +1 @@
+local function x(
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/tokens.snap
new file mode 100644
index 00000000..cda81440
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-3/tokens.snap
@@ -0,0 +1,83 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-function-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/ast.snap
new file mode 100644
index 00000000..4a10477c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/ast.snap
@@ -0,0 +1,218 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-function-4
+---
+nodes:
+  stmts:
+    - - LocalFunction:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                end_position:
+                  bytes: 15
+                  line: 1
+                  character: 16
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 1
+                character: 16
+              end_position:
+                bytes: 16
+                line: 1
+                character: 17
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia: []
+          body:
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    end_position:
+                      bytes: 18
+                      line: 1
+                      character: 19
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 18
+                        line: 1
+                        character: 19
+                      end_position:
+                        bytes: 19
+                        line: 1
+                        character: 19
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            parameters:
+              pairs: []
+            block:
+              stmts:
+                - - FunctionCall:
+                      prefix:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 19
+                                line: 2
+                                character: 1
+                              end_position:
+                                bytes: 20
+                                line: 2
+                                character: 2
+                              token_type:
+                                type: Whitespace
+                                characters: "\t"
+                          token:
+                            start_position:
+                              bytes: 20
+                              line: 2
+                              character: 2
+                            end_position:
+                              bytes: 24
+                              line: 2
+                              character: 6
+                            token_type:
+                              type: Identifier
+                              identifier: call
+                          trailing_trivia: []
+                      suffixes:
+                        - Call:
+                            AnonymousCall:
+                              Parentheses:
+                                parentheses:
+                                  tokens:
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 24
+                                          line: 2
+                                          character: 6
+                                        end_position:
+                                          bytes: 25
+                                          line: 2
+                                          character: 7
+                                        token_type:
+                                          type: Symbol
+                                          symbol: (
+                                      trailing_trivia: []
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 25
+                                          line: 2
+                                          character: 7
+                                        end_position:
+                                          bytes: 26
+                                          line: 2
+                                          character: 8
+                                        token_type:
+                                          type: Symbol
+                                          symbol: )
+                                      trailing_trivia: []
+                                arguments:
+                                  pairs: []
+                  - ~
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 26
+      line: 2
+      character: 8
+    end_position:
+      bytes: 26
+      line: 2
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/ast_to_string.snap
new file mode 100644
index 00000000..ac7252d6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-function-4
+---
+"local function x()\n\tcall()end"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/error_display.snap
new file mode 100644
index 00000000..6f3e49e1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-function-4
+---
+error[ast]: expected `end` to close function body block
+  ┌─ source.lua:2:2
+  │
+2 │     call()
+  │     ^^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/errors.snap
new file mode 100644
index 00000000..5af4c8dc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/errors.snap
@@ -0,0 +1,26 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-function-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 26
+        line: 2
+        character: 8
+      end_position:
+        bytes: 26
+        line: 2
+        character: 8
+      token_type:
+        type: Eof
+    additional: "expected `end` to close function body block"
+    range:
+      - bytes: 20
+        line: 2
+        character: 2
+      - bytes: 26
+        line: 2
+        character: 8
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/source.lua
new file mode 100644
index 00000000..331172a3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/source.lua
@@ -0,0 +1,2 @@
+local function x()
+	call()
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/tokens.snap
new file mode 100644
index 00000000..b0627c73
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-4/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-function-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 2
+    character: 1
+  end_position:
+    bytes: 20
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 20
+    line: 2
+    character: 2
+  end_position:
+    bytes: 24
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 24
+    line: 2
+    character: 6
+  end_position:
+    bytes: 25
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 25
+    line: 2
+    character: 7
+  end_position:
+    bytes: 26
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 26
+    line: 2
+    character: 8
+  end_position:
+    bytes: 26
+    line: 2
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/ast.snap
new file mode 100644
index 00000000..0b5cf608
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/ast.snap
@@ -0,0 +1,99 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-function-5
+---
+nodes:
+  stmts:
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia:
+                - start_position:
+                    bytes: 20
+                    line: 2
+                    character: 1
+                  end_position:
+                    bytes: 21
+                    line: 2
+                    character: 2
+                  token_type:
+                    type: Whitespace
+                    characters: "\t"
+              token:
+                start_position:
+                  bytes: 21
+                  line: 2
+                  character: 2
+                end_position:
+                  bytes: 25
+                  line: 2
+                  character: 6
+                token_type:
+                  type: Identifier
+                  identifier: call
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 25
+                              line: 2
+                              character: 6
+                            end_position:
+                              bytes: 26
+                              line: 2
+                              character: 7
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 26
+                              line: 2
+                              character: 7
+                            end_position:
+                              bytes: 27
+                              line: 2
+                              character: 8
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 27
+                                line: 2
+                                character: 8
+                              end_position:
+                                bytes: 28
+                                line: 2
+                                character: 8
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    arguments:
+                      pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 31
+      line: 3
+      character: 4
+    end_position:
+      bytes: 31
+      line: 3
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/ast_to_string.snap
new file mode 100644
index 00000000..de523db4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-function-5
+---
+"\tcall()\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/error_display.snap
new file mode 100644
index 00000000..1dfd6ef6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/error_display.snap
@@ -0,0 +1,25 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-function-5
+---
+error[ast]: expected a function name
+  ┌─ source.lua:1:16
+  │
+1 │ local function do()
+  │                ^^
+
+error[ast]: expected an expression after `(`
+  ┌─ source.lua:1:18
+  │
+1 │ local function do()
+  │                  ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:19
+  │
+1 │ local function do()
+  │                   ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/errors.snap
new file mode 100644
index 00000000..62ba729e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/errors.snap
@@ -0,0 +1,48 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-function-5
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 15
+        line: 1
+        character: 16
+      end_position:
+        bytes: 17
+        line: 1
+        character: 18
+      token_type:
+        type: Symbol
+        symbol: do
+    additional: expected a function name
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 18
+        line: 1
+        character: 19
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected an expression after `(`"
+- AstError:
+    token:
+      start_position:
+        bytes: 18
+        line: 1
+        character: 19
+      end_position:
+        bytes: 19
+        line: 1
+        character: 20
+      token_type:
+        type: Symbol
+        symbol: )
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/source.lua
new file mode 100644
index 00000000..da8ec8e7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/source.lua
@@ -0,0 +1,3 @@
+local function do()
+	call()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/tokens.snap
new file mode 100644
index 00000000..033bdb9e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-5/tokens.snap
@@ -0,0 +1,171 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-function-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 20
+    line: 2
+    character: 1
+  end_position:
+    bytes: 21
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 21
+    line: 2
+    character: 2
+  end_position:
+    bytes: 25
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 25
+    line: 2
+    character: 6
+  end_position:
+    bytes: 26
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 26
+    line: 2
+    character: 7
+  end_position:
+    bytes: 27
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 27
+    line: 2
+    character: 8
+  end_position:
+    bytes: 28
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 28
+    line: 3
+    character: 1
+  end_position:
+    bytes: 31
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 31
+    line: 3
+    character: 4
+  end_position:
+    bytes: 31
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/ast.snap
new file mode 100644
index 00000000..e78329aa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/ast.snap
@@ -0,0 +1,142 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-function-6
+---
+nodes:
+  stmts:
+    - - LocalFunction:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                end_position:
+                  bytes: 15
+                  line: 1
+                  character: 16
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 1
+                character: 16
+              end_position:
+                bytes: 16
+                line: 1
+                character: 17
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia: []
+          body:
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 0
+                      line: 1
+                      character: 1
+                    end_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia: []
+            parameters:
+              pairs: []
+            block:
+              stmts: []
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 25
+      line: 2
+      character: 4
+    end_position:
+      bytes: 25
+      line: 2
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/ast_to_string.snap
new file mode 100644
index 00000000..0c52e3cb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-function-6
+---
+local function x()end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/error_display.snap
new file mode 100644
index 00000000..f975547b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-function-6
+---
+error[ast]: expected a parameter name or `)`
+  ┌─ source.lua:1:18
+  │
+1 │ local function x(,,,)
+  │                  ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:18
+  │
+1 │ local function x(,,,)
+  │                  ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/errors.snap
new file mode 100644
index 00000000..e362a18e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-function-6
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 18
+        line: 1
+        character: 19
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: "expected a parameter name or `)`"
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 18
+        line: 1
+        character: 19
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/source.lua
new file mode 100644
index 00000000..c336e50f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/source.lua
@@ -0,0 +1,2 @@
+local function x(,,,)
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/tokens.snap
new file mode 100644
index 00000000..e9f5a560
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-6/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-function-6
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 22
+    line: 2
+    character: 1
+  end_position:
+    bytes: 25
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 25
+    line: 2
+    character: 4
+  end_position:
+    bytes: 25
+    line: 2
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/ast.snap
new file mode 100644
index 00000000..e7e3d4c8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/ast.snap
@@ -0,0 +1,356 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 16
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/local-function-7
+---
+nodes:
+  stmts:
+    - - LocalFunction:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                end_position:
+                  bytes: 15
+                  line: 1
+                  character: 16
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 1
+                character: 16
+              end_position:
+                bytes: 18
+                line: 1
+                character: 19
+              token_type:
+                type: Identifier
+                identifier: foo
+            trailing_trivia: []
+          body:
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 18
+                      line: 1
+                      character: 19
+                    end_position:
+                      bytes: 19
+                      line: 1
+                      character: 20
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 24
+                      line: 1
+                      character: 25
+                    end_position:
+                      bytes: 25
+                      line: 1
+                      character: 26
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 25
+                        line: 1
+                        character: 26
+                      end_position:
+                        bytes: 26
+                        line: 1
+                        character: 26
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            parameters:
+              pairs:
+                - Punctuated:
+                    - Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 19
+                            line: 1
+                            character: 20
+                          end_position:
+                            bytes: 20
+                            line: 1
+                            character: 21
+                          token_type:
+                            type: Identifier
+                            identifier: x
+                        trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        end_position:
+                          bytes: 21
+                          line: 1
+                          character: 22
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 21
+                            line: 1
+                            character: 22
+                          end_position:
+                            bytes: 22
+                            line: 1
+                            character: 23
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                - End:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 22
+                          line: 1
+                          character: 23
+                        end_position:
+                          bytes: 23
+                          line: 1
+                          character: 24
+                        token_type:
+                          type: Identifier
+                          identifier: y
+                      trailing_trivia: []
+            block:
+              stmts:
+                - - FunctionCall:
+                      prefix:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 26
+                                line: 2
+                                character: 1
+                              end_position:
+                                bytes: 27
+                                line: 2
+                                character: 2
+                              token_type:
+                                type: Whitespace
+                                characters: "\t"
+                          token:
+                            start_position:
+                              bytes: 27
+                              line: 2
+                              character: 2
+                            end_position:
+                              bytes: 32
+                              line: 2
+                              character: 7
+                            token_type:
+                              type: Identifier
+                              identifier: print
+                          trailing_trivia: []
+                      suffixes:
+                        - Call:
+                            AnonymousCall:
+                              Parentheses:
+                                parentheses:
+                                  tokens:
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 32
+                                          line: 2
+                                          character: 7
+                                        end_position:
+                                          bytes: 33
+                                          line: 2
+                                          character: 8
+                                        token_type:
+                                          type: Symbol
+                                          symbol: (
+                                      trailing_trivia: []
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 37
+                                          line: 2
+                                          character: 12
+                                        end_position:
+                                          bytes: 38
+                                          line: 2
+                                          character: 13
+                                        token_type:
+                                          type: Symbol
+                                          symbol: )
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 38
+                                            line: 2
+                                            character: 13
+                                          end_position:
+                                            bytes: 39
+                                            line: 2
+                                            character: 13
+                                          token_type:
+                                            type: Whitespace
+                                            characters: "\n"
+                                arguments:
+                                  pairs:
+                                    - Punctuated:
+                                        - Var:
+                                            Name:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 33
+                                                  line: 2
+                                                  character: 8
+                                                end_position:
+                                                  bytes: 34
+                                                  line: 2
+                                                  character: 9
+                                                token_type:
+                                                  type: Identifier
+                                                  identifier: x
+                                              trailing_trivia: []
+                                        - leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 34
+                                              line: 2
+                                              character: 9
+                                            end_position:
+                                              bytes: 35
+                                              line: 2
+                                              character: 10
+                                            token_type:
+                                              type: Symbol
+                                              symbol: ","
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 35
+                                                line: 2
+                                                character: 10
+                                              end_position:
+                                                bytes: 36
+                                                line: 2
+                                                character: 11
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                    - End:
+                                        Var:
+                                          Name:
+                                            leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 36
+                                                line: 2
+                                                character: 11
+                                              end_position:
+                                                bytes: 37
+                                                line: 2
+                                                character: 12
+                                              token_type:
+                                                type: Identifier
+                                                identifier: y
+                                            trailing_trivia: []
+                  - ~
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 39
+                  line: 3
+                  character: 1
+                end_position:
+                  bytes: 42
+                  line: 3
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia:
+                - start_position:
+                    bytes: 42
+                    line: 3
+                    character: 4
+                  end_position:
+                    bytes: 43
+                    line: 3
+                    character: 4
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 43
+      line: 4
+      character: 1
+    end_position:
+      bytes: 43
+      line: 4
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/ast_to_string.snap
new file mode 100644
index 00000000..1220ccdc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/local-function-7
+---
+"local function foo(x, y)\n\tprint(x, y)\nend\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/error_display.snap
new file mode 100644
index 00000000..5eeef31c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/local-function-7
+---
+error[ast]: trailing commas in arguments are not allowed
+  ┌─ source.lua:1:24
+  │
+1 │ local function foo(x, y,)
+  │                        ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/errors.snap
new file mode 100644
index 00000000..9d5612cc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/local-function-7
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 23
+        line: 1
+        character: 24
+      end_position:
+        bytes: 24
+        line: 1
+        character: 25
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: trailing commas in arguments are not allowed
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/source.lua
new file mode 100644
index 00000000..504b7678
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/source.lua
@@ -0,0 +1,3 @@
+local function foo(x, y,)
+	print(x, y)
+end
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/tokens.snap
new file mode 100644
index 00000000..f7d41dc3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/local-function-7/tokens.snap
@@ -0,0 +1,281 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 28
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/local-function-7
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 26
+    line: 2
+    character: 1
+  end_position:
+    bytes: 27
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 27
+    line: 2
+    character: 2
+  end_position:
+    bytes: 32
+    line: 2
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 32
+    line: 2
+    character: 7
+  end_position:
+    bytes: 33
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 33
+    line: 2
+    character: 8
+  end_position:
+    bytes: 34
+    line: 2
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 34
+    line: 2
+    character: 9
+  end_position:
+    bytes: 35
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 35
+    line: 2
+    character: 10
+  end_position:
+    bytes: 36
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 36
+    line: 2
+    character: 11
+  end_position:
+    bytes: 37
+    line: 2
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 37
+    line: 2
+    character: 12
+  end_position:
+    bytes: 38
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 38
+    line: 2
+    character: 13
+  end_position:
+    bytes: 39
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 39
+    line: 3
+    character: 1
+  end_position:
+    bytes: 42
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 42
+    line: 3
+    character: 4
+  end_position:
+    bytes: 43
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 43
+    line: 4
+    character: 1
+  end_position:
+    bytes: 43
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/ast.snap
new file mode 100644
index 00000000..10cea19b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/ast.snap
@@ -0,0 +1,71 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/method-call-1
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Identifier
+                        identifier: name
+                    trailing_trivia: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 12
+      line: 1
+      character: 13
+    end_position:
+      bytes: 12
+      line: 1
+      character: 13
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/ast_to_string.snap
new file mode 100644
index 00000000..34862c5a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/method-call-1
+---
+return name
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/error_display.snap
new file mode 100644
index 00000000..30fe852b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/method-call-1
+---
+error[ast]: expected identifier after `:`
+  ┌─ source.lua:1:12
+  │
+1 │ return name:
+  │            ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/errors.snap
new file mode 100644
index 00000000..7ec3fb30
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/method-call-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Symbol
+        symbol: ":"
+    additional: "expected identifier after `:`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/source.lua
new file mode 100644
index 00000000..0f7db618
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/source.lua
@@ -0,0 +1 @@
+return name:
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/tokens.snap
new file mode 100644
index 00000000..b8f4c434
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-1/tokens.snap
@@ -0,0 +1,61 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/method-call-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/ast.snap
new file mode 100644
index 00000000..249ed2de
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/ast.snap
@@ -0,0 +1,139 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/method-call-2
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 7
+                          line: 1
+                          character: 8
+                        end_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        token_type:
+                          type: Identifier
+                          identifier: name
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        MethodCall:
+                          colon_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 11
+                                line: 1
+                                character: 12
+                              end_position:
+                                bytes: 12
+                                line: 1
+                                character: 13
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 12
+                                line: 1
+                                character: 13
+                              end_position:
+                                bytes: 18
+                                line: 1
+                                character: 19
+                              token_type:
+                                type: Identifier
+                                identifier: method
+                            trailing_trivia: []
+                          args:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 0
+                                        line: 1
+                                        character: 1
+                                      end_position:
+                                        bytes: 1
+                                        line: 1
+                                        character: 2
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 0
+                                        line: 1
+                                        character: 1
+                                      end_position:
+                                        bytes: 1
+                                        line: 1
+                                        character: 2
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 18
+      line: 1
+      character: 19
+    end_position:
+      bytes: 18
+      line: 1
+      character: 19
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/ast_to_string.snap
new file mode 100644
index 00000000..b2bfc3fc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/method-call-2
+---
+"return name:method()"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/error_display.snap
new file mode 100644
index 00000000..2fbc475f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/method-call-2
+---
+error[ast]: expected arguments after `:`
+  ┌─ source.lua:1:13
+  │
+1 │ return name:method
+  │             ^^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/errors.snap
new file mode 100644
index 00000000..87bf91f9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/method-call-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 12
+        line: 1
+        character: 13
+      end_position:
+        bytes: 18
+        line: 1
+        character: 19
+      token_type:
+        type: Identifier
+        identifier: method
+    additional: "expected arguments after `:`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/source.lua
new file mode 100644
index 00000000..31c24213
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/source.lua
@@ -0,0 +1 @@
+return name:method
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/tokens.snap
new file mode 100644
index 00000000..e27b8bc2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-2/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/method-call-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: method
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/ast.snap
new file mode 100644
index 00000000..9135a802
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/ast.snap
@@ -0,0 +1,139 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/method-call-3
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 7
+                          line: 1
+                          character: 8
+                        end_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        token_type:
+                          type: Identifier
+                          identifier: name
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        MethodCall:
+                          colon_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 11
+                                line: 1
+                                character: 12
+                              end_position:
+                                bytes: 12
+                                line: 1
+                                character: 13
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 12
+                                line: 1
+                                character: 13
+                              end_position:
+                                bytes: 18
+                                line: 1
+                                character: 19
+                              token_type:
+                                type: Identifier
+                                identifier: method
+                            trailing_trivia: []
+                          args:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 18
+                                        line: 1
+                                        character: 19
+                                      end_position:
+                                        bytes: 19
+                                        line: 1
+                                        character: 20
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 0
+                                        line: 1
+                                        character: 1
+                                      end_position:
+                                        bytes: 1
+                                        line: 1
+                                        character: 2
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 25
+      line: 1
+      character: 26
+    end_position:
+      bytes: 25
+      line: 1
+      character: 26
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/ast_to_string.snap
new file mode 100644
index 00000000..753afafe
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/method-call-3
+---
+"return name:method()"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/error_display.snap
new file mode 100644
index 00000000..3d5571a1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/method-call-3
+---
+error[ast]: expected `)` to close function call
+  ┌─ source.lua:1:19
+  │
+1 │ return name:method(until)
+  │                   ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:20
+  │
+1 │ return name:method(until)
+  │                    ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/errors.snap
new file mode 100644
index 00000000..7d92bd96
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/method-call-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 18
+        line: 1
+        character: 19
+      end_position:
+        bytes: 19
+        line: 1
+        character: 20
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected `)` to close function call"
+- AstError:
+    token:
+      start_position:
+        bytes: 19
+        line: 1
+        character: 20
+      end_position:
+        bytes: 24
+        line: 1
+        character: 25
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/source.lua
new file mode 100644
index 00000000..429cba6f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/source.lua
@@ -0,0 +1 @@
+return name:method(until)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/tokens.snap
new file mode 100644
index 00000000..a4b10b3c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/method-call-3/tokens.snap
@@ -0,0 +1,105 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/method-call-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: method
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/ast.snap
new file mode 100644
index 00000000..50bd5002
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/numeric-for-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 5
+      line: 1
+      character: 6
+    end_position:
+      bytes: 5
+      line: 1
+      character: 6
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/ast_to_string.snap
new file mode 100644
index 00000000..363e0414
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-1
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/error_display.snap
new file mode 100644
index 00000000..cdc726b1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-1
+---
+error[ast]: expected `in` after name list
+  ┌─ source.lua:1:6
+  │
+1 │ for x
+  │      ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/errors.snap
new file mode 100644
index 00000000..c2a73d30
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/numeric-for-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 5
+        line: 1
+        character: 6
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Eof
+    additional: "expected `in` after name list"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/source.lua
new file mode 100644
index 00000000..0c7580fb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/source.lua
@@ -0,0 +1 @@
+for x
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/tokens.snap
new file mode 100644
index 00000000..e164a834
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/numeric-for-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/ast.snap
new file mode 100644
index 00000000..547db2e2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/numeric-for-2
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 7
+      line: 1
+      character: 8
+    end_position:
+      bytes: 7
+      line: 1
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/ast_to_string.snap
new file mode 100644
index 00000000..70fc306d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-2
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/error_display.snap
new file mode 100644
index 00000000..f73b49c0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-2
+---
+error[ast]: expected start expression after `=`
+  ┌─ source.lua:1:7
+  │
+1 │ for x =
+  │       ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/errors.snap
new file mode 100644
index 00000000..7204f023
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/numeric-for-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: "expected start expression after `=`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/source.lua
new file mode 100644
index 00000000..1f74b3d4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/source.lua
@@ -0,0 +1 @@
+for x =
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/tokens.snap
new file mode 100644
index 00000000..9e7fbad1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-2/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/numeric-for-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/ast.snap
new file mode 100644
index 00000000..8fed389e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/numeric-for-3
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 1
+      character: 10
+    end_position:
+      bytes: 9
+      line: 1
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/ast_to_string.snap
new file mode 100644
index 00000000..9fb0dbed
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-3
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/error_display.snap
new file mode 100644
index 00000000..92002008
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-3
+---
+error[ast]: expected `,` after start expression
+  ┌─ source.lua:1:10
+  │
+1 │ for x = 1
+  │          ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/errors.snap
new file mode 100644
index 00000000..e82f9db0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/numeric-for-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Eof
+    additional: "expected `,` after start expression"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/source.lua
new file mode 100644
index 00000000..f4d3b123
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/source.lua
@@ -0,0 +1 @@
+for x = 1
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/tokens.snap
new file mode 100644
index 00000000..c8d19ffd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-3/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/numeric-for-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/ast.snap
new file mode 100644
index 00000000..92be5c7f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/ast.snap
@@ -0,0 +1,206 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/numeric-for-4
+---
+nodes:
+  stmts:
+    - - NumericFor:
+          for_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: for
+            trailing_trivia:
+              - start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          index_variable:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 7
+                  line: 1
+                  character: 8
+                end_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          start:
+            Number:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Number
+                  text: "1"
+              trailing_trivia: []
+          start_end_comma:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Symbol
+                symbol: ","
+            trailing_trivia:
+              - start_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                end_position:
+                  bytes: 11
+                  line: 1
+                  character: 12
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          end:
+            Number:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 11
+                  line: 1
+                  character: 12
+                end_position:
+                  bytes: 13
+                  line: 1
+                  character: 14
+                token_type:
+                  type: Number
+                  text: "10"
+              trailing_trivia:
+                - start_position:
+                    bytes: 13
+                    line: 1
+                    character: 14
+                  end_position:
+                    bytes: 14
+                    line: 1
+                    character: 15
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+          end_step_comma: ~
+          step: ~
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 16
+                line: 1
+                character: 17
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 1
+      character: 17
+    end_position:
+      bytes: 16
+      line: 1
+      character: 17
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/ast_to_string.snap
new file mode 100644
index 00000000..395156c0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-4
+---
+"for x = 1, 10 doend"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/error_display.snap
new file mode 100644
index 00000000..d6a94981
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-4
+---
+error[ast]: expected `end` to close numeric for loop block
+  ┌─ source.lua:1:15
+  │
+1 │ for x = 1, 10 do
+  │               ^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/errors.snap
new file mode 100644
index 00000000..5a548ac9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/errors.snap
@@ -0,0 +1,26 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/numeric-for-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 16
+        line: 1
+        character: 17
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: Eof
+    additional: "expected `end` to close numeric for loop block"
+    range:
+      - bytes: 14
+        line: 1
+        character: 15
+      - bytes: 16
+        line: 1
+        character: 17
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/source.lua
new file mode 100644
index 00000000..0d07ab00
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/source.lua
@@ -0,0 +1 @@
+for x = 1, 10 do
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/tokens.snap
new file mode 100644
index 00000000..3e933696
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-4/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/numeric-for-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Number
+    text: "10"
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/ast.snap
new file mode 100644
index 00000000..2ef9e723
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/ast.snap
@@ -0,0 +1,68 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/numeric-for-5
+---
+nodes:
+  stmts:
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 18
+                line: 1
+                character: 19
+              end_position:
+                bytes: 20
+                line: 1
+                character: 21
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 20
+                  line: 1
+                  character: 21
+                end_position:
+                  bytes: 21
+                  line: 1
+                  character: 22
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 21
+                line: 1
+                character: 22
+              end_position:
+                bytes: 24
+                line: 1
+                character: 25
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 24
+      line: 1
+      character: 25
+    end_position:
+      bytes: 24
+      line: 1
+      character: 25
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/ast_to_string.snap
new file mode 100644
index 00000000..bc70ea9e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-5
+---
+do end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/error_display.snap
new file mode 100644
index 00000000..6dd956ac
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/error_display.snap
@@ -0,0 +1,25 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/numeric-for-5
+---
+error[ast]: expected name after `for`
+  ┌─ source.lua:1:1
+  │
+1 │ for local = 1, 10 do end
+  │ ^^^
+
+error[ast]: expected either a variable name or `function`
+  ┌─ source.lua:1:11
+  │
+1 │ for local = 1, 10 do end
+  │           ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:11
+  │
+1 │ for local = 1, 10 do end
+  │           ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/errors.snap
new file mode 100644
index 00000000..b9069091
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/errors.snap
@@ -0,0 +1,48 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/numeric-for-5
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: for
+    additional: "expected name after `for`"
+- AstError:
+    token:
+      start_position:
+        bytes: 10
+        line: 1
+        character: 11
+      end_position:
+        bytes: 11
+        line: 1
+        character: 12
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: "expected either a variable name or `function`"
+- AstError:
+    token:
+      start_position:
+        bytes: 10
+        line: 1
+        character: 11
+      end_position:
+        bytes: 11
+        line: 1
+        character: 12
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/source.lua
new file mode 100644
index 00000000..45af1fab
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/source.lua
@@ -0,0 +1 @@
+for local = 1, 10 do end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/tokens.snap
new file mode 100644
index 00000000..6d0e42a2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/numeric-for-5/tokens.snap
@@ -0,0 +1,171 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/numeric-for-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Number
+    text: "10"
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/ast.snap
new file mode 100644
index 00000000..9a618d3f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/ast.snap
@@ -0,0 +1,54 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/paren-expression-1
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 8
+      line: 1
+      character: 9
+    end_position:
+      bytes: 8
+      line: 1
+      character: 9
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/ast_to_string.snap
new file mode 100644
index 00000000..5f9ff840
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-1
+---
+"return "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/error_display.snap
new file mode 100644
index 00000000..3fbcc487
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-1
+---
+error[ast]: expected an expression after `(`
+  ┌─ source.lua:1:8
+  │
+1 │ return (
+  │        ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/errors.snap
new file mode 100644
index 00000000..94c958e9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/paren-expression-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected an expression after `(`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/source.lua
new file mode 100644
index 00000000..498797ac
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/source.lua
@@ -0,0 +1 @@
+return (
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/tokens.snap
new file mode 100644
index 00000000..17476f3c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/paren-expression-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/ast.snap
new file mode 100644
index 00000000..a1bed510
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/ast.snap
@@ -0,0 +1,143 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/paren-expression-2
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - Punctuated:
+                - Parentheses:
+                    contained:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 7
+                              line: 1
+                              character: 8
+                            end_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 0
+                              line: 1
+                              character: 1
+                            end_position:
+                              bytes: 1
+                              line: 1
+                              character: 2
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    expression:
+                      Number:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          end_position:
+                            bytes: 9
+                            line: 1
+                            character: 10
+                          token_type:
+                            type: Number
+                            text: "3"
+                        trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    end_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Number
+                      text: "4"
+                  trailing_trivia: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 12
+      line: 1
+      character: 13
+    end_position:
+      bytes: 12
+      line: 1
+      character: 13
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/ast_to_string.snap
new file mode 100644
index 00000000..e6a44001
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-2
+---
+"return (3), 4"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/error_display.snap
new file mode 100644
index 00000000..f9bdf548
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-2
+---
+error[ast]: expected `)` after expression
+  ┌─ source.lua:1:10
+  │
+1 │ return (3, 4
+  │          ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/errors.snap
new file mode 100644
index 00000000..87e5d06e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/paren-expression-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: "expected `)` after expression"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/source.lua
new file mode 100644
index 00000000..b60c08d9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/source.lua
@@ -0,0 +1 @@
+return (3, 4
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/tokens.snap
new file mode 100644
index 00000000..055a1c05
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-2/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/paren-expression-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Number
+    text: "4"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/ast.snap
new file mode 100644
index 00000000..2729875c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/ast.snap
@@ -0,0 +1,143 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/paren-expression-3
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - Punctuated:
+                - Parentheses:
+                    contained:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 7
+                              line: 1
+                              character: 8
+                            end_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 0
+                              line: 1
+                              character: 1
+                            end_position:
+                              bytes: 1
+                              line: 1
+                              character: 2
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    expression:
+                      Number:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          end_position:
+                            bytes: 9
+                            line: 1
+                            character: 10
+                          token_type:
+                            type: Number
+                            text: "3"
+                        trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    end_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Number
+                      text: "4"
+                  trailing_trivia: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 13
+      line: 1
+      character: 14
+    end_position:
+      bytes: 13
+      line: 1
+      character: 14
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/ast_to_string.snap
new file mode 100644
index 00000000..38dd977e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-3
+---
+"return (3), 4"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/error_display.snap
new file mode 100644
index 00000000..f71cc90f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-3
+---
+error[ast]: expected `)` after expression
+  ┌─ source.lua:1:10
+  │
+1 │ return (3, 4,
+  │          ^
+
+error[ast]: trailing commas are not allowed
+  ┌─ source.lua:1:13
+  │
+1 │ return (3, 4,
+  │             ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/errors.snap
new file mode 100644
index 00000000..39c04a7b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/paren-expression-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: "expected `)` after expression"
+- AstError:
+    token:
+      start_position:
+        bytes: 12
+        line: 1
+        character: 13
+      end_position:
+        bytes: 13
+        line: 1
+        character: 14
+      token_type:
+        type: Symbol
+        symbol: ","
+    additional: trailing commas are not allowed
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/source.lua
new file mode 100644
index 00000000..2ae24bae
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/source.lua
@@ -0,0 +1 @@
+return (3, 4,
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/tokens.snap
new file mode 100644
index 00000000..d2b2f69d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-3/tokens.snap
@@ -0,0 +1,105 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/paren-expression-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Number
+    text: "4"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/ast.snap
new file mode 100644
index 00000000..81bfc7d2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/ast.snap
@@ -0,0 +1,54 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/paren-expression-4
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 1
+      character: 10
+    end_position:
+      bytes: 9
+      line: 1
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/ast_to_string.snap
new file mode 100644
index 00000000..dfbce515
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-4
+---
+"return "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/error_display.snap
new file mode 100644
index 00000000..0651705c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-4
+---
+error[ast]: expected an expression after `(`
+  ┌─ source.lua:1:8
+  │
+1 │ return ()
+  │        ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:9
+  │
+1 │ return ()
+  │         ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/errors.snap
new file mode 100644
index 00000000..a8953076
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/paren-expression-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected an expression after `(`"
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: )
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/source.lua
new file mode 100644
index 00000000..008b3d5c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/source.lua
@@ -0,0 +1 @@
+return ()
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/tokens.snap
new file mode 100644
index 00000000..52735c2f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-4/tokens.snap
@@ -0,0 +1,61 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/paren-expression-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/ast.snap
new file mode 100644
index 00000000..19f591f1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/ast.snap
@@ -0,0 +1,54 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/paren-expression-5
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 14
+      line: 1
+      character: 15
+    end_position:
+      bytes: 14
+      line: 1
+      character: 15
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/ast_to_string.snap
new file mode 100644
index 00000000..e7b4acaa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-5
+---
+"return "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/error_display.snap
new file mode 100644
index 00000000..f0a08736
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/paren-expression-5
+---
+error[ast]: expected an expression after `(`
+  ┌─ source.lua:1:8
+  │
+1 │ return (until)
+  │        ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:9
+  │
+1 │ return (until)
+  │         ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/errors.snap
new file mode 100644
index 00000000..7d3f5179
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/paren-expression-5
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: (
+    additional: "expected an expression after `(`"
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 13
+        line: 1
+        character: 14
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/source.lua
new file mode 100644
index 00000000..91e91af9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/source.lua
@@ -0,0 +1 @@
+return (until)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/tokens.snap
new file mode 100644
index 00000000..a227c80b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/paren-expression-5/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/paren-expression-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/ast.snap
new file mode 100644
index 00000000..f387c3cd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/ast.snap
@@ -0,0 +1,79 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/repeat-until-1
+---
+nodes:
+  stmts:
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts: []
+          end_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 1
+                  line: 1
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 1
+                line: 2
+                character: 1
+              end_position:
+                bytes: 4
+                line: 2
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 6
+      line: 1
+      character: 7
+    end_position:
+      bytes: 6
+      line: 1
+      character: 7
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/ast_to_string.snap
new file mode 100644
index 00000000..a2fdc432
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/repeat-until-1
+---
+"do\n\nend"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/error_display.snap
new file mode 100644
index 00000000..bbc3c0f3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/repeat-until-1
+---
+error[ast]: expected `until` after block
+  ┌─ source.lua:1:7
+  │
+1 │ repeat
+  │       ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/errors.snap
new file mode 100644
index 00000000..f9d9c706
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/repeat-until-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 6
+        line: 1
+        character: 7
+      token_type:
+        type: Eof
+    additional: "expected `until` after block"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/source.lua
new file mode 100644
index 00000000..04611be2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/source.lua
@@ -0,0 +1 @@
+repeat
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/tokens.snap
new file mode 100644
index 00000000..8bba2cde
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-1/tokens.snap
@@ -0,0 +1,28 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/repeat-until-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: repeat
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/ast.snap
new file mode 100644
index 00000000..49243233
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/ast.snap
@@ -0,0 +1,144 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/repeat-until-2
+---
+nodes:
+  stmts:
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 7
+                              line: 2
+                              character: 1
+                            end_position:
+                              bytes: 8
+                              line: 2
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 8
+                            line: 2
+                            character: 2
+                          end_position:
+                            bytes: 12
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 12
+                                        line: 2
+                                        character: 6
+                                      end_position:
+                                        bytes: 13
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 13
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 14
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+                - ~
+          end_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 1
+                  line: 1
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 1
+                line: 2
+                character: 1
+              end_position:
+                bytes: 4
+                line: 2
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 14
+      line: 2
+      character: 8
+    end_position:
+      bytes: 14
+      line: 2
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/ast_to_string.snap
new file mode 100644
index 00000000..ceaa951c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/repeat-until-2
+---
+"do\n\tcall()\nend"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/error_display.snap
new file mode 100644
index 00000000..df4d7506
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/repeat-until-2
+---
+error[ast]: expected `until` after block
+  ┌─ source.lua:2:8
+  │
+2 │     call()
+  │           ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/errors.snap
new file mode 100644
index 00000000..d3726ae8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/repeat-until-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 2
+        character: 8
+      end_position:
+        bytes: 14
+        line: 2
+        character: 8
+      token_type:
+        type: Eof
+    additional: "expected `until` after block"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/source.lua
new file mode 100644
index 00000000..a263ef25
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/source.lua
@@ -0,0 +1,2 @@
+repeat
+	call()
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/tokens.snap
new file mode 100644
index 00000000..a9c3341e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-2/tokens.snap
@@ -0,0 +1,83 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/repeat-until-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: repeat
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 7
+    line: 2
+    character: 1
+  end_position:
+    bytes: 8
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 8
+    line: 2
+    character: 2
+  end_position:
+    bytes: 12
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 12
+    line: 2
+    character: 6
+  end_position:
+    bytes: 13
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 13
+    line: 2
+    character: 7
+  end_position:
+    bytes: 14
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 2
+    character: 8
+  end_position:
+    bytes: 14
+    line: 2
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/ast.snap
new file mode 100644
index 00000000..1ba3b873
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/ast.snap
@@ -0,0 +1,155 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/repeat-until-3
+---
+nodes:
+  stmts:
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 7
+                              line: 2
+                              character: 1
+                            end_position:
+                              bytes: 8
+                              line: 2
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 8
+                            line: 2
+                            character: 2
+                          end_position:
+                            bytes: 12
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 12
+                                        line: 2
+                                        character: 6
+                                      end_position:
+                                        bytes: 13
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 13
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 14
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 14
+                                          line: 2
+                                          character: 8
+                                        end_position:
+                                          bytes: 15
+                                          line: 2
+                                          character: 8
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs: []
+                - ~
+          end_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 1
+                  line: 1
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 1
+                line: 2
+                character: 1
+              end_position:
+                bytes: 4
+                line: 2
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 20
+      line: 3
+      character: 6
+    end_position:
+      bytes: 20
+      line: 3
+      character: 6
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/ast_to_string.snap
new file mode 100644
index 00000000..1ab5241a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/repeat-until-3
+---
+"do\n\tcall()\n\nend"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/error_display.snap
new file mode 100644
index 00000000..d0769759
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/repeat-until-3
+---
+error[ast]: expected a condition after `until`
+  ┌─ source.lua:3:1
+  │
+3 │ until
+  │ ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/errors.snap
new file mode 100644
index 00000000..babdc5f4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/repeat-until-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 15
+        line: 3
+        character: 1
+      end_position:
+        bytes: 20
+        line: 3
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "expected a condition after `until`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/source.lua
new file mode 100644
index 00000000..e13a9379
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/source.lua
@@ -0,0 +1,3 @@
+repeat
+	call()
+until
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/tokens.snap
new file mode 100644
index 00000000..b9d2db4c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-3/tokens.snap
@@ -0,0 +1,105 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/repeat-until-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: repeat
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 7
+    line: 2
+    character: 1
+  end_position:
+    bytes: 8
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 8
+    line: 2
+    character: 2
+  end_position:
+    bytes: 12
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 12
+    line: 2
+    character: 6
+  end_position:
+    bytes: 13
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 13
+    line: 2
+    character: 7
+  end_position:
+    bytes: 14
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 2
+    character: 8
+  end_position:
+    bytes: 15
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 3
+    character: 1
+  end_position:
+    bytes: 20
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 20
+    line: 3
+    character: 6
+  end_position:
+    bytes: 20
+    line: 3
+    character: 6
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/ast.snap
new file mode 100644
index 00000000..6e35709d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/ast.snap
@@ -0,0 +1,155 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/repeat-until-4
+---
+nodes:
+  stmts:
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 2
+                line: 1
+                character: 3
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 2
+                  line: 1
+                  character: 3
+                end_position:
+                  bytes: 3
+                  line: 1
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 7
+                              line: 2
+                              character: 1
+                            end_position:
+                              bytes: 8
+                              line: 2
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 8
+                            line: 2
+                            character: 2
+                          end_position:
+                            bytes: 12
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 12
+                                        line: 2
+                                        character: 6
+                                      end_position:
+                                        bytes: 13
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 13
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 14
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 14
+                                          line: 2
+                                          character: 8
+                                        end_position:
+                                          bytes: 15
+                                          line: 2
+                                          character: 8
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs: []
+                - ~
+          end_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 1
+                  line: 1
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 1
+                line: 2
+                character: 1
+              end_position:
+                bytes: 4
+                line: 2
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 24
+      line: 3
+      character: 10
+    end_position:
+      bytes: 24
+      line: 3
+      character: 10
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/ast_to_string.snap
new file mode 100644
index 00000000..ee53670a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/repeat-until-4
+---
+"do\n\tcall()\n\nend"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/error_display.snap
new file mode 100644
index 00000000..39b0e166
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/repeat-until-4
+---
+error[ast]: expected a condition after `until`
+  ┌─ source.lua:3:1
+  │
+3 │ until end
+  │ ^^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:3:7
+  │
+3 │ until end
+  │       ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/errors.snap
new file mode 100644
index 00000000..03319562
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/repeat-until-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 15
+        line: 3
+        character: 1
+      end_position:
+        bytes: 20
+        line: 3
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "expected a condition after `until`"
+- AstError:
+    token:
+      start_position:
+        bytes: 21
+        line: 3
+        character: 7
+      end_position:
+        bytes: 24
+        line: 3
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/source.lua
new file mode 100644
index 00000000..56da3c66
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/source.lua
@@ -0,0 +1,3 @@
+repeat
+	call()
+until end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/tokens.snap
new file mode 100644
index 00000000..4195eacb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/repeat-until-4/tokens.snap
@@ -0,0 +1,127 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/repeat-until-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: repeat
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 7
+    line: 2
+    character: 1
+  end_position:
+    bytes: 8
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 8
+    line: 2
+    character: 2
+  end_position:
+    bytes: 12
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 12
+    line: 2
+    character: 6
+  end_position:
+    bytes: 13
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 13
+    line: 2
+    character: 7
+  end_position:
+    bytes: 14
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 2
+    character: 8
+  end_position:
+    bytes: 15
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 3
+    character: 1
+  end_position:
+    bytes: 20
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 20
+    line: 3
+    character: 6
+  end_position:
+    bytes: 21
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 21
+    line: 3
+    character: 7
+  end_position:
+    bytes: 24
+    line: 3
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 24
+    line: 3
+    character: 10
+  end_position:
+    bytes: 24
+    line: 3
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/ast.snap
new file mode 100644
index 00000000..58b9d344
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/ast.snap
@@ -0,0 +1,88 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-1
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 0
+                            line: 1
+                            character: 1
+                          end_position:
+                            bytes: 1
+                            line: 1
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 8
+      line: 1
+      character: 9
+    end_position:
+      bytes: 8
+      line: 1
+      character: 9
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/ast_to_string.snap
new file mode 100644
index 00000000..73f5712f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-1
+---
+"return {}"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/error_display.snap
new file mode 100644
index 00000000..7ad52e5f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-1
+---
+error[ast]: expected a field
+  ┌─ source.lua:1:8
+  │
+1 │ return {
+  │        ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/errors.snap
new file mode 100644
index 00000000..77ace4f1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: "{"
+    additional: expected a field
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/source.lua
new file mode 100644
index 00000000..23e3e4f4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/source.lua
@@ -0,0 +1 @@
+return {
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/tokens.snap
new file mode 100644
index 00000000..e1e72060
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/ast.snap
new file mode 100644
index 00000000..3a606172
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/ast.snap
@@ -0,0 +1,194 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-2
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            end_position:
+                              bytes: 9
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 0
+                            line: 1
+                            character: 1
+                          end_position:
+                            bytes: 1
+                            line: 1
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs:
+                      - Punctuated:
+                          - NameKey:
+                              key:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 9
+                                      line: 2
+                                      character: 1
+                                    end_position:
+                                      bytes: 10
+                                      line: 2
+                                      character: 2
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\t"
+                                token:
+                                  start_position:
+                                    bytes: 10
+                                    line: 2
+                                    character: 2
+                                  end_position:
+                                    bytes: 11
+                                    line: 2
+                                    character: 3
+                                  token_type:
+                                    type: Identifier
+                                    identifier: a
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 11
+                                      line: 2
+                                      character: 3
+                                    end_position:
+                                      bytes: 12
+                                      line: 2
+                                      character: 4
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 12
+                                    line: 2
+                                    character: 4
+                                  end_position:
+                                    bytes: 13
+                                    line: 2
+                                    character: 5
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 13
+                                      line: 2
+                                      character: 5
+                                    end_position:
+                                      bytes: 14
+                                      line: 2
+                                      character: 6
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Number:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 14
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Number
+                                      text: "1"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 15
+                                line: 2
+                                character: 7
+                              end_position:
+                                bytes: 16
+                                line: 2
+                                character: 8
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 2
+      character: 8
+    end_position:
+      bytes: 16
+      line: 2
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/ast_to_string.snap
new file mode 100644
index 00000000..16718b20
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-2
+---
+"return {\n\ta = 1,}"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/error_display.snap
new file mode 100644
index 00000000..0951cb02
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-2
+---
+error[ast]: expected a field
+  ┌─ source.lua:2:6
+  │
+2 │     a = 1,
+  │         ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/errors.snap
new file mode 100644
index 00000000..2f301a96
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 2
+        character: 6
+      end_position:
+        bytes: 15
+        line: 2
+        character: 7
+      token_type:
+        type: Number
+        text: "1"
+    additional: expected a field
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/source.lua
new file mode 100644
index 00000000..99c33b12
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/source.lua
@@ -0,0 +1,2 @@
+return {
+	a = 1,
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/tokens.snap
new file mode 100644
index 00000000..f27fdbae
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-2/tokens.snap
@@ -0,0 +1,138 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 10
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 2
+  end_position:
+    bytes: 11
+    line: 2
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 11
+    line: 2
+    character: 3
+  end_position:
+    bytes: 12
+    line: 2
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 2
+    character: 4
+  end_position:
+    bytes: 13
+    line: 2
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 13
+    line: 2
+    character: 5
+  end_position:
+    bytes: 14
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 2
+    character: 6
+  end_position:
+    bytes: 15
+    line: 2
+    character: 7
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 7
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 16
+    line: 2
+    character: 8
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/ast.snap
new file mode 100644
index 00000000..89fa7152
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/ast.snap
@@ -0,0 +1,99 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-3
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            end_position:
+                              bytes: 9
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 0
+                            line: 1
+                            character: 1
+                          end_position:
+                            bytes: 1
+                            line: 1
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 13
+      line: 2
+      character: 5
+    end_position:
+      bytes: 13
+      line: 2
+      character: 5
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/ast_to_string.snap
new file mode 100644
index 00000000..0748551e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-3
+---
+"return {\n}"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/error_display.snap
new file mode 100644
index 00000000..7608225a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-3
+---
+error[ast]: expected an expression after `=`
+  ┌─ source.lua:2:4
+  │
+2 │     a =
+  │       ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/errors.snap
new file mode 100644
index 00000000..8374a65d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 12
+        line: 2
+        character: 4
+      end_position:
+        bytes: 13
+        line: 2
+        character: 5
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: "expected an expression after `=`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/source.lua
new file mode 100644
index 00000000..f34b20b0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/source.lua
@@ -0,0 +1,2 @@
+return {
+	a =
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/tokens.snap
new file mode 100644
index 00000000..53557b98
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-3/tokens.snap
@@ -0,0 +1,105 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 10
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 2
+  end_position:
+    bytes: 11
+    line: 2
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 11
+    line: 2
+    character: 3
+  end_position:
+    bytes: 12
+    line: 2
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 2
+    character: 4
+  end_position:
+    bytes: 13
+    line: 2
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 13
+    line: 2
+    character: 5
+  end_position:
+    bytes: 13
+    line: 2
+    character: 5
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/ast.snap
new file mode 100644
index 00000000..d96f796a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/ast.snap
@@ -0,0 +1,99 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-4
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            end_position:
+                              bytes: 9
+                              line: 1
+                              character: 10
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 0
+                            line: 1
+                            character: 1
+                          end_position:
+                            bytes: 1
+                            line: 1
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 1
+      character: 17
+    end_position:
+      bytes: 16
+      line: 1
+      character: 17
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/ast_to_string.snap
new file mode 100644
index 00000000..d66c4a49
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-4
+---
+"return { }"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/error_display.snap
new file mode 100644
index 00000000..7b159525
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-4
+---
+error[ast]: expected a field
+  ┌─ source.lua:1:8
+  │
+1 │ return { until }
+  │        ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:10
+  │
+1 │ return { until }
+  │          ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/errors.snap
new file mode 100644
index 00000000..f33beb1a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: "{"
+    additional: expected a field
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 14
+        line: 1
+        character: 15
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/source.lua
new file mode 100644
index 00000000..163261ba
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/source.lua
@@ -0,0 +1 @@
+return { until }
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/tokens.snap
new file mode 100644
index 00000000..b6df8acc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-4/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/ast.snap
new file mode 100644
index 00000000..9cf4e570
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/ast.snap
@@ -0,0 +1,99 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-5
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            end_position:
+                              bytes: 9
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 0
+                            line: 1
+                            character: 1
+                          end_position:
+                            bytes: 1
+                            line: 1
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 22
+      line: 3
+      character: 2
+    end_position:
+      bytes: 22
+      line: 3
+      character: 2
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/ast_to_string.snap
new file mode 100644
index 00000000..3be3249a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-5
+---
+"return {\n}"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/error_display.snap
new file mode 100644
index 00000000..121aee3c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-5
+---
+error[ast]: expected a field
+  ┌─ source.lua:1:8
+  │
+1 │ return {
+  │        ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:2
+  │
+2 │     until = 1,
+  │     ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/errors.snap
new file mode 100644
index 00000000..5d2d3d61
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-5
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Symbol
+        symbol: "{"
+    additional: expected a field
+- AstError:
+    token:
+      start_position:
+        bytes: 10
+        line: 2
+        character: 2
+      end_position:
+        bytes: 15
+        line: 2
+        character: 7
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/source.lua
new file mode 100644
index 00000000..d7ba7765
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/source.lua
@@ -0,0 +1,3 @@
+return {
+	until = 1,
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/tokens.snap
new file mode 100644
index 00000000..58c636e3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-5/tokens.snap
@@ -0,0 +1,160 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 10
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 2
+  end_position:
+    bytes: 15
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 15
+    line: 2
+    character: 7
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 2
+    character: 8
+  end_position:
+    bytes: 17
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 17
+    line: 2
+    character: 9
+  end_position:
+    bytes: 18
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 2
+    character: 10
+  end_position:
+    bytes: 19
+    line: 2
+    character: 11
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 19
+    line: 2
+    character: 11
+  end_position:
+    bytes: 20
+    line: 2
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 20
+    line: 2
+    character: 12
+  end_position:
+    bytes: 21
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 21
+    line: 3
+    character: 1
+  end_position:
+    bytes: 22
+    line: 3
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 22
+    line: 3
+    character: 2
+  end_position:
+    bytes: 22
+    line: 3
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/ast.snap
new file mode 100644
index 00000000..4505fdaf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/ast.snap
@@ -0,0 +1,99 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-6
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            end_position:
+                              bytes: 9
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 0
+                            line: 1
+                            character: 1
+                          end_position:
+                            bytes: 1
+                            line: 1
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 22
+      line: 3
+      character: 2
+    end_position:
+      bytes: 22
+      line: 3
+      character: 2
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/ast_to_string.snap
new file mode 100644
index 00000000..40491c21
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-6
+---
+"return {\n}"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/error_display.snap
new file mode 100644
index 00000000..286e8f6f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-6
+---
+error[ast]: expected an expression after `=`
+  ┌─ source.lua:2:4
+  │
+2 │     x = until,
+  │       ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:6
+  │
+2 │     x = until,
+  │         ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/errors.snap
new file mode 100644
index 00000000..e553ca92
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-6
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 12
+        line: 2
+        character: 4
+      end_position:
+        bytes: 13
+        line: 2
+        character: 5
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: "expected an expression after `=`"
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 2
+        character: 6
+      end_position:
+        bytes: 19
+        line: 2
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/source.lua
new file mode 100644
index 00000000..38575b34
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/source.lua
@@ -0,0 +1,3 @@
+return {
+	x = until,
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/tokens.snap
new file mode 100644
index 00000000..e4e88c08
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-6/tokens.snap
@@ -0,0 +1,160 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-6
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 10
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 2
+  end_position:
+    bytes: 11
+    line: 2
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 11
+    line: 2
+    character: 3
+  end_position:
+    bytes: 12
+    line: 2
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 2
+    character: 4
+  end_position:
+    bytes: 13
+    line: 2
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 13
+    line: 2
+    character: 5
+  end_position:
+    bytes: 14
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 2
+    character: 6
+  end_position:
+    bytes: 19
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 19
+    line: 2
+    character: 11
+  end_position:
+    bytes: 20
+    line: 2
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 20
+    line: 2
+    character: 12
+  end_position:
+    bytes: 21
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 21
+    line: 3
+    character: 1
+  end_position:
+    bytes: 22
+    line: 3
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 22
+    line: 3
+    character: 2
+  end_position:
+    bytes: 22
+    line: 3
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/ast.snap
new file mode 100644
index 00000000..b243fc3c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/ast.snap
@@ -0,0 +1,99 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-7
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            end_position:
+                              bytes: 9
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 0
+                            line: 1
+                            character: 1
+                          end_position:
+                            bytes: 1
+                            line: 1
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 27
+      line: 3
+      character: 2
+    end_position:
+      bytes: 27
+      line: 3
+      character: 2
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/ast_to_string.snap
new file mode 100644
index 00000000..b1cb6feb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-7
+---
+"return {\n}"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/error_display.snap
new file mode 100644
index 00000000..cc620248
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-7
+---
+error[ast]: expected an expression after `[`
+  ┌─ source.lua:2:2
+  │
+2 │     [until] = true,
+  │     ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:3
+  │
+2 │     [until] = true,
+  │      ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/errors.snap
new file mode 100644
index 00000000..b83763dc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-7
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 10
+        line: 2
+        character: 2
+      end_position:
+        bytes: 11
+        line: 2
+        character: 3
+      token_type:
+        type: Symbol
+        symbol: "["
+    additional: "expected an expression after `[`"
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 2
+        character: 3
+      end_position:
+        bytes: 16
+        line: 2
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/source.lua
new file mode 100644
index 00000000..aca8efbf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/source.lua
@@ -0,0 +1,3 @@
+return {
+	[until] = true,
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/tokens.snap
new file mode 100644
index 00000000..2bf7f49d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-7/tokens.snap
@@ -0,0 +1,182 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-7
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 10
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 2
+  end_position:
+    bytes: 11
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 11
+    line: 2
+    character: 3
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 16
+    line: 2
+    character: 8
+  end_position:
+    bytes: 17
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 17
+    line: 2
+    character: 9
+  end_position:
+    bytes: 18
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 2
+    character: 10
+  end_position:
+    bytes: 19
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 19
+    line: 2
+    character: 11
+  end_position:
+    bytes: 20
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 2
+    character: 12
+  end_position:
+    bytes: 24
+    line: 2
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 24
+    line: 2
+    character: 16
+  end_position:
+    bytes: 25
+    line: 2
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 25
+    line: 2
+    character: 17
+  end_position:
+    bytes: 26
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 26
+    line: 3
+    character: 1
+  end_position:
+    bytes: 27
+    line: 3
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 27
+    line: 3
+    character: 2
+  end_position:
+    bytes: 27
+    line: 3
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/ast.snap
new file mode 100644
index 00000000..0f781755
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/ast.snap
@@ -0,0 +1,99 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-8
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            end_position:
+                              bytes: 9
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 0
+                            line: 1
+                            character: 1
+                          end_position:
+                            bytes: 1
+                            line: 1
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 19
+      line: 3
+      character: 2
+    end_position:
+      bytes: 19
+      line: 3
+      character: 2
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/ast_to_string.snap
new file mode 100644
index 00000000..286760f9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-8
+---
+"return {\n}"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/error_display.snap
new file mode 100644
index 00000000..bc85e288
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-8
+---
+error[ast]: expected an expression after `[`
+  ┌─ source.lua:2:2
+  │
+2 │     [] = 1,
+  │     ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:3
+  │
+2 │     [] = 1,
+  │      ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/errors.snap
new file mode 100644
index 00000000..c7358df8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-8
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 10
+        line: 2
+        character: 2
+      end_position:
+        bytes: 11
+        line: 2
+        character: 3
+      token_type:
+        type: Symbol
+        symbol: "["
+    additional: "expected an expression after `[`"
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 2
+        character: 3
+      end_position:
+        bytes: 12
+        line: 2
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: "]"
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/source.lua
new file mode 100644
index 00000000..0f02f728
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/source.lua
@@ -0,0 +1,3 @@
+return {
+	[] = 1,
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/tokens.snap
new file mode 100644
index 00000000..52a39360
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-8/tokens.snap
@@ -0,0 +1,171 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-8
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 10
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 2
+  end_position:
+    bytes: 11
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 11
+    line: 2
+    character: 3
+  end_position:
+    bytes: 12
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 4
+  end_position:
+    bytes: 13
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 2
+    character: 5
+  end_position:
+    bytes: 14
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 14
+    line: 2
+    character: 6
+  end_position:
+    bytes: 15
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 2
+    character: 7
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 8
+  end_position:
+    bytes: 17
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 17
+    line: 2
+    character: 9
+  end_position:
+    bytes: 18
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 18
+    line: 3
+    character: 1
+  end_position:
+    bytes: 19
+    line: 3
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 19
+    line: 3
+    character: 2
+  end_position:
+    bytes: 19
+    line: 3
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/ast.snap
new file mode 100644
index 00000000..9aa867fc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/ast.snap
@@ -0,0 +1,152 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 23
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/table-9
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  TableConstructor:
+                    braces:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 10
+                              line: 1
+                              character: 11
+                            end_position:
+                              bytes: 11
+                              line: 1
+                              character: 12
+                            token_type:
+                              type: Symbol
+                              symbol: "{"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 11
+                                line: 1
+                                character: 12
+                              end_position:
+                                bytes: 12
+                                line: 1
+                                character: 12
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 0
+                              line: 1
+                              character: 1
+                            end_position:
+                              bytes: 1
+                              line: 1
+                              character: 2
+                            token_type:
+                              type: Symbol
+                              symbol: "}"
+                          trailing_trivia: []
+                    fields:
+                      pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 28
+      line: 4
+      character: 1
+    end_position:
+      bytes: 28
+      line: 4
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/ast_to_string.snap
new file mode 100644
index 00000000..f4d3d21b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 28
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/table-9
+---
+"local x = {\n}"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/error_display.snap
new file mode 100644
index 00000000..72573f05
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/table-9
+---
+error[ast]: expected `]` after expression
+  ┌─ source.lua:2:2
+  │
+2 │     [a.b.c = 10,
+  │     ^^^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:9
+  │
+2 │     [a.b.c = 10,
+  │            ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/errors.snap
new file mode 100644
index 00000000..ccf239f3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/errors.snap
@@ -0,0 +1,41 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/table-9
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 20
+        line: 2
+        character: 9
+      end_position:
+        bytes: 21
+        line: 2
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: "expected `]` after expression"
+    range:
+      - bytes: 13
+        line: 2
+        character: 2
+      - bytes: 19
+        line: 2
+        character: 8
+- AstError:
+    token:
+      start_position:
+        bytes: 20
+        line: 2
+        character: 9
+      end_position:
+        bytes: 21
+        line: 2
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/source.lua
new file mode 100644
index 00000000..6542bbab
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/source.lua
@@ -0,0 +1,3 @@
+local x = {
+	[a.b.c = 10,
+}
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/tokens.snap
new file mode 100644
index 00000000..73062431
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/table-9/tokens.snap
@@ -0,0 +1,270 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 68
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/table-9
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 13
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 2
+  end_position:
+    bytes: 14
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 14
+    line: 2
+    character: 3
+  end_position:
+    bytes: 15
+    line: 2
+    character: 4
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 15
+    line: 2
+    character: 4
+  end_position:
+    bytes: 16
+    line: 2
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 16
+    line: 2
+    character: 5
+  end_position:
+    bytes: 17
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 17
+    line: 2
+    character: 6
+  end_position:
+    bytes: 18
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 18
+    line: 2
+    character: 7
+  end_position:
+    bytes: 19
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 19
+    line: 2
+    character: 8
+  end_position:
+    bytes: 20
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 2
+    character: 9
+  end_position:
+    bytes: 21
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 21
+    line: 2
+    character: 10
+  end_position:
+    bytes: 22
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 11
+  end_position:
+    bytes: 24
+    line: 2
+    character: 13
+  token_type:
+    type: Number
+    text: "10"
+- start_position:
+    bytes: 24
+    line: 2
+    character: 13
+  end_position:
+    bytes: 25
+    line: 2
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 25
+    line: 2
+    character: 14
+  end_position:
+    bytes: 26
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 26
+    line: 3
+    character: 1
+  end_position:
+    bytes: 27
+    line: 3
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 27
+    line: 3
+    character: 2
+  end_position:
+    bytes: 28
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 28
+    line: 4
+    character: 1
+  end_position:
+    bytes: 28
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/ast.snap
new file mode 100644
index 00000000..5d28823b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/ast.snap
@@ -0,0 +1,54 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/un-op-1
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 10
+      line: 1
+      character: 11
+    end_position:
+      bytes: 10
+      line: 1
+      character: 11
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/ast_to_string.snap
new file mode 100644
index 00000000..b01c7ca5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/un-op-1
+---
+"return "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/error_display.snap
new file mode 100644
index 00000000..f2790f98
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/un-op-1
+---
+error[ast]: expected an expression after not
+  ┌─ source.lua:1:8
+  │
+1 │ return not
+  │        ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/errors.snap
new file mode 100644
index 00000000..859b418d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/un-op-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: not
+    additional: expected an expression after not
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/source.lua
new file mode 100644
index 00000000..92bfc95a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/source.lua
@@ -0,0 +1 @@
+return not
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/tokens.snap
new file mode 100644
index 00000000..83a4ac56
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/un-op-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: not
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/ast.snap
new file mode 100644
index 00000000..d2570e5f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/ast.snap
@@ -0,0 +1,54 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/un-op-2
+---
+nodes:
+  stmts: []
+  last_stmt:
+    - Return:
+        token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: return
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        returns:
+          pairs: []
+    - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 14
+      line: 1
+      character: 15
+    end_position:
+      bytes: 14
+      line: 1
+      character: 15
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/ast_to_string.snap
new file mode 100644
index 00000000..eecaca40
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/un-op-2
+---
+"return "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/error_display.snap
new file mode 100644
index 00000000..dd20efda
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/un-op-2
+---
+error[ast]: expected an expression after not
+  ┌─ source.lua:1:8
+  │
+1 │ return not end
+  │        ^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:12
+  │
+1 │ return not end
+  │            ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/errors.snap
new file mode 100644
index 00000000..c08fea06
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/un-op-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Symbol
+        symbol: not
+    additional: expected an expression after not
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 14
+        line: 1
+        character: 15
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/source.lua
new file mode 100644
index 00000000..064ff24c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/source.lua
@@ -0,0 +1 @@
+return not end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/tokens.snap
new file mode 100644
index 00000000..db794b31
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/un-op-2/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/un-op-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: not
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/ast.snap
new file mode 100644
index 00000000..6a48f01d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/while-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 5
+      line: 1
+      character: 6
+    end_position:
+      bytes: 5
+      line: 1
+      character: 6
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/ast_to_string.snap
new file mode 100644
index 00000000..18ec32b5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/while-1
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/error_display.snap
new file mode 100644
index 00000000..48e07b49
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/while-1
+---
+error[ast]: expected a condition after `while`
+  ┌─ source.lua:1:1
+  │
+1 │ while
+  │ ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/errors.snap
new file mode 100644
index 00000000..d8515702
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/while-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: while
+    additional: "expected a condition after `while`"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/source.lua
new file mode 100644
index 00000000..2da15dcd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/source.lua
@@ -0,0 +1 @@
+while
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/tokens.snap
new file mode 100644
index 00000000..31d74a44
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-1/tokens.snap
@@ -0,0 +1,28 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/while-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: while
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/ast.snap
new file mode 100644
index 00000000..adaf1c40
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/ast.snap
@@ -0,0 +1,68 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/while-2
+---
+nodes:
+  stmts:
+    - - Do:
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 12
+                line: 1
+                character: 13
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                end_position:
+                  bytes: 15
+                  line: 1
+                  character: 16
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 1
+                character: 16
+              end_position:
+                bytes: 18
+                line: 1
+                character: 19
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 18
+      line: 1
+      character: 19
+    end_position:
+      bytes: 18
+      line: 1
+      character: 19
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/ast_to_string.snap
new file mode 100644
index 00000000..2c8c9bda
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/while-2
+---
+do end
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/error_display.snap
new file mode 100644
index 00000000..e9620dbd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/while-2
+---
+error[ast]: expected a condition after `while`
+  ┌─ source.lua:1:1
+  │
+1 │ while until do end
+  │ ^^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:7
+  │
+1 │ while until do end
+  │       ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/errors.snap
new file mode 100644
index 00000000..b7c0b69f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/while-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: while
+    additional: "expected a condition after `while`"
+- AstError:
+    token:
+      start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 11
+        line: 1
+        character: 12
+      token_type:
+        type: Symbol
+        symbol: until
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/source.lua
new file mode 100644
index 00000000..14f3bb40
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/source.lua
@@ -0,0 +1 @@
+while until do end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/tokens.snap
new file mode 100644
index 00000000..fb92dc20
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-2/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/while-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: while
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/ast.snap
new file mode 100644
index 00000000..b7c92c2e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/ast.snap
@@ -0,0 +1,186 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/while-3
+---
+nodes:
+  stmts:
+    - - While:
+          while_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: while
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          condition:
+            Symbol:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Symbol
+                  symbol: "true"
+              trailing_trivia:
+                - start_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  end_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+          do_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 13
+                line: 1
+                character: 14
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 13
+                  line: 1
+                  character: 14
+                end_position:
+                  bytes: 14
+                  line: 1
+                  character: 14
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 14
+                              line: 2
+                              character: 1
+                            end_position:
+                              bytes: 15
+                              line: 2
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 15
+                            line: 2
+                            character: 2
+                          end_position:
+                            bytes: 19
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 19
+                                        line: 2
+                                        character: 6
+                                      end_position:
+                                        bytes: 20
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 20
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 21
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+                - ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 21
+      line: 2
+      character: 8
+    end_position:
+      bytes: 21
+      line: 2
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/ast_to_string.snap
new file mode 100644
index 00000000..3eadd261
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/while-3
+---
+"while true do\n\tcall()end"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/error_display.snap
new file mode 100644
index 00000000..ded292d9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/while-3
+---
+error[ast]: expected `end` to close while loop block
+  ┌─ source.lua:2:2
+  │
+2 │     call()
+  │     ^^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/errors.snap
new file mode 100644
index 00000000..772a07f7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/errors.snap
@@ -0,0 +1,26 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/while-3
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 21
+        line: 2
+        character: 8
+      end_position:
+        bytes: 21
+        line: 2
+        character: 8
+      token_type:
+        type: Eof
+    additional: "expected `end` to close while loop block"
+    range:
+      - bytes: 15
+        line: 2
+        character: 2
+      - bytes: 21
+        line: 2
+        character: 8
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/source.lua
new file mode 100644
index 00000000..7c04dad3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/source.lua
@@ -0,0 +1,2 @@
+while true do
+	call()
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/tokens.snap
new file mode 100644
index 00000000..c8818f4a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-3/tokens.snap
@@ -0,0 +1,127 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/while-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: while
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 14
+    line: 2
+    character: 1
+  end_position:
+    bytes: 15
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 2
+  end_position:
+    bytes: 19
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 19
+    line: 2
+    character: 6
+  end_position:
+    bytes: 20
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 20
+    line: 2
+    character: 7
+  end_position:
+    bytes: 21
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 21
+    line: 2
+    character: 8
+  end_position:
+    bytes: 21
+    line: 2
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/ast.snap
new file mode 100644
index 00000000..1333b843
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/ast.snap
@@ -0,0 +1,219 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 27
+expression: result.ast
+input_file: full-moon/tests/cases/fail/parser/while-4
+---
+nodes:
+  stmts:
+    - - While:
+          while_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: while
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          condition:
+            Symbol:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Symbol
+                  symbol: "true"
+              trailing_trivia:
+                - start_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  end_position:
+                    bytes: 11
+                    line: 1
+                    character: 11
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+          do_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 1
+                  line: 1
+                  character: 2
+                token_type:
+                  type: Whitespace
+                  characters: " "
+            token:
+              start_position:
+                bytes: 1
+                line: 1
+                character: 2
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: do
+            trailing_trivia:
+              - start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+      - ~
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia:
+                - start_position:
+                    bytes: 11
+                    line: 2
+                    character: 1
+                  end_position:
+                    bytes: 12
+                    line: 2
+                    character: 2
+                  token_type:
+                    type: Whitespace
+                    characters: "\t"
+              token:
+                start_position:
+                  bytes: 12
+                  line: 2
+                  character: 2
+                end_position:
+                  bytes: 16
+                  line: 2
+                  character: 6
+                token_type:
+                  type: Identifier
+                  identifier: call
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 16
+                              line: 2
+                              character: 6
+                            end_position:
+                              bytes: 17
+                              line: 2
+                              character: 7
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 17
+                              line: 2
+                              character: 7
+                            end_position:
+                              bytes: 18
+                              line: 2
+                              character: 8
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 18
+                                line: 2
+                                character: 8
+                              end_position:
+                                bytes: 19
+                                line: 2
+                                character: 8
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    arguments:
+                      pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 22
+      line: 3
+      character: 4
+    end_position:
+      bytes: 22
+      line: 3
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/ast_to_string.snap
new file mode 100644
index 00000000..0879fc7b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 30
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/parser/while-4
+---
+"while true\n do\nend\n\tcall()\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/error_display.snap
new file mode 100644
index 00000000..db15cbd6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/parser/while-4
+---
+error[ast]: expected `do` after condition
+  ┌─ source.lua:2:2
+  │
+2 │     call()
+  │     ^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:3:1
+  │
+3 │ end
+  │ ^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/errors.snap
new file mode 100644
index 00000000..65f22470
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/parser/while-4
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 12
+        line: 2
+        character: 2
+      end_position:
+        bytes: 16
+        line: 2
+        character: 6
+      token_type:
+        type: Identifier
+        identifier: call
+    additional: "expected `do` after condition"
+- AstError:
+    token:
+      start_position:
+        bytes: 19
+        line: 3
+        character: 1
+      end_position:
+        bytes: 22
+        line: 3
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: end
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/source.lua
new file mode 100644
index 00000000..0d39995b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/source.lua
@@ -0,0 +1,3 @@
+while true
+	call()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/tokens.snap
new file mode 100644
index 00000000..26f8e428
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/parser/while-4/tokens.snap
@@ -0,0 +1,127 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/fail/parser/while-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: while
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 1
+  end_position:
+    bytes: 12
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 2
+  end_position:
+    bytes: 16
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 16
+    line: 2
+    character: 6
+  end_position:
+    bytes: 17
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 2
+    character: 7
+  end_position:
+    bytes: 18
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 18
+    line: 2
+    character: 8
+  end_position:
+    bytes: 19
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 3
+    character: 1
+  end_position:
+    bytes: 22
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 22
+    line: 3
+    character: 4
+  end_position:
+    bytes: 22
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/ast.snap
new file mode 100644
index 00000000..b453902a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/ast.snap
@@ -0,0 +1,98 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: result.ast
+input_file: full-moon/tests/cases/fail/tokenizer/bad-numbers-1
+---
+nodes:
+  stmts:
+    - - Assignment:
+          var_list:
+            pairs:
+              - End:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 0
+                        line: 1
+                        character: 1
+                      end_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      token_type:
+                        type: Identifier
+                        identifier: _
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 1
+                          line: 1
+                          character: 2
+                        end_position:
+                          bytes: 2
+                          line: 1
+                          character: 3
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 4
+                        line: 1
+                        character: 5
+                      end_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      token_type:
+                        type: Number
+                        text: 1edoge
+                    trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 10
+      line: 1
+      character: 11
+    end_position:
+      bytes: 10
+      line: 1
+      character: 11
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/ast_to_string.snap
new file mode 100644
index 00000000..62feedb1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 22
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/tokenizer/bad-numbers-1
+---
+_ = 1edoge
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/error_display.snap
new file mode 100644
index 00000000..b61cd582
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/tokenizer/bad-numbers-1
+---
+error[tokenizer]: invalid number (1:5 to 1:11)
+  ┌─ source.lua:1:5
+  │
+1 │ _ = 1edoge
+  │     ^^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/errors.snap
new file mode 100644
index 00000000..0f3c48c8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/errors.snap
@@ -0,0 +1,16 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 15
+expression: result.errors
+input_file: full-moon/tests/cases/fail/tokenizer/bad-numbers-1
+---
+- TokenizerError:
+    error: InvalidNumber
+    range:
+      - bytes: 4
+        line: 1
+        character: 5
+      - bytes: 10
+        line: 1
+        character: 11
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/source.lua
new file mode 100644
index 00000000..56135fcb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/source.lua
@@ -0,0 +1 @@
+_ = 1edoge
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/tokens_result.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/tokens_result.snap
new file mode 100644
index 00000000..b0e88e72
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/bad-numbers-1/tokens_result.snap
@@ -0,0 +1,81 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 42
+expression: tokens
+input_file: full-moon/tests/cases/fail/tokenizer/bad-numbers-1
+---
+Recovered:
+  - - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 1
+        line: 1
+        character: 2
+      token_type:
+        type: Identifier
+        identifier: _
+    - start_position:
+        bytes: 1
+        line: 1
+        character: 2
+      end_position:
+        bytes: 2
+        line: 1
+        character: 3
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 2
+        line: 1
+        character: 3
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: "="
+    - start_position:
+        bytes: 3
+        line: 1
+        character: 4
+      end_position:
+        bytes: 4
+        line: 1
+        character: 5
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 4
+        line: 1
+        character: 5
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Number
+        text: 1edoge
+    - start_position:
+        bytes: 10
+        line: 1
+        character: 11
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Eof
+  - - error: InvalidNumber
+      range:
+        - bytes: 4
+          line: 1
+          character: 5
+        - bytes: 10
+          line: 1
+          character: 11
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/ast.snap
new file mode 100644
index 00000000..2acc2d98
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/ast.snap
@@ -0,0 +1,35 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: result.ast
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-comment-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia:
+    - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 4
+        line: 1
+        character: 5
+      token_type:
+        type: MultiLineComment
+        blocks: 0
+        comment: ""
+  token:
+    start_position:
+      bytes: 4
+      line: 1
+      character: 5
+    end_position:
+      bytes: 4
+      line: 1
+      character: 5
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/ast_to_string.snap
new file mode 100644
index 00000000..2f2e2bc7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 22
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-comment-1
+---
+"--[[]]"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/error_display.snap
new file mode 100644
index 00000000..55c576c7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-comment-1
+---
+error[tokenizer]: unclosed comment (1:1 to 1:5)
+  ┌─ source.lua:1:1
+  │
+1 │ --[[
+  │ ^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/errors.snap
new file mode 100644
index 00000000..d9190a80
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/errors.snap
@@ -0,0 +1,16 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 15
+expression: result.errors
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-comment-1
+---
+- TokenizerError:
+    error: UnclosedComment
+    range:
+      - bytes: 0
+        line: 1
+        character: 1
+      - bytes: 4
+        line: 1
+        character: 5
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/source.lua
new file mode 100644
index 00000000..3238c3ae
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/source.lua
@@ -0,0 +1 @@
+--[[
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/tokens_result.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/tokens_result.snap
new file mode 100644
index 00000000..7fa651a6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-comment-1/tokens_result.snap
@@ -0,0 +1,38 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 42
+expression: tokens
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-comment-1
+---
+Recovered:
+  - - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 4
+        line: 1
+        character: 5
+      token_type:
+        type: MultiLineComment
+        blocks: 0
+        comment: ""
+    - start_position:
+        bytes: 4
+        line: 1
+        character: 5
+      end_position:
+        bytes: 4
+        line: 1
+        character: 5
+      token_type:
+        type: Eof
+  - - error: UnclosedComment
+      range:
+        - bytes: 0
+          line: 1
+          character: 1
+        - bytes: 4
+          line: 1
+          character: 5
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/ast.snap
new file mode 100644
index 00000000..000f9980
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/ast.snap
@@ -0,0 +1,124 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: result.ast
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-1
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  String:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 17
+                      token_type:
+                        type: StringLiteral
+                        literal: hello
+                        quote_type: Double
+                    trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 1
+      character: 17
+    end_position:
+      bytes: 16
+      line: 1
+      character: 17
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/ast_to_string.snap
new file mode 100644
index 00000000..3c4c30da
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 22
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-1
+---
+"local x = \"hello\""
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/error_display.snap
new file mode 100644
index 00000000..a9aee9e1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-1
+---
+error[tokenizer]: unclosed string (1:11 to 1:17)
+  ┌─ source.lua:1:11
+  │
+1 │ local x = "hello
+  │           ^^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/errors.snap
new file mode 100644
index 00000000..3b7b839d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/errors.snap
@@ -0,0 +1,16 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 15
+expression: result.errors
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-1
+---
+- TokenizerError:
+    error: UnclosedString
+    range:
+      - bytes: 10
+        line: 1
+        character: 11
+      - bytes: 16
+        line: 1
+        character: 17
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/source.lua
new file mode 100644
index 00000000..9dca219f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/source.lua
@@ -0,0 +1 @@
+local x = "hello
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/tokens_result.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/tokens_result.snap
new file mode 100644
index 00000000..ca212c39
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-1/tokens_result.snap
@@ -0,0 +1,104 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 42
+expression: tokens
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-1
+---
+Recovered:
+  - - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: local
+    - start_position:
+        bytes: 5
+        line: 1
+        character: 6
+      end_position:
+        bytes: 6
+        line: 1
+        character: 7
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Identifier
+        identifier: x
+    - start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    - start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 10
+        line: 1
+        character: 11
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: StringLiteral
+        literal: hello
+        quote_type: Double
+    - start_position:
+        bytes: 16
+        line: 1
+        character: 17
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: Eof
+  - - error: UnclosedString
+      range:
+        - bytes: 10
+          line: 1
+          character: 11
+        - bytes: 16
+          line: 1
+          character: 17
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/ast.snap
new file mode 100644
index 00000000..364ec714
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/ast.snap
@@ -0,0 +1,124 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: result.ast
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-2
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  String:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 17
+                      token_type:
+                        type: StringLiteral
+                        literal: hello
+                        quote_type: Single
+                    trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 16
+      line: 1
+      character: 17
+    end_position:
+      bytes: 16
+      line: 1
+      character: 17
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/ast_to_string.snap
new file mode 100644
index 00000000..42c8f44f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 22
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-2
+---
+"local x = 'hello'"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/error_display.snap
new file mode 100644
index 00000000..b082d0e2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/error_display.snap
@@ -0,0 +1,13 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-2
+---
+error[tokenizer]: unclosed string (1:11 to 1:17)
+  ┌─ source.lua:1:11
+  │
+1 │ local x = 'hello
+  │           ^^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/errors.snap
new file mode 100644
index 00000000..3a8b885f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/errors.snap
@@ -0,0 +1,16 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 15
+expression: result.errors
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-2
+---
+- TokenizerError:
+    error: UnclosedString
+    range:
+      - bytes: 10
+        line: 1
+        character: 11
+      - bytes: 16
+        line: 1
+        character: 17
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/source.lua
new file mode 100644
index 00000000..c6f7c89c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/source.lua
@@ -0,0 +1 @@
+local x = 'hello
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/tokens_result.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/tokens_result.snap
new file mode 100644
index 00000000..32fb822d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-2/tokens_result.snap
@@ -0,0 +1,104 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 42
+expression: tokens
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-2
+---
+Recovered:
+  - - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: local
+    - start_position:
+        bytes: 5
+        line: 1
+        character: 6
+      end_position:
+        bytes: 6
+        line: 1
+        character: 7
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Identifier
+        identifier: x
+    - start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    - start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 10
+        line: 1
+        character: 11
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: StringLiteral
+        literal: hello
+        quote_type: Single
+    - start_position:
+        bytes: 16
+        line: 1
+        character: 17
+      end_position:
+        bytes: 16
+        line: 1
+        character: 17
+      token_type:
+        type: Eof
+  - - error: UnclosedString
+      range:
+        - bytes: 10
+          line: 1
+          character: 11
+        - bytes: 16
+          line: 1
+          character: 17
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/ast.snap
new file mode 100644
index 00000000..3a413e59
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/ast.snap
@@ -0,0 +1,122 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.ast
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  String:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 23
+                        line: 2
+                        character: 6
+                      token_type:
+                        type: StringLiteral
+                        literal: "hello\nworld"
+                        quote_type: Brackets
+                    trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 23
+      line: 2
+      character: 6
+    end_position:
+      bytes: 23
+      line: 2
+      character: 6
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/ast_to_string.snap
new file mode 100644
index 00000000..d0bd99b2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 22
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-3
+---
+"local x = [[hello\nworld]]"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/error_display.snap
new file mode 100644
index 00000000..6621bcaf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/error_display.snap
@@ -0,0 +1,15 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-3
+---
+error[tokenizer]: unclosed string (1:11 to 2:6)
+  ┌─ source.lua:1:11
+  │  
+1 │   local x = [[hello
+  │ ╭───────────^
+2 │ │ world
+  │ ╰─────^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/errors.snap
new file mode 100644
index 00000000..8abe8a49
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/errors.snap
@@ -0,0 +1,16 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 15
+expression: result.errors
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-3
+---
+- TokenizerError:
+    error: UnclosedString
+    range:
+      - bytes: 10
+        line: 1
+        character: 11
+      - bytes: 23
+        line: 2
+        character: 6
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/source.lua
new file mode 100644
index 00000000..87cc2e0c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/source.lua
@@ -0,0 +1,2 @@
+local x = [[hello
+world
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/tokens_result.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/tokens_result.snap
new file mode 100644
index 00000000..515ed292
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-3/tokens_result.snap
@@ -0,0 +1,102 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+---
+Recovered:
+  - - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: local
+    - start_position:
+        bytes: 5
+        line: 1
+        character: 6
+      end_position:
+        bytes: 6
+        line: 1
+        character: 7
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Identifier
+        identifier: x
+    - start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    - start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 10
+        line: 1
+        character: 11
+      end_position:
+        bytes: 23
+        line: 2
+        character: 6
+      token_type:
+        type: StringLiteral
+        literal: "hello\nworld"
+        quote_type: Brackets
+    - start_position:
+        bytes: 23
+        line: 2
+        character: 6
+      end_position:
+        bytes: 23
+        line: 2
+        character: 6
+      token_type:
+        type: Eof
+  - - error: UnclosedString
+      range:
+        - bytes: 10
+          line: 1
+          character: 11
+        - bytes: 23
+          line: 2
+          character: 6
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/ast.snap
new file mode 100644
index 00000000..ee77f72c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/ast.snap
@@ -0,0 +1,134 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 16
+expression: result.ast
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-4
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 9
+                line: 2
+                character: 1
+              end_position:
+                bytes: 14
+                line: 2
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 14
+                  line: 2
+                  character: 6
+                end_position:
+                  bytes: 15
+                  line: 2
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 15
+                      line: 2
+                      character: 7
+                    end_position:
+                      bytes: 16
+                      line: 2
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 16
+                        line: 2
+                        character: 8
+                      end_position:
+                        bytes: 17
+                        line: 2
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 17
+                line: 2
+                character: 9
+              end_position:
+                bytes: 18
+                line: 2
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 18
+                  line: 2
+                  character: 10
+                end_position:
+                  bytes: 19
+                  line: 2
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 19
+                        line: 2
+                        character: 11
+                      end_position:
+                        bytes: 20
+                        line: 2
+                        character: 12
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 20
+                          line: 2
+                          character: 12
+                        end_position:
+                          bytes: 21
+                          line: 2
+                          character: 12
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 21
+      line: 3
+      character: 1
+    end_position:
+      bytes: 21
+      line: 3
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/ast_to_string.snap
new file mode 100644
index 00000000..ea8fc213
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-4
+---
+"local x = 1\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/error_display.snap
new file mode 100644
index 00000000..8f4a56d8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/error_display.snap
@@ -0,0 +1,21 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-4
+---
+error[tokenizer]: unclosed string (1:1 to 2:1)
+  ┌─ source.lua:1:1
+  │  
+1 │ ╭ "recover
+2 │ │ local x = 1
+  │ ╰^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:1
+  │  
+1 │ ╭ "recover
+2 │ │ local x = 1
+  │ ╰^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/errors.snap
new file mode 100644
index 00000000..3e25c8d0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/errors.snap
@@ -0,0 +1,30 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-4
+---
+- TokenizerError:
+    error: UnclosedString
+    range:
+      - bytes: 0
+        line: 1
+        character: 1
+      - bytes: 9
+        line: 2
+        character: 1
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 9
+        line: 2
+        character: 1
+      token_type:
+        type: StringLiteral
+        literal: recover
+        quote_type: Double
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/source.lua
new file mode 100644
index 00000000..743fa914
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/source.lua
@@ -0,0 +1,2 @@
+"recover
+local x = 1
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/tokens_result.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/tokens_result.snap
new file mode 100644
index 00000000..be8a9872
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unclosed-string-4/tokens_result.snap
@@ -0,0 +1,126 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 42
+expression: tokens
+input_file: full-moon/tests/cases/fail/tokenizer/unclosed-string-4
+---
+Recovered:
+  - - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 9
+        line: 2
+        character: 1
+      token_type:
+        type: StringLiteral
+        literal: recover
+        quote_type: Double
+    - start_position:
+        bytes: 9
+        line: 2
+        character: 1
+      end_position:
+        bytes: 14
+        line: 2
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: local
+    - start_position:
+        bytes: 14
+        line: 2
+        character: 6
+      end_position:
+        bytes: 15
+        line: 2
+        character: 7
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 15
+        line: 2
+        character: 7
+      end_position:
+        bytes: 16
+        line: 2
+        character: 8
+      token_type:
+        type: Identifier
+        identifier: x
+    - start_position:
+        bytes: 16
+        line: 2
+        character: 8
+      end_position:
+        bytes: 17
+        line: 2
+        character: 9
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 17
+        line: 2
+        character: 9
+      end_position:
+        bytes: 18
+        line: 2
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    - start_position:
+        bytes: 18
+        line: 2
+        character: 10
+      end_position:
+        bytes: 19
+        line: 2
+        character: 11
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 19
+        line: 2
+        character: 11
+      end_position:
+        bytes: 20
+        line: 2
+        character: 12
+      token_type:
+        type: Number
+        text: "1"
+    - start_position:
+        bytes: 20
+        line: 2
+        character: 12
+      end_position:
+        bytes: 21
+        line: 2
+        character: 12
+      token_type:
+        type: Whitespace
+        characters: "\n"
+    - start_position:
+        bytes: 21
+        line: 3
+        character: 1
+      end_position:
+        bytes: 21
+        line: 3
+        character: 1
+      token_type:
+        type: Eof
+  - - error: UnclosedString
+      range:
+        - bytes: 0
+          line: 1
+          character: 1
+        - bytes: 9
+          line: 2
+          character: 1
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/ast.snap
new file mode 100644
index 00000000..1c975d69
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/ast.snap
@@ -0,0 +1,107 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: result.ast
+input_file: full-moon/tests/cases/fail/tokenizer/unexpected-character
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 14
+      line: 1
+      character: 12
+    end_position:
+      bytes: 14
+      line: 1
+      character: 12
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/ast_to_string.snap
new file mode 100644
index 00000000..8278fb83
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 22
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/tokenizer/unexpected-character
+---
+"local x = "
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/error_display.snap
new file mode 100644
index 00000000..651118bb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/tokenizer/unexpected-character
+---
+error[ast]: expected an expression
+  ┌─ source.lua:1:9
+  │
+1 │ local x = 🤔
+  │         ^
+
+error[tokenizer]: unexpected character 🤔 (1:11 to 1:12)
+  ┌─ source.lua:1:11
+  │
+1 │ local x = 🤔
+  │           ^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/errors.snap
new file mode 100644
index 00000000..3c99633f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/errors.snap
@@ -0,0 +1,30 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/tokenizer/unexpected-character
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: expected an expression
+- TokenizerError:
+    error:
+      UnexpectedToken: 🤔
+    range:
+      - bytes: 10
+        line: 1
+        character: 11
+      - bytes: 14
+        line: 1
+        character: 12
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/source.lua
new file mode 100644
index 00000000..e02637d2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/source.lua
@@ -0,0 +1 @@
+local x = 🤔
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/tokens_result.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/tokens_result.snap
new file mode 100644
index 00000000..b7d68acf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/unexpected-character/tokens_result.snap
@@ -0,0 +1,93 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 42
+expression: tokens
+input_file: full-moon/tests/cases/fail/tokenizer/unexpected-character
+---
+Recovered:
+  - - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 5
+        line: 1
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: local
+    - start_position:
+        bytes: 5
+        line: 1
+        character: 6
+      end_position:
+        bytes: 6
+        line: 1
+        character: 7
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 6
+        line: 1
+        character: 7
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Identifier
+        identifier: x
+    - start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 8
+        line: 1
+        character: 9
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 8
+        line: 1
+        character: 9
+      end_position:
+        bytes: 9
+        line: 1
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: "="
+    - start_position:
+        bytes: 9
+        line: 1
+        character: 10
+      end_position:
+        bytes: 10
+        line: 1
+        character: 11
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 14
+        line: 1
+        character: 12
+      end_position:
+        bytes: 14
+        line: 1
+        character: 12
+      token_type:
+        type: Eof
+  - - error:
+        UnexpectedToken: 🤔
+      range:
+        - bytes: 10
+          line: 1
+          character: 11
+        - bytes: 14
+          line: 1
+          character: 12
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/ast.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/ast.snap
new file mode 100644
index 00000000..8e9236e8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/ast.snap
@@ -0,0 +1,129 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 19
+expression: result.ast
+input_file: full-moon/tests/cases/fail/tokenizer/wrong-place-shebang
+---
+nodes:
+  stmts:
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia:
+                - start_position:
+                    bytes: 23
+                    line: 3
+                    character: 1
+                  end_position:
+                    bytes: 24
+                    line: 3
+                    character: 1
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+              token:
+                start_position:
+                  bytes: 24
+                  line: 4
+                  character: 1
+                end_position:
+                  bytes: 29
+                  line: 4
+                  character: 6
+                token_type:
+                  type: Identifier
+                  identifier: print
+              trailing_trivia: []
+          suffixes:
+            - Call:
+                AnonymousCall:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 29
+                              line: 4
+                              character: 6
+                            end_position:
+                              bytes: 30
+                              line: 4
+                              character: 7
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 37
+                              line: 4
+                              character: 14
+                            end_position:
+                              bytes: 38
+                              line: 4
+                              character: 15
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    arguments:
+                      pairs:
+                        - End:
+                            String:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 30
+                                  line: 4
+                                  character: 7
+                                end_position:
+                                  bytes: 37
+                                  line: 4
+                                  character: 14
+                                token_type:
+                                  type: StringLiteral
+                                  literal: hello
+                                  quote_type: Double
+                              trailing_trivia: []
+      - leading_trivia: []
+        token:
+          start_position:
+            bytes: 38
+            line: 4
+            character: 15
+          end_position:
+            bytes: 39
+            line: 4
+            character: 16
+          token_type:
+            type: Symbol
+            symbol: ;
+        trailing_trivia:
+          - start_position:
+              bytes: 39
+              line: 4
+              character: 16
+            end_position:
+              bytes: 40
+              line: 4
+              character: 16
+            token_type:
+              type: Whitespace
+              characters: "\n"
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 40
+      line: 5
+      character: 1
+    end_position:
+      bytes: 40
+      line: 5
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/ast_to_string.snap
new file mode 100644
index 00000000..618ae30a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 22
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/cases/fail/tokenizer/wrong-place-shebang
+---
+"\nprint(\"hello\");\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/error_display.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/error_display.snap
new file mode 100644
index 00000000..bf153f55
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/error_display.snap
@@ -0,0 +1,61 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/cases/fail/tokenizer/wrong-place-shebang
+---
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:1
+  │
+2 │ #!/usr/bin/env luajit
+  │ ^
+
+error[tokenizer]: unexpected character ! (2:2 to 2:3)
+  ┌─ source.lua:2:2
+  │
+2 │ #!/usr/bin/env luajit
+  │  ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:3
+  │
+2 │ #!/usr/bin/env luajit
+  │   ^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:2:7
+  │
+2 │ #!/usr/bin/env luajit
+  │       ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:7
+  │
+2 │ #!/usr/bin/env luajit
+  │       ^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:2:11
+  │
+2 │ #!/usr/bin/env luajit
+  │           ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:11
+  │
+2 │ #!/usr/bin/env luajit
+  │           ^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:2:16
+  │
+2 │ #!/usr/bin/env luajit
+  │                ^^^^^^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:4:1
+  │
+4 │ print("hello");
+  │ ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/errors.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/errors.snap
new file mode 100644
index 00000000..e4ebedfe
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/errors.snap
@@ -0,0 +1,128 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/cases/fail/tokenizer/wrong-place-shebang
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 1
+        line: 2
+        character: 1
+      end_position:
+        bytes: 2
+        line: 2
+        character: 2
+      token_type:
+        type: Symbol
+        symbol: "#"
+    additional: "unexpected token, this needs to be a statement"
+- TokenizerError:
+    error:
+      UnexpectedToken: "!"
+    range:
+      - bytes: 2
+        line: 2
+        character: 2
+      - bytes: 3
+        line: 2
+        character: 3
+- AstError:
+    token:
+      start_position:
+        bytes: 3
+        line: 2
+        character: 3
+      end_position:
+        bytes: 4
+        line: 2
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: /
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 2
+        character: 7
+      end_position:
+        bytes: 8
+        line: 2
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: /
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 2
+        character: 7
+      end_position:
+        bytes: 8
+        line: 2
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: /
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 2
+        character: 11
+      end_position:
+        bytes: 12
+        line: 2
+        character: 12
+      token_type:
+        type: Symbol
+        symbol: /
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 2
+        character: 11
+      end_position:
+        bytes: 12
+        line: 2
+        character: 12
+      token_type:
+        type: Symbol
+        symbol: /
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 16
+        line: 2
+        character: 16
+      end_position:
+        bytes: 22
+        line: 2
+        character: 22
+      token_type:
+        type: Identifier
+        identifier: luajit
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 24
+        line: 4
+        character: 1
+      end_position:
+        bytes: 29
+        line: 4
+        character: 6
+      token_type:
+        type: Identifier
+        identifier: print
+    additional: unexpected expression when looking for a statement
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/source.lua b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/source.lua
new file mode 100644
index 00000000..5bd6f605
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/source.lua
@@ -0,0 +1,4 @@
+
+#!/usr/bin/env luajit
+
+print("hello");
diff --git a/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/tokens_result.snap b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/tokens_result.snap
new file mode 100644
index 00000000..57db51e3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/fail/tokenizer/wrong-place-shebang/tokens_result.snap
@@ -0,0 +1,226 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 42
+expression: tokens
+input_file: full-moon/tests/cases/fail/tokenizer/wrong-place-shebang
+---
+Recovered:
+  - - start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 1
+        line: 1
+        character: 1
+      token_type:
+        type: Whitespace
+        characters: "\n"
+    - start_position:
+        bytes: 1
+        line: 2
+        character: 1
+      end_position:
+        bytes: 2
+        line: 2
+        character: 2
+      token_type:
+        type: Symbol
+        symbol: "#"
+    - start_position:
+        bytes: 3
+        line: 2
+        character: 3
+      end_position:
+        bytes: 4
+        line: 2
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: /
+    - start_position:
+        bytes: 4
+        line: 2
+        character: 4
+      end_position:
+        bytes: 7
+        line: 2
+        character: 7
+      token_type:
+        type: Identifier
+        identifier: usr
+    - start_position:
+        bytes: 7
+        line: 2
+        character: 7
+      end_position:
+        bytes: 8
+        line: 2
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: /
+    - start_position:
+        bytes: 8
+        line: 2
+        character: 8
+      end_position:
+        bytes: 11
+        line: 2
+        character: 11
+      token_type:
+        type: Identifier
+        identifier: bin
+    - start_position:
+        bytes: 11
+        line: 2
+        character: 11
+      end_position:
+        bytes: 12
+        line: 2
+        character: 12
+      token_type:
+        type: Symbol
+        symbol: /
+    - start_position:
+        bytes: 12
+        line: 2
+        character: 12
+      end_position:
+        bytes: 15
+        line: 2
+        character: 15
+      token_type:
+        type: Identifier
+        identifier: env
+    - start_position:
+        bytes: 15
+        line: 2
+        character: 15
+      end_position:
+        bytes: 16
+        line: 2
+        character: 16
+      token_type:
+        type: Whitespace
+        characters: " "
+    - start_position:
+        bytes: 16
+        line: 2
+        character: 16
+      end_position:
+        bytes: 22
+        line: 2
+        character: 22
+      token_type:
+        type: Identifier
+        identifier: luajit
+    - start_position:
+        bytes: 22
+        line: 2
+        character: 22
+      end_position:
+        bytes: 23
+        line: 2
+        character: 22
+      token_type:
+        type: Whitespace
+        characters: "\n"
+    - start_position:
+        bytes: 23
+        line: 3
+        character: 1
+      end_position:
+        bytes: 24
+        line: 3
+        character: 1
+      token_type:
+        type: Whitespace
+        characters: "\n"
+    - start_position:
+        bytes: 24
+        line: 4
+        character: 1
+      end_position:
+        bytes: 29
+        line: 4
+        character: 6
+      token_type:
+        type: Identifier
+        identifier: print
+    - start_position:
+        bytes: 29
+        line: 4
+        character: 6
+      end_position:
+        bytes: 30
+        line: 4
+        character: 7
+      token_type:
+        type: Symbol
+        symbol: (
+    - start_position:
+        bytes: 30
+        line: 4
+        character: 7
+      end_position:
+        bytes: 37
+        line: 4
+        character: 14
+      token_type:
+        type: StringLiteral
+        literal: hello
+        quote_type: Double
+    - start_position:
+        bytes: 37
+        line: 4
+        character: 14
+      end_position:
+        bytes: 38
+        line: 4
+        character: 15
+      token_type:
+        type: Symbol
+        symbol: )
+    - start_position:
+        bytes: 38
+        line: 4
+        character: 15
+      end_position:
+        bytes: 39
+        line: 4
+        character: 16
+      token_type:
+        type: Symbol
+        symbol: ;
+    - start_position:
+        bytes: 39
+        line: 4
+        character: 16
+      end_position:
+        bytes: 40
+        line: 4
+        character: 16
+      token_type:
+        type: Whitespace
+        characters: "\n"
+    - start_position:
+        bytes: 40
+        line: 5
+        character: 1
+      end_position:
+        bytes: 40
+        line: 5
+        character: 1
+      token_type:
+        type: Eof
+  - - error:
+        UnexpectedToken: "!"
+      range:
+        - bytes: 2
+          line: 2
+          character: 2
+        - bytes: 3
+          line: 2
+          character: 3
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/ast.snap
new file mode 100644
index 00000000..09ba8f19
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/ast.snap
@@ -0,0 +1,271 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/anonymous-functions-1
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Function:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 18
+                        line: 1
+                        character: 19
+                      token_type:
+                        type: Symbol
+                        symbol: function
+                    trailing_trivia: []
+                  - parameters_parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 18
+                              line: 1
+                              character: 19
+                            end_position:
+                              bytes: 19
+                              line: 1
+                              character: 20
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 19
+                              line: 1
+                              character: 20
+                            end_position:
+                              bytes: 20
+                              line: 1
+                              character: 21
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 20
+                                line: 1
+                                character: 21
+                              end_position:
+                                bytes: 21
+                                line: 1
+                                character: 21
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    parameters:
+                      pairs: []
+                    block:
+                      stmts:
+                        - - FunctionCall:
+                              prefix:
+                                Name:
+                                  leading_trivia:
+                                    - start_position:
+                                        bytes: 21
+                                        line: 2
+                                        character: 1
+                                      end_position:
+                                        bytes: 22
+                                        line: 2
+                                        character: 2
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\t"
+                                  token:
+                                    start_position:
+                                      bytes: 22
+                                      line: 2
+                                      character: 2
+                                    end_position:
+                                      bytes: 26
+                                      line: 2
+                                      character: 6
+                                    token_type:
+                                      type: Identifier
+                                      identifier: call
+                                  trailing_trivia: []
+                              suffixes:
+                                - Call:
+                                    AnonymousCall:
+                                      Parentheses:
+                                        parentheses:
+                                          tokens:
+                                            - leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 26
+                                                  line: 2
+                                                  character: 6
+                                                end_position:
+                                                  bytes: 27
+                                                  line: 2
+                                                  character: 7
+                                                token_type:
+                                                  type: Symbol
+                                                  symbol: (
+                                              trailing_trivia: []
+                                            - leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 28
+                                                  line: 2
+                                                  character: 8
+                                                end_position:
+                                                  bytes: 29
+                                                  line: 2
+                                                  character: 9
+                                                token_type:
+                                                  type: Symbol
+                                                  symbol: )
+                                              trailing_trivia:
+                                                - start_position:
+                                                    bytes: 29
+                                                    line: 2
+                                                    character: 9
+                                                  end_position:
+                                                    bytes: 30
+                                                    line: 2
+                                                    character: 9
+                                                  token_type:
+                                                    type: Whitespace
+                                                    characters: "\n"
+                                        arguments:
+                                          pairs:
+                                            - End:
+                                                Number:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 27
+                                                      line: 2
+                                                      character: 7
+                                                    end_position:
+                                                      bytes: 28
+                                                      line: 2
+                                                      character: 8
+                                                    token_type:
+                                                      type: Number
+                                                      text: "1"
+                                                  trailing_trivia: []
+                          - ~
+                    end_token:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 30
+                          line: 3
+                          character: 1
+                        end_position:
+                          bytes: 33
+                          line: 3
+                          character: 4
+                        token_type:
+                          type: Symbol
+                          symbol: end
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 33
+                            line: 3
+                            character: 4
+                          end_position:
+                            bytes: 34
+                            line: 3
+                            character: 4
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/source.lua
new file mode 100644
index 00000000..ddc145a2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/source.lua
@@ -0,0 +1,3 @@
+local x = function()
+	call(1)
+end
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/tokens.snap
new file mode 100644
index 00000000..00d3ace0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-1/tokens.snap
@@ -0,0 +1,215 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/anonymous-functions-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 21
+    line: 2
+    character: 1
+  end_position:
+    bytes: 22
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 22
+    line: 2
+    character: 2
+  end_position:
+    bytes: 26
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 26
+    line: 2
+    character: 6
+  end_position:
+    bytes: 27
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 27
+    line: 2
+    character: 7
+  end_position:
+    bytes: 28
+    line: 2
+    character: 8
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 28
+    line: 2
+    character: 8
+  end_position:
+    bytes: 29
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 29
+    line: 2
+    character: 9
+  end_position:
+    bytes: 30
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 30
+    line: 3
+    character: 1
+  end_position:
+    bytes: 33
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 33
+    line: 3
+    character: 4
+  end_position:
+    bytes: 34
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 34
+    line: 4
+    character: 1
+  end_position:
+    bytes: 34
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/ast.snap
new file mode 100644
index 00000000..7d5f1582
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/ast.snap
@@ -0,0 +1,232 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 48
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/anonymous-functions-2
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          end_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 31
+                            line: 3
+                            character: 4
+                          end_position:
+                            bytes: 32
+                            line: 3
+                            character: 5
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          Function:
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 5
+                                  line: 1
+                                  character: 6
+                                end_position:
+                                  bytes: 13
+                                  line: 1
+                                  character: 14
+                                token_type:
+                                  type: Symbol
+                                  symbol: function
+                              trailing_trivia: []
+                            - generics: ~
+                              parameters_parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 13
+                                        line: 1
+                                        character: 14
+                                      end_position:
+                                        bytes: 14
+                                        line: 1
+                                        character: 15
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 14
+                                        line: 1
+                                        character: 15
+                                      end_position:
+                                        bytes: 15
+                                        line: 1
+                                        character: 16
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 15
+                                          line: 1
+                                          character: 16
+                                        end_position:
+                                          bytes: 16
+                                          line: 1
+                                          character: 16
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              parameters:
+                                pairs: []
+                              type_specifiers: []
+                              block:
+                                stmts:
+                                  - - FunctionCall:
+                                        prefix:
+                                          Name:
+                                            leading_trivia:
+                                              - start_position:
+                                                  bytes: 16
+                                                  line: 2
+                                                  character: 1
+                                                end_position:
+                                                  bytes: 17
+                                                  line: 2
+                                                  character: 2
+                                                token_type:
+                                                  type: Whitespace
+                                                  characters: "\t"
+                                            token:
+                                              start_position:
+                                                bytes: 17
+                                                line: 2
+                                                character: 2
+                                              end_position:
+                                                bytes: 20
+                                                line: 2
+                                                character: 5
+                                              token_type:
+                                                type: Identifier
+                                                identifier: foo
+                                            trailing_trivia: []
+                                        suffixes:
+                                          - Call:
+                                              AnonymousCall:
+                                                Parentheses:
+                                                  parentheses:
+                                                    tokens:
+                                                      - leading_trivia: []
+                                                        token:
+                                                          start_position:
+                                                            bytes: 20
+                                                            line: 2
+                                                            character: 5
+                                                          end_position:
+                                                            bytes: 21
+                                                            line: 2
+                                                            character: 6
+                                                          token_type:
+                                                            type: Symbol
+                                                            symbol: (
+                                                        trailing_trivia: []
+                                                      - leading_trivia: []
+                                                        token:
+                                                          start_position:
+                                                            bytes: 26
+                                                            line: 2
+                                                            character: 11
+                                                          end_position:
+                                                            bytes: 27
+                                                            line: 2
+                                                            character: 12
+                                                          token_type:
+                                                            type: Symbol
+                                                            symbol: )
+                                                        trailing_trivia:
+                                                          - start_position:
+                                                              bytes: 27
+                                                              line: 2
+                                                              character: 12
+                                                            end_position:
+                                                              bytes: 28
+                                                              line: 2
+                                                              character: 12
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: "\n"
+                                                  arguments:
+                                                    pairs:
+                                                      - End:
+                                                          String:
+                                                            leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 21
+                                                                line: 2
+                                                                character: 6
+                                                              end_position:
+                                                                bytes: 26
+                                                                line: 2
+                                                                character: 11
+                                                              token_type:
+                                                                type: StringLiteral
+                                                                literal: bar
+                                                                quote_type: Double
+                                                            trailing_trivia: []
+                                    - ~
+                              end_token:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 28
+                                    line: 3
+                                    character: 1
+                                  end_position:
+                                    bytes: 31
+                                    line: 3
+                                    character: 4
+                                  token_type:
+                                    type: Symbol
+                                    symbol: end
+                                trailing_trivia: []
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/source.lua
new file mode 100644
index 00000000..20df3976
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/source.lua
@@ -0,0 +1,3 @@
+call(function()
+	foo("bar")
+end)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/tokens.snap
new file mode 100644
index 00000000..731b6583
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-2/tokens.snap
@@ -0,0 +1,172 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/anonymous-functions-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 1
+  end_position:
+    bytes: 17
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 17
+    line: 2
+    character: 2
+  end_position:
+    bytes: 20
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 20
+    line: 2
+    character: 5
+  end_position:
+    bytes: 21
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 21
+    line: 2
+    character: 6
+  end_position:
+    bytes: 26
+    line: 2
+    character: 11
+  token_type:
+    type: StringLiteral
+    literal: bar
+    quote_type: Double
+- start_position:
+    bytes: 26
+    line: 2
+    character: 11
+  end_position:
+    bytes: 27
+    line: 2
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 27
+    line: 2
+    character: 12
+  end_position:
+    bytes: 28
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 28
+    line: 3
+    character: 1
+  end_position:
+    bytes: 31
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 31
+    line: 3
+    character: 4
+  end_position:
+    bytes: 32
+    line: 3
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 32
+    line: 3
+    character: 5
+  end_position:
+    bytes: 32
+    line: 3
+    character: 5
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/ast.snap
new file mode 100644
index 00000000..0db3a00b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/ast.snap
@@ -0,0 +1,184 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/anonymous-functions-3
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Function:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 18
+                        line: 1
+                        character: 19
+                      token_type:
+                        type: Symbol
+                        symbol: function
+                    trailing_trivia: []
+                  - parameters_parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 18
+                              line: 1
+                              character: 19
+                            end_position:
+                              bytes: 19
+                              line: 1
+                              character: 20
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 22
+                              line: 1
+                              character: 23
+                            end_position:
+                              bytes: 23
+                              line: 1
+                              character: 24
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 23
+                                line: 1
+                                character: 24
+                              end_position:
+                                bytes: 24
+                                line: 1
+                                character: 25
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                    parameters:
+                      pairs:
+                        - End:
+                            Ellipse:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 19
+                                  line: 1
+                                  character: 20
+                                end_position:
+                                  bytes: 22
+                                  line: 1
+                                  character: 23
+                                token_type:
+                                  type: Symbol
+                                  symbol: "..."
+                              trailing_trivia: []
+                    block:
+                      stmts: []
+                    end_token:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 24
+                          line: 1
+                          character: 25
+                        end_position:
+                          bytes: 27
+                          line: 1
+                          character: 28
+                        token_type:
+                          type: Symbol
+                          symbol: end
+                      trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/source.lua
new file mode 100644
index 00000000..567ee735
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/source.lua
@@ -0,0 +1 @@
+local x = function(...) end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/tokens.snap
new file mode 100644
index 00000000..8b9972f2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-3/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/anonymous-functions-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: "..."
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 27
+    line: 1
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 27
+    line: 1
+    character: 28
+  end_position:
+    bytes: 27
+    line: 1
+    character: 28
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/ast.snap
new file mode 100644
index 00000000..0163437f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/ast.snap
@@ -0,0 +1,266 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/anonymous-functions-4
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Function:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 18
+                        line: 1
+                        character: 19
+                      token_type:
+                        type: Symbol
+                        symbol: function
+                    trailing_trivia: []
+                  - parameters_parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 18
+                              line: 1
+                              character: 19
+                            end_position:
+                              bytes: 19
+                              line: 1
+                              character: 20
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 28
+                              line: 1
+                              character: 29
+                            end_position:
+                              bytes: 29
+                              line: 1
+                              character: 30
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 29
+                                line: 1
+                                character: 30
+                              end_position:
+                                bytes: 30
+                                line: 1
+                                character: 31
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                    parameters:
+                      pairs:
+                        - Punctuated:
+                            - Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 19
+                                    line: 1
+                                    character: 20
+                                  end_position:
+                                    bytes: 20
+                                    line: 1
+                                    character: 21
+                                  token_type:
+                                    type: Identifier
+                                    identifier: a
+                                trailing_trivia: []
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 20
+                                  line: 1
+                                  character: 21
+                                end_position:
+                                  bytes: 21
+                                  line: 1
+                                  character: 22
+                                token_type:
+                                  type: Symbol
+                                  symbol: ","
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 21
+                                    line: 1
+                                    character: 22
+                                  end_position:
+                                    bytes: 22
+                                    line: 1
+                                    character: 23
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                        - Punctuated:
+                            - Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 22
+                                    line: 1
+                                    character: 23
+                                  end_position:
+                                    bytes: 23
+                                    line: 1
+                                    character: 24
+                                  token_type:
+                                    type: Identifier
+                                    identifier: b
+                                trailing_trivia: []
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 23
+                                  line: 1
+                                  character: 24
+                                end_position:
+                                  bytes: 24
+                                  line: 1
+                                  character: 25
+                                token_type:
+                                  type: Symbol
+                                  symbol: ","
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 24
+                                    line: 1
+                                    character: 25
+                                  end_position:
+                                    bytes: 25
+                                    line: 1
+                                    character: 26
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                        - End:
+                            Ellipse:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 25
+                                  line: 1
+                                  character: 26
+                                end_position:
+                                  bytes: 28
+                                  line: 1
+                                  character: 29
+                                token_type:
+                                  type: Symbol
+                                  symbol: "..."
+                              trailing_trivia: []
+                    block:
+                      stmts: []
+                    end_token:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 30
+                          line: 1
+                          character: 31
+                        end_position:
+                          bytes: 33
+                          line: 1
+                          character: 34
+                        token_type:
+                          type: Symbol
+                          symbol: end
+                      trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/source.lua
new file mode 100644
index 00000000..566d1999
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/source.lua
@@ -0,0 +1 @@
+local x = function(a, b, ...) end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/tokens.snap
new file mode 100644
index 00000000..b23833ae
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/anonymous-functions-4/tokens.snap
@@ -0,0 +1,215 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/anonymous-functions-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 28
+    line: 1
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "..."
+- start_position:
+    bytes: 28
+    line: 1
+    character: 29
+  end_position:
+    bytes: 29
+    line: 1
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 29
+    line: 1
+    character: 30
+  end_position:
+    bytes: 30
+    line: 1
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 30
+    line: 1
+    character: 31
+  end_position:
+    bytes: 33
+    line: 1
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 33
+    line: 1
+    character: 34
+  end_position:
+    bytes: 33
+    line: 1
+    character: 34
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/ast.snap
new file mode 100644
index 00000000..e2c733e5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/ast.snap
@@ -0,0 +1,83 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/assignment-1
+---
+stmts:
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 0
+                      line: 1
+                      character: 1
+                    end_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      end_position:
+                        bytes: 2
+                        line: 1
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 2
+              line: 1
+              character: 3
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/source.lua
new file mode 100644
index 00000000..3d2b4b14
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/source.lua
@@ -0,0 +1 @@
+x = 1
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/tokens.snap
new file mode 100644
index 00000000..24cb47eb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-1/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/assignment-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/ast.snap
new file mode 100644
index 00000000..3ee1a2ff
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/ast.snap
@@ -0,0 +1,165 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/assignment-2
+---
+stmts:
+  - - Assignment:
+        var_list:
+          pairs:
+            - Punctuated:
+                - Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 0
+                        line: 1
+                        character: 1
+                      end_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      token_type:
+                        type: Identifier
+                        identifier: a
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    end_position:
+                      bytes: 2
+                      line: 1
+                      character: 3
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 2
+                        line: 1
+                        character: 3
+                      end_position:
+                        bytes: 3
+                        line: 1
+                        character: 4
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 3
+                      line: 1
+                      character: 4
+                    end_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    token_type:
+                      type: Identifier
+                      identifier: b
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 4
+                        line: 1
+                        character: 5
+                      end_position:
+                        bytes: 5
+                        line: 1
+                        character: 6
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - Punctuated:
+                - Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      end_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    end_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      end_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Symbol:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    token_type:
+                      type: Symbol
+                      symbol: "true"
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/source.lua
new file mode 100644
index 00000000..8b162b67
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/source.lua
@@ -0,0 +1 @@
+a, b = 1, true
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/tokens.snap
new file mode 100644
index 00000000..83fb8d0e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-2/tokens.snap
@@ -0,0 +1,138 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/assignment-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/ast.snap
new file mode 100644
index 00000000..cb4e5f48
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/ast.snap
@@ -0,0 +1,829 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/assignment-3
+---
+stmts:
+  - - Assignment:
+        var_list:
+          pairs:
+            - Punctuated:
+                - Name:
+                    leading_trivia:
+                      - start_position:
+                          bytes: 0
+                          line: 1
+                          character: 1
+                        end_position:
+                          bytes: 48
+                          line: 1
+                          character: 49
+                        token_type:
+                          type: SingleLineComment
+                          comment: " Crazy assignment code from AmaranthineCodices"
+                      - start_position:
+                          bytes: 48
+                          line: 1
+                          character: 49
+                        end_position:
+                          bytes: 49
+                          line: 1
+                          character: 49
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+                    token:
+                      start_position:
+                        bytes: 49
+                        line: 2
+                        character: 1
+                      end_position:
+                        bytes: 50
+                        line: 2
+                        character: 2
+                      token_type:
+                        type: Identifier
+                        identifier: a
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 50
+                      line: 2
+                      character: 2
+                    end_position:
+                      bytes: 51
+                      line: 2
+                      character: 3
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 51
+                        line: 2
+                        character: 3
+                      end_position:
+                        bytes: 52
+                        line: 2
+                        character: 4
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - Punctuated:
+                - Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 52
+                        line: 2
+                        character: 4
+                      end_position:
+                        bytes: 53
+                        line: 2
+                        character: 5
+                      token_type:
+                        type: Identifier
+                        identifier: b
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 53
+                      line: 2
+                      character: 5
+                    end_position:
+                      bytes: 54
+                      line: 2
+                      character: 6
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 54
+                        line: 2
+                        character: 6
+                      end_position:
+                        bytes: 55
+                        line: 2
+                        character: 7
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - Punctuated:
+                - Expression:
+                    prefix:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 55
+                            line: 2
+                            character: 7
+                          end_position:
+                            bytes: 56
+                            line: 2
+                            character: 8
+                          token_type:
+                            type: Identifier
+                            identifier: c
+                        trailing_trivia: []
+                    suffixes:
+                      - Index:
+                          Dot:
+                            dot:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 56
+                                  line: 2
+                                  character: 8
+                                end_position:
+                                  bytes: 57
+                                  line: 2
+                                  character: 9
+                                token_type:
+                                  type: Symbol
+                                  symbol: "."
+                              trailing_trivia: []
+                            name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 57
+                                  line: 2
+                                  character: 9
+                                end_position:
+                                  bytes: 58
+                                  line: 2
+                                  character: 10
+                                token_type:
+                                  type: Identifier
+                                  identifier: d
+                              trailing_trivia: []
+                      - Index:
+                          Dot:
+                            dot:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 58
+                                  line: 2
+                                  character: 10
+                                end_position:
+                                  bytes: 59
+                                  line: 2
+                                  character: 11
+                                token_type:
+                                  type: Symbol
+                                  symbol: "."
+                              trailing_trivia: []
+                            name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 59
+                                  line: 2
+                                  character: 11
+                                end_position:
+                                  bytes: 60
+                                  line: 2
+                                  character: 12
+                                token_type:
+                                  type: Identifier
+                                  identifier: e
+                              trailing_trivia: []
+                      - Index:
+                          Brackets:
+                            brackets:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 60
+                                      line: 2
+                                      character: 12
+                                    end_position:
+                                      bytes: 61
+                                      line: 2
+                                      character: 13
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "["
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 62
+                                      line: 2
+                                      character: 14
+                                    end_position:
+                                      bytes: 63
+                                      line: 2
+                                      character: 15
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "]"
+                                  trailing_trivia: []
+                            expression:
+                              Var:
+                                Name:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 61
+                                      line: 2
+                                      character: 13
+                                    end_position:
+                                      bytes: 62
+                                      line: 2
+                                      character: 14
+                                    token_type:
+                                      type: Identifier
+                                      identifier: f
+                                  trailing_trivia: []
+                      - Index:
+                          Brackets:
+                            brackets:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 63
+                                      line: 2
+                                      character: 15
+                                    end_position:
+                                      bytes: 64
+                                      line: 2
+                                      character: 16
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "["
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 65
+                                      line: 2
+                                      character: 17
+                                    end_position:
+                                      bytes: 66
+                                      line: 2
+                                      character: 18
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "]"
+                                  trailing_trivia: []
+                            expression:
+                              Var:
+                                Name:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 64
+                                      line: 2
+                                      character: 16
+                                    end_position:
+                                      bytes: 65
+                                      line: 2
+                                      character: 17
+                                    token_type:
+                                      type: Identifier
+                                      identifier: g
+                                  trailing_trivia: []
+                      - Index:
+                          Brackets:
+                            brackets:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 66
+                                      line: 2
+                                      character: 18
+                                    end_position:
+                                      bytes: 67
+                                      line: 2
+                                      character: 19
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "["
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 68
+                                      line: 2
+                                      character: 20
+                                    end_position:
+                                      bytes: 69
+                                      line: 2
+                                      character: 21
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "]"
+                                  trailing_trivia: []
+                            expression:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 67
+                                    line: 2
+                                    character: 19
+                                  end_position:
+                                    bytes: 68
+                                    line: 2
+                                    character: 20
+                                  token_type:
+                                    type: Number
+                                    text: "1"
+                                trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 69
+                      line: 2
+                      character: 21
+                    end_position:
+                      bytes: 70
+                      line: 2
+                      character: 22
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 70
+                        line: 2
+                        character: 22
+                      end_position:
+                        bytes: 71
+                        line: 2
+                        character: 23
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Expression:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 71
+                          line: 2
+                          character: 23
+                        end_position:
+                          bytes: 72
+                          line: 2
+                          character: 24
+                        token_type:
+                          type: Identifier
+                          identifier: h
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        MethodCall:
+                          colon_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 72
+                                line: 2
+                                character: 24
+                              end_position:
+                                bytes: 73
+                                line: 2
+                                character: 25
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 73
+                                line: 2
+                                character: 25
+                              end_position:
+                                bytes: 74
+                                line: 2
+                                character: 26
+                              token_type:
+                                type: Identifier
+                                identifier: i
+                            trailing_trivia: []
+                          args:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 74
+                                        line: 2
+                                        character: 26
+                                      end_position:
+                                        bytes: 75
+                                        line: 2
+                                        character: 27
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 75
+                                        line: 2
+                                        character: 27
+                                      end_position:
+                                        bytes: 76
+                                        line: 2
+                                        character: 28
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+                    - Index:
+                        Dot:
+                          dot:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 76
+                                line: 2
+                                character: 28
+                              end_position:
+                                bytes: 77
+                                line: 2
+                                character: 29
+                              token_type:
+                                type: Symbol
+                                symbol: "."
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 77
+                                line: 2
+                                character: 29
+                              end_position:
+                                bytes: 78
+                                line: 2
+                                character: 30
+                              token_type:
+                                type: Identifier
+                                identifier: j
+                            trailing_trivia: []
+                    - Index:
+                        Brackets:
+                          brackets:
+                            tokens:
+                              - leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 78
+                                    line: 2
+                                    character: 30
+                                  end_position:
+                                    bytes: 79
+                                    line: 2
+                                    character: 31
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "["
+                                trailing_trivia: []
+                              - leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 80
+                                    line: 2
+                                    character: 32
+                                  end_position:
+                                    bytes: 81
+                                    line: 2
+                                    character: 33
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "]"
+                                trailing_trivia: []
+                          expression:
+                            Var:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 79
+                                    line: 2
+                                    character: 31
+                                  end_position:
+                                    bytes: 80
+                                    line: 2
+                                    character: 32
+                                  token_type:
+                                    type: Identifier
+                                    identifier: k
+                                trailing_trivia: []
+                    - Call:
+                        MethodCall:
+                          colon_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 81
+                                line: 2
+                                character: 33
+                              end_position:
+                                bytes: 82
+                                line: 2
+                                character: 34
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 82
+                                line: 2
+                                character: 34
+                              end_position:
+                                bytes: 83
+                                line: 2
+                                character: 35
+                              token_type:
+                                type: Identifier
+                                identifier: l
+                            trailing_trivia: []
+                          args:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 83
+                                        line: 2
+                                        character: 35
+                                      end_position:
+                                        bytes: 84
+                                        line: 2
+                                        character: 36
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 84
+                                        line: 2
+                                        character: 36
+                                      end_position:
+                                        bytes: 85
+                                        line: 2
+                                        character: 37
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+                    - Index:
+                        Brackets:
+                          brackets:
+                            tokens:
+                              - leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 85
+                                    line: 2
+                                    character: 37
+                                  end_position:
+                                    bytes: 86
+                                    line: 2
+                                    character: 38
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "["
+                                trailing_trivia: []
+                              - leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 87
+                                    line: 2
+                                    character: 39
+                                  end_position:
+                                    bytes: 88
+                                    line: 2
+                                    character: 40
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "]"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 88
+                                      line: 2
+                                      character: 40
+                                    end_position:
+                                      bytes: 89
+                                      line: 2
+                                      character: 41
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                          expression:
+                            Var:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 86
+                                    line: 2
+                                    character: 38
+                                  end_position:
+                                    bytes: 87
+                                    line: 2
+                                    character: 39
+                                  token_type:
+                                    type: Identifier
+                                    identifier: m
+                                trailing_trivia: []
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 89
+              line: 2
+              character: 41
+            end_position:
+              bytes: 90
+              line: 2
+              character: 42
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 90
+                line: 2
+                character: 42
+              end_position:
+                bytes: 91
+                line: 2
+                character: 43
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - Punctuated:
+                - Symbol:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 91
+                        line: 2
+                        character: 43
+                      end_position:
+                        bytes: 95
+                        line: 2
+                        character: 47
+                      token_type:
+                        type: Symbol
+                        symbol: "true"
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 95
+                      line: 2
+                      character: 47
+                    end_position:
+                      bytes: 96
+                      line: 2
+                      character: 48
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 96
+                        line: 2
+                        character: 48
+                      end_position:
+                        bytes: 97
+                        line: 2
+                        character: 49
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - Punctuated:
+                - Symbol:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 97
+                        line: 2
+                        character: 49
+                      end_position:
+                        bytes: 102
+                        line: 2
+                        character: 54
+                      token_type:
+                        type: Symbol
+                        symbol: "false"
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 102
+                      line: 2
+                      character: 54
+                    end_position:
+                      bytes: 103
+                      line: 2
+                      character: 55
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 103
+                        line: 2
+                        character: 55
+                      end_position:
+                        bytes: 104
+                        line: 2
+                        character: 56
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - Punctuated:
+                - Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 104
+                        line: 2
+                        character: 56
+                      end_position:
+                        bytes: 105
+                        line: 2
+                        character: 57
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 105
+                      line: 2
+                      character: 57
+                    end_position:
+                      bytes: 106
+                      line: 2
+                      character: 58
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 106
+                        line: 2
+                        character: 58
+                      end_position:
+                        bytes: 107
+                        line: 2
+                        character: 59
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 107
+                      line: 2
+                      character: 59
+                    end_position:
+                      bytes: 108
+                      line: 2
+                      character: 60
+                    token_type:
+                      type: Number
+                      text: "4"
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/source.lua
new file mode 100644
index 00000000..fab2edb9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/source.lua
@@ -0,0 +1,2 @@
+-- Crazy assignment code from AmaranthineCodices
+a, b, c.d.e[f][g][1], h:i().j[k]:l()[m] = true, false, 1, 4
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/tokens.snap
new file mode 100644
index 00000000..a3be75e0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-3/tokens.snap
@@ -0,0 +1,611 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/assignment-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 48
+    line: 1
+    character: 49
+  token_type:
+    type: SingleLineComment
+    comment: " Crazy assignment code from AmaranthineCodices"
+- start_position:
+    bytes: 48
+    line: 1
+    character: 49
+  end_position:
+    bytes: 49
+    line: 1
+    character: 49
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 49
+    line: 2
+    character: 1
+  end_position:
+    bytes: 50
+    line: 2
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 50
+    line: 2
+    character: 2
+  end_position:
+    bytes: 51
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 51
+    line: 2
+    character: 3
+  end_position:
+    bytes: 52
+    line: 2
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 52
+    line: 2
+    character: 4
+  end_position:
+    bytes: 53
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 53
+    line: 2
+    character: 5
+  end_position:
+    bytes: 54
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 54
+    line: 2
+    character: 6
+  end_position:
+    bytes: 55
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 55
+    line: 2
+    character: 7
+  end_position:
+    bytes: 56
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 56
+    line: 2
+    character: 8
+  end_position:
+    bytes: 57
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 57
+    line: 2
+    character: 9
+  end_position:
+    bytes: 58
+    line: 2
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: d
+- start_position:
+    bytes: 58
+    line: 2
+    character: 10
+  end_position:
+    bytes: 59
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 59
+    line: 2
+    character: 11
+  end_position:
+    bytes: 60
+    line: 2
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: e
+- start_position:
+    bytes: 60
+    line: 2
+    character: 12
+  end_position:
+    bytes: 61
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 61
+    line: 2
+    character: 13
+  end_position:
+    bytes: 62
+    line: 2
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: f
+- start_position:
+    bytes: 62
+    line: 2
+    character: 14
+  end_position:
+    bytes: 63
+    line: 2
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 63
+    line: 2
+    character: 15
+  end_position:
+    bytes: 64
+    line: 2
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 64
+    line: 2
+    character: 16
+  end_position:
+    bytes: 65
+    line: 2
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: g
+- start_position:
+    bytes: 65
+    line: 2
+    character: 17
+  end_position:
+    bytes: 66
+    line: 2
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 66
+    line: 2
+    character: 18
+  end_position:
+    bytes: 67
+    line: 2
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 67
+    line: 2
+    character: 19
+  end_position:
+    bytes: 68
+    line: 2
+    character: 20
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 68
+    line: 2
+    character: 20
+  end_position:
+    bytes: 69
+    line: 2
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 69
+    line: 2
+    character: 21
+  end_position:
+    bytes: 70
+    line: 2
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 70
+    line: 2
+    character: 22
+  end_position:
+    bytes: 71
+    line: 2
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 71
+    line: 2
+    character: 23
+  end_position:
+    bytes: 72
+    line: 2
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: h
+- start_position:
+    bytes: 72
+    line: 2
+    character: 24
+  end_position:
+    bytes: 73
+    line: 2
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 73
+    line: 2
+    character: 25
+  end_position:
+    bytes: 74
+    line: 2
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: i
+- start_position:
+    bytes: 74
+    line: 2
+    character: 26
+  end_position:
+    bytes: 75
+    line: 2
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 75
+    line: 2
+    character: 27
+  end_position:
+    bytes: 76
+    line: 2
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 76
+    line: 2
+    character: 28
+  end_position:
+    bytes: 77
+    line: 2
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 77
+    line: 2
+    character: 29
+  end_position:
+    bytes: 78
+    line: 2
+    character: 30
+  token_type:
+    type: Identifier
+    identifier: j
+- start_position:
+    bytes: 78
+    line: 2
+    character: 30
+  end_position:
+    bytes: 79
+    line: 2
+    character: 31
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 79
+    line: 2
+    character: 31
+  end_position:
+    bytes: 80
+    line: 2
+    character: 32
+  token_type:
+    type: Identifier
+    identifier: k
+- start_position:
+    bytes: 80
+    line: 2
+    character: 32
+  end_position:
+    bytes: 81
+    line: 2
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 81
+    line: 2
+    character: 33
+  end_position:
+    bytes: 82
+    line: 2
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 82
+    line: 2
+    character: 34
+  end_position:
+    bytes: 83
+    line: 2
+    character: 35
+  token_type:
+    type: Identifier
+    identifier: l
+- start_position:
+    bytes: 83
+    line: 2
+    character: 35
+  end_position:
+    bytes: 84
+    line: 2
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 84
+    line: 2
+    character: 36
+  end_position:
+    bytes: 85
+    line: 2
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 85
+    line: 2
+    character: 37
+  end_position:
+    bytes: 86
+    line: 2
+    character: 38
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 86
+    line: 2
+    character: 38
+  end_position:
+    bytes: 87
+    line: 2
+    character: 39
+  token_type:
+    type: Identifier
+    identifier: m
+- start_position:
+    bytes: 87
+    line: 2
+    character: 39
+  end_position:
+    bytes: 88
+    line: 2
+    character: 40
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 88
+    line: 2
+    character: 40
+  end_position:
+    bytes: 89
+    line: 2
+    character: 41
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 89
+    line: 2
+    character: 41
+  end_position:
+    bytes: 90
+    line: 2
+    character: 42
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 90
+    line: 2
+    character: 42
+  end_position:
+    bytes: 91
+    line: 2
+    character: 43
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 91
+    line: 2
+    character: 43
+  end_position:
+    bytes: 95
+    line: 2
+    character: 47
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 95
+    line: 2
+    character: 47
+  end_position:
+    bytes: 96
+    line: 2
+    character: 48
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 96
+    line: 2
+    character: 48
+  end_position:
+    bytes: 97
+    line: 2
+    character: 49
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 97
+    line: 2
+    character: 49
+  end_position:
+    bytes: 102
+    line: 2
+    character: 54
+  token_type:
+    type: Symbol
+    symbol: "false"
+- start_position:
+    bytes: 102
+    line: 2
+    character: 54
+  end_position:
+    bytes: 103
+    line: 2
+    character: 55
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 103
+    line: 2
+    character: 55
+  end_position:
+    bytes: 104
+    line: 2
+    character: 56
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 104
+    line: 2
+    character: 56
+  end_position:
+    bytes: 105
+    line: 2
+    character: 57
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 105
+    line: 2
+    character: 57
+  end_position:
+    bytes: 106
+    line: 2
+    character: 58
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 106
+    line: 2
+    character: 58
+  end_position:
+    bytes: 107
+    line: 2
+    character: 59
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 107
+    line: 2
+    character: 59
+  end_position:
+    bytes: 108
+    line: 2
+    character: 60
+  token_type:
+    type: Number
+    text: "4"
+- start_position:
+    bytes: 108
+    line: 2
+    character: 60
+  end_position:
+    bytes: 108
+    line: 2
+    character: 60
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/ast.snap
new file mode 100644
index 00000000..2dae33e5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/ast.snap
@@ -0,0 +1,180 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 54
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/assignment-4
+---
+stmts:
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 0
+                      line: 1
+                      character: 1
+                    end_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: a
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      end_position:
+                        bytes: 2
+                        line: 1
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 2
+              line: 1
+              character: 3
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 5
+                        line: 1
+                        character: 6
+                      end_position:
+                        bytes: 6
+                        line: 1
+                        character: 6
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 2
+                      character: 1
+                    end_position:
+                      bytes: 7
+                      line: 2
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: b
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 7
+                        line: 2
+                        character: 2
+                      end_position:
+                        bytes: 8
+                        line: 2
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 2
+              character: 3
+            end_position:
+              bytes: 9
+              line: 2
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 2
+                character: 4
+              end_position:
+                bytes: 10
+                line: 2
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 2
+                      character: 5
+                    end_position:
+                      bytes: 11
+                      line: 2
+                      character: 6
+                    token_type:
+                      type: Number
+                      text: "2"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 11
+                        line: 2
+                        character: 6
+                      end_position:
+                        bytes: 12
+                        line: 2
+                        character: 6
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/source.lua
new file mode 100644
index 00000000..223ca50d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/source.lua
@@ -0,0 +1,2 @@
+a = 1
+b = 2
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/tokens.snap
new file mode 100644
index 00000000..afabdf98
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-4/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 40
+expression: tokens
+input_file: full-moon/tests/cases/pass/assignment-4
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 6
+    line: 2
+    character: 1
+  end_position:
+    bytes: 7
+    line: 2
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 7
+    line: 2
+    character: 2
+  end_position:
+    bytes: 8
+    line: 2
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 2
+    character: 3
+  end_position:
+    bytes: 9
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 2
+    character: 4
+  end_position:
+    bytes: 10
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 2
+    character: 5
+  end_position:
+    bytes: 11
+    line: 2
+    character: 6
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 6
+  end_position:
+    bytes: 12
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 3
+    character: 1
+  end_position:
+    bytes: 12
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/ast.snap
new file mode 100644
index 00000000..a97a907a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/ast.snap
@@ -0,0 +1,338 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 47
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/assignment-5
+---
+stmts:
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Expression:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 0
+                          line: 1
+                          character: 1
+                        end_position:
+                          bytes: 3
+                          line: 1
+                          character: 4
+                        token_type:
+                          type: Identifier
+                          identifier: gui
+                      trailing_trivia: []
+                  suffixes:
+                    - Index:
+                        Dot:
+                          dot:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 3
+                                line: 1
+                                character: 4
+                              end_position:
+                                bytes: 4
+                                line: 1
+                                character: 5
+                              token_type:
+                                type: Symbol
+                                symbol: "."
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 4
+                                line: 1
+                                character: 5
+                              end_position:
+                                bytes: 9
+                                line: 1
+                                character: 10
+                              token_type:
+                                type: Identifier
+                                identifier: Label
+                            trailing_trivia: []
+                    - Index:
+                        Dot:
+                          dot:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 9
+                                line: 1
+                                character: 10
+                              end_position:
+                                bytes: 10
+                                line: 1
+                                character: 11
+                              token_type:
+                                type: Symbol
+                                symbol: "."
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 10
+                                line: 1
+                                character: 11
+                              end_position:
+                                bytes: 14
+                                line: 1
+                                character: 15
+                              token_type:
+                                type: Identifier
+                                identifier: Text
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 14
+                                  line: 1
+                                  character: 15
+                                end_position:
+                                  bytes: 15
+                                  line: 1
+                                  character: 16
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 15
+              line: 1
+              character: 16
+            end_position:
+              bytes: 16
+              line: 1
+              character: 17
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 16
+                line: 1
+                character: 17
+              end_position:
+                bytes: 17
+                line: 1
+                character: 18
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    String:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 17
+                          line: 1
+                          character: 18
+                        end_position:
+                          bytes: 31
+                          line: 1
+                          character: 32
+                        token_type:
+                          type: StringLiteral
+                          literal: LOADING DATA
+                          quote_type: Double
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 31
+                            line: 1
+                            character: 32
+                          end_position:
+                            bytes: 32
+                            line: 1
+                            character: 33
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    TwoDots:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 32
+                          line: 1
+                          character: 33
+                        end_position:
+                          bytes: 34
+                          line: 1
+                          character: 35
+                        token_type:
+                          type: Symbol
+                          symbol: ".."
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 34
+                            line: 1
+                            character: 35
+                          end_position:
+                            bytes: 35
+                            line: 1
+                            character: 36
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    FunctionCall:
+                      prefix:
+                        Expression:
+                          Parentheses:
+                            contained:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 35
+                                      line: 1
+                                      character: 36
+                                    end_position:
+                                      bytes: 36
+                                      line: 1
+                                      character: 37
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 39
+                                      line: 1
+                                      character: 40
+                                    end_position:
+                                      bytes: 40
+                                      line: 1
+                                      character: 41
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia: []
+                            expression:
+                              String:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 36
+                                    line: 1
+                                    character: 37
+                                  end_position:
+                                    bytes: 39
+                                    line: 1
+                                    character: 40
+                                  token_type:
+                                    type: StringLiteral
+                                    literal: "."
+                                    quote_type: Double
+                                trailing_trivia: []
+                      suffixes:
+                        - Call:
+                            MethodCall:
+                              colon_token:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 40
+                                    line: 1
+                                    character: 41
+                                  end_position:
+                                    bytes: 41
+                                    line: 1
+                                    character: 42
+                                  token_type:
+                                    type: Symbol
+                                    symbol: ":"
+                                trailing_trivia: []
+                              name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 41
+                                    line: 1
+                                    character: 42
+                                  end_position:
+                                    bytes: 44
+                                    line: 1
+                                    character: 45
+                                  token_type:
+                                    type: Identifier
+                                    identifier: rep
+                                trailing_trivia: []
+                              args:
+                                Parentheses:
+                                  parentheses:
+                                    tokens:
+                                      - leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 44
+                                            line: 1
+                                            character: 45
+                                          end_position:
+                                            bytes: 45
+                                            line: 1
+                                            character: 46
+                                          token_type:
+                                            type: Symbol
+                                            symbol: (
+                                        trailing_trivia: []
+                                      - leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 53
+                                            line: 1
+                                            character: 54
+                                          end_position:
+                                            bytes: 54
+                                            line: 1
+                                            character: 55
+                                          token_type:
+                                            type: Symbol
+                                            symbol: )
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 54
+                                              line: 1
+                                              character: 55
+                                            end_position:
+                                              bytes: 55
+                                              line: 1
+                                              character: 55
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\n"
+                                  arguments:
+                                    pairs:
+                                      - End:
+                                          Var:
+                                            Name:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 45
+                                                  line: 1
+                                                  character: 46
+                                                end_position:
+                                                  bytes: 53
+                                                  line: 1
+                                                  character: 54
+                                                token_type:
+                                                  type: Identifier
+                                                  identifier: dotCount
+                                              trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/source.lua
new file mode 100644
index 00000000..8a751ba0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/source.lua
@@ -0,0 +1 @@
+gui.Label.Text = "LOADING DATA" .. ("."):rep(dotCount)
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/tokens.snap
new file mode 100644
index 00000000..7006f66c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/assignment-5/tokens.snap
@@ -0,0 +1,250 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 40
+expression: tokens
+input_file: full-moon/tests/cases/pass/assignment-5
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Identifier
+    identifier: gui
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: Label
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: Text
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 31
+    line: 1
+    character: 32
+  token_type:
+    type: StringLiteral
+    literal: LOADING DATA
+    quote_type: Double
+- start_position:
+    bytes: 31
+    line: 1
+    character: 32
+  end_position:
+    bytes: 32
+    line: 1
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 32
+    line: 1
+    character: 33
+  end_position:
+    bytes: 34
+    line: 1
+    character: 35
+  token_type:
+    type: Symbol
+    symbol: ".."
+- start_position:
+    bytes: 34
+    line: 1
+    character: 35
+  end_position:
+    bytes: 35
+    line: 1
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 35
+    line: 1
+    character: 36
+  end_position:
+    bytes: 36
+    line: 1
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 36
+    line: 1
+    character: 37
+  end_position:
+    bytes: 39
+    line: 1
+    character: 40
+  token_type:
+    type: StringLiteral
+    literal: "."
+    quote_type: Double
+- start_position:
+    bytes: 39
+    line: 1
+    character: 40
+  end_position:
+    bytes: 40
+    line: 1
+    character: 41
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 40
+    line: 1
+    character: 41
+  end_position:
+    bytes: 41
+    line: 1
+    character: 42
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 41
+    line: 1
+    character: 42
+  end_position:
+    bytes: 44
+    line: 1
+    character: 45
+  token_type:
+    type: Identifier
+    identifier: rep
+- start_position:
+    bytes: 44
+    line: 1
+    character: 45
+  end_position:
+    bytes: 45
+    line: 1
+    character: 46
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 45
+    line: 1
+    character: 46
+  end_position:
+    bytes: 53
+    line: 1
+    character: 54
+  token_type:
+    type: Identifier
+    identifier: dotCount
+- start_position:
+    bytes: 53
+    line: 1
+    character: 54
+  end_position:
+    bytes: 54
+    line: 1
+    character: 55
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 54
+    line: 1
+    character: 55
+  end_position:
+    bytes: 55
+    line: 1
+    character: 55
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 55
+    line: 2
+    character: 1
+  end_position:
+    bytes: 55
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/binops/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/binops/ast.snap
new file mode 100644
index 00000000..2a2b13a5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/binops/ast.snap
@@ -0,0 +1,1840 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/binops
+---
+stmts:
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 0
+                      line: 1
+                      character: 1
+                    end_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: a
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      end_position:
+                        bytes: 2
+                        line: 1
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 2
+              line: 1
+              character: 3
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          end_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          token_type:
+                            type: Identifier
+                            identifier: foo
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 7
+                              line: 1
+                              character: 8
+                            end_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  binop:
+                    And:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 8
+                          line: 1
+                          character: 9
+                        end_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        token_type:
+                          type: Symbol
+                          symbol: and
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          end_position:
+                            bytes: 12
+                            line: 1
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 12
+                            line: 1
+                            character: 13
+                          end_position:
+                            bytes: 15
+                            line: 1
+                            character: 16
+                          token_type:
+                            type: Identifier
+                            identifier: bar
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 15
+                              line: 1
+                              character: 16
+                            end_position:
+                              bytes: 16
+                              line: 1
+                              character: 16
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 16
+                      line: 2
+                      character: 1
+                    end_position:
+                      bytes: 17
+                      line: 2
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: b
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 17
+                        line: 2
+                        character: 2
+                      end_position:
+                        bytes: 18
+                        line: 2
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 18
+              line: 2
+              character: 3
+            end_position:
+              bytes: 19
+              line: 2
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 19
+                line: 2
+                character: 4
+              end_position:
+                bytes: 20
+                line: 2
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    BinaryOperator:
+                      lhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 20
+                                line: 2
+                                character: 5
+                              end_position:
+                                bytes: 23
+                                line: 2
+                                character: 8
+                              token_type:
+                                type: Identifier
+                                identifier: foo
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 23
+                                  line: 2
+                                  character: 8
+                                end_position:
+                                  bytes: 24
+                                  line: 2
+                                  character: 9
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      binop:
+                        And:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 24
+                              line: 2
+                              character: 9
+                            end_position:
+                              bytes: 27
+                              line: 2
+                              character: 12
+                            token_type:
+                              type: Symbol
+                              symbol: and
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 27
+                                line: 2
+                                character: 12
+                              end_position:
+                                bytes: 28
+                                line: 2
+                                character: 13
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 28
+                                line: 2
+                                character: 13
+                              end_position:
+                                bytes: 31
+                                line: 2
+                                character: 16
+                              token_type:
+                                type: Identifier
+                                identifier: bar
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 31
+                                  line: 2
+                                  character: 16
+                                end_position:
+                                  bytes: 32
+                                  line: 2
+                                  character: 17
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                  binop:
+                    Or:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 32
+                          line: 2
+                          character: 17
+                        end_position:
+                          bytes: 34
+                          line: 2
+                          character: 19
+                        token_type:
+                          type: Symbol
+                          symbol: or
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 34
+                            line: 2
+                            character: 19
+                          end_position:
+                            bytes: 35
+                            line: 2
+                            character: 20
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 35
+                            line: 2
+                            character: 20
+                          end_position:
+                            bytes: 38
+                            line: 2
+                            character: 23
+                          token_type:
+                            type: Identifier
+                            identifier: baz
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 38
+                              line: 2
+                              character: 23
+                            end_position:
+                              bytes: 39
+                              line: 2
+                              character: 23
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 39
+                      line: 3
+                      character: 1
+                    end_position:
+                      bytes: 40
+                      line: 3
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: c
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 40
+                        line: 3
+                        character: 2
+                      end_position:
+                        bytes: 41
+                        line: 3
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 41
+              line: 3
+              character: 3
+            end_position:
+              bytes: 42
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 42
+                line: 3
+                character: 4
+              end_position:
+                bytes: 43
+                line: 3
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    BinaryOperator:
+                      lhs:
+                        Number:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 43
+                              line: 3
+                              character: 5
+                            end_position:
+                              bytes: 44
+                              line: 3
+                              character: 6
+                            token_type:
+                              type: Number
+                              text: "1"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 44
+                                line: 3
+                                character: 6
+                              end_position:
+                                bytes: 45
+                                line: 3
+                                character: 7
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      binop:
+                        Plus:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 45
+                              line: 3
+                              character: 7
+                            end_position:
+                              bytes: 46
+                              line: 3
+                              character: 8
+                            token_type:
+                              type: Symbol
+                              symbol: +
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 46
+                                line: 3
+                                character: 8
+                              end_position:
+                                bytes: 47
+                                line: 3
+                                character: 9
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        BinaryOperator:
+                          lhs:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 47
+                                  line: 3
+                                  character: 9
+                                end_position:
+                                  bytes: 48
+                                  line: 3
+                                  character: 10
+                                token_type:
+                                  type: Number
+                                  text: "2"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 48
+                                    line: 3
+                                    character: 10
+                                  end_position:
+                                    bytes: 49
+                                    line: 3
+                                    character: 11
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                          binop:
+                            Star:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 49
+                                  line: 3
+                                  character: 11
+                                end_position:
+                                  bytes: 50
+                                  line: 3
+                                  character: 12
+                                token_type:
+                                  type: Symbol
+                                  symbol: "*"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 50
+                                    line: 3
+                                    character: 12
+                                  end_position:
+                                    bytes: 51
+                                    line: 3
+                                    character: 13
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                          rhs:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 51
+                                  line: 3
+                                  character: 13
+                                end_position:
+                                  bytes: 52
+                                  line: 3
+                                  character: 14
+                                token_type:
+                                  type: Number
+                                  text: "3"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 52
+                                    line: 3
+                                    character: 14
+                                  end_position:
+                                    bytes: 53
+                                    line: 3
+                                    character: 15
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                  binop:
+                    Minus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 53
+                          line: 3
+                          character: 15
+                        end_position:
+                          bytes: 54
+                          line: 3
+                          character: 16
+                        token_type:
+                          type: Symbol
+                          symbol: "-"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 54
+                            line: 3
+                            character: 16
+                          end_position:
+                            bytes: 55
+                            line: 3
+                            character: 17
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    BinaryOperator:
+                      lhs:
+                        Number:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 55
+                              line: 3
+                              character: 17
+                            end_position:
+                              bytes: 56
+                              line: 3
+                              character: 18
+                            token_type:
+                              type: Number
+                              text: "4"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 56
+                                line: 3
+                                character: 18
+                              end_position:
+                                bytes: 57
+                                line: 3
+                                character: 19
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      binop:
+                        Caret:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 57
+                              line: 3
+                              character: 19
+                            end_position:
+                              bytes: 58
+                              line: 3
+                              character: 20
+                            token_type:
+                              type: Symbol
+                              symbol: ^
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 58
+                                line: 3
+                                character: 20
+                              end_position:
+                                bytes: 59
+                                line: 3
+                                character: 21
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Number:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 59
+                              line: 3
+                              character: 21
+                            end_position:
+                              bytes: 60
+                              line: 3
+                              character: 22
+                            token_type:
+                              type: Number
+                              text: "2"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 60
+                                line: 3
+                                character: 22
+                              end_position:
+                                bytes: 61
+                                line: 3
+                                character: 22
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 61
+                      line: 4
+                      character: 1
+                    end_position:
+                      bytes: 62
+                      line: 4
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: d
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 62
+                        line: 4
+                        character: 2
+                      end_position:
+                        bytes: 63
+                        line: 4
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 63
+              line: 4
+              character: 3
+            end_position:
+              bytes: 64
+              line: 4
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 64
+                line: 4
+                character: 4
+              end_position:
+                bytes: 65
+                line: 4
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    BinaryOperator:
+                      lhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 65
+                                line: 4
+                                character: 5
+                              end_position:
+                                bytes: 66
+                                line: 4
+                                character: 6
+                              token_type:
+                                type: Identifier
+                                identifier: a
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 66
+                                  line: 4
+                                  character: 6
+                                end_position:
+                                  bytes: 67
+                                  line: 4
+                                  character: 7
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      binop:
+                        Plus:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 67
+                              line: 4
+                              character: 7
+                            end_position:
+                              bytes: 68
+                              line: 4
+                              character: 8
+                            token_type:
+                              type: Symbol
+                              symbol: +
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 68
+                                line: 4
+                                character: 8
+                              end_position:
+                                bytes: 69
+                                line: 4
+                                character: 9
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 69
+                                line: 4
+                                character: 9
+                              end_position:
+                                bytes: 70
+                                line: 4
+                                character: 10
+                              token_type:
+                                type: Identifier
+                                identifier: i
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 70
+                                  line: 4
+                                  character: 10
+                                end_position:
+                                  bytes: 71
+                                  line: 4
+                                  character: 11
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                  binop:
+                    LessThan:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 71
+                          line: 4
+                          character: 11
+                        end_position:
+                          bytes: 72
+                          line: 4
+                          character: 12
+                        token_type:
+                          type: Symbol
+                          symbol: "<"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 72
+                            line: 4
+                            character: 12
+                          end_position:
+                            bytes: 73
+                            line: 4
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    BinaryOperator:
+                      lhs:
+                        BinaryOperator:
+                          lhs:
+                            Var:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 73
+                                    line: 4
+                                    character: 13
+                                  end_position:
+                                    bytes: 74
+                                    line: 4
+                                    character: 14
+                                  token_type:
+                                    type: Identifier
+                                    identifier: b
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 74
+                                      line: 4
+                                      character: 14
+                                    end_position:
+                                      bytes: 75
+                                      line: 4
+                                      character: 15
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                          binop:
+                            Slash:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 75
+                                  line: 4
+                                  character: 15
+                                end_position:
+                                  bytes: 76
+                                  line: 4
+                                  character: 16
+                                token_type:
+                                  type: Symbol
+                                  symbol: /
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 76
+                                    line: 4
+                                    character: 16
+                                  end_position:
+                                    bytes: 77
+                                    line: 4
+                                    character: 17
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                          rhs:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 77
+                                  line: 4
+                                  character: 17
+                                end_position:
+                                  bytes: 78
+                                  line: 4
+                                  character: 18
+                                token_type:
+                                  type: Number
+                                  text: "2"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 78
+                                    line: 4
+                                    character: 18
+                                  end_position:
+                                    bytes: 79
+                                    line: 4
+                                    character: 19
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                      binop:
+                        Plus:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 79
+                              line: 4
+                              character: 19
+                            end_position:
+                              bytes: 80
+                              line: 4
+                              character: 20
+                            token_type:
+                              type: Symbol
+                              symbol: +
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 80
+                                line: 4
+                                character: 20
+                              end_position:
+                                bytes: 81
+                                line: 4
+                                character: 21
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Number:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 81
+                              line: 4
+                              character: 21
+                            end_position:
+                              bytes: 82
+                              line: 4
+                              character: 22
+                            token_type:
+                              type: Number
+                              text: "1"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 82
+                                line: 4
+                                character: 22
+                              end_position:
+                                bytes: 83
+                                line: 4
+                                character: 22
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 83
+                      line: 5
+                      character: 1
+                    end_position:
+                      bytes: 84
+                      line: 5
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: e
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 84
+                        line: 5
+                        character: 2
+                      end_position:
+                        bytes: 85
+                        line: 5
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 85
+              line: 5
+              character: 3
+            end_position:
+              bytes: 86
+              line: 5
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 86
+                line: 5
+                character: 4
+              end_position:
+                bytes: 87
+                line: 5
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 87
+                          line: 5
+                          character: 5
+                        end_position:
+                          bytes: 88
+                          line: 5
+                          character: 6
+                        token_type:
+                          type: Number
+                          text: "5"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 88
+                            line: 5
+                            character: 6
+                          end_position:
+                            bytes: 89
+                            line: 5
+                            character: 7
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    Plus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 89
+                          line: 5
+                          character: 7
+                        end_position:
+                          bytes: 90
+                          line: 5
+                          character: 8
+                        token_type:
+                          type: Symbol
+                          symbol: +
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 90
+                            line: 5
+                            character: 8
+                          end_position:
+                            bytes: 91
+                            line: 5
+                            character: 9
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    BinaryOperator:
+                      lhs:
+                        BinaryOperator:
+                          lhs:
+                            Var:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 91
+                                    line: 5
+                                    character: 9
+                                  end_position:
+                                    bytes: 92
+                                    line: 5
+                                    character: 10
+                                  token_type:
+                                    type: Identifier
+                                    identifier: x
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 92
+                                      line: 5
+                                      character: 10
+                                    end_position:
+                                      bytes: 93
+                                      line: 5
+                                      character: 11
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                          binop:
+                            Caret:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 93
+                                  line: 5
+                                  character: 11
+                                end_position:
+                                  bytes: 94
+                                  line: 5
+                                  character: 12
+                                token_type:
+                                  type: Symbol
+                                  symbol: ^
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 94
+                                    line: 5
+                                    character: 12
+                                  end_position:
+                                    bytes: 95
+                                    line: 5
+                                    character: 13
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                          rhs:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 95
+                                  line: 5
+                                  character: 13
+                                end_position:
+                                  bytes: 96
+                                  line: 5
+                                  character: 14
+                                token_type:
+                                  type: Number
+                                  text: "2"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 96
+                                    line: 5
+                                    character: 14
+                                  end_position:
+                                    bytes: 97
+                                    line: 5
+                                    character: 15
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                      binop:
+                        Star:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 97
+                              line: 5
+                              character: 15
+                            end_position:
+                              bytes: 98
+                              line: 5
+                              character: 16
+                            token_type:
+                              type: Symbol
+                              symbol: "*"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 98
+                                line: 5
+                                character: 16
+                              end_position:
+                                bytes: 99
+                                line: 5
+                                character: 17
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Number:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 99
+                              line: 5
+                              character: 17
+                            end_position:
+                              bytes: 100
+                              line: 5
+                              character: 18
+                            token_type:
+                              type: Number
+                              text: "8"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 100
+                                line: 5
+                                character: 18
+                              end_position:
+                                bytes: 101
+                                line: 5
+                                character: 18
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 101
+                      line: 6
+                      character: 1
+                    end_position:
+                      bytes: 102
+                      line: 6
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: f
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 102
+                        line: 6
+                        character: 2
+                      end_position:
+                        bytes: 103
+                        line: 6
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 103
+              line: 6
+              character: 3
+            end_position:
+              bytes: 104
+              line: 6
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 104
+                line: 6
+                character: 4
+              end_position:
+                bytes: 105
+                line: 6
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    BinaryOperator:
+                      lhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 105
+                                line: 6
+                                character: 5
+                              end_position:
+                                bytes: 106
+                                line: 6
+                                character: 6
+                              token_type:
+                                type: Identifier
+                                identifier: a
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 106
+                                  line: 6
+                                  character: 6
+                                end_position:
+                                  bytes: 107
+                                  line: 6
+                                  character: 7
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      binop:
+                        LessThan:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 107
+                              line: 6
+                              character: 7
+                            end_position:
+                              bytes: 108
+                              line: 6
+                              character: 8
+                            token_type:
+                              type: Symbol
+                              symbol: "<"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 108
+                                line: 6
+                                character: 8
+                              end_position:
+                                bytes: 109
+                                line: 6
+                                character: 9
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 109
+                                line: 6
+                                character: 9
+                              end_position:
+                                bytes: 110
+                                line: 6
+                                character: 10
+                              token_type:
+                                type: Identifier
+                                identifier: y
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 110
+                                  line: 6
+                                  character: 10
+                                end_position:
+                                  bytes: 111
+                                  line: 6
+                                  character: 11
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                  binop:
+                    And:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 111
+                          line: 6
+                          character: 11
+                        end_position:
+                          bytes: 114
+                          line: 6
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: and
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 114
+                            line: 6
+                            character: 14
+                          end_position:
+                            bytes: 115
+                            line: 6
+                            character: 15
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    BinaryOperator:
+                      lhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 115
+                                line: 6
+                                character: 15
+                              end_position:
+                                bytes: 116
+                                line: 6
+                                character: 16
+                              token_type:
+                                type: Identifier
+                                identifier: y
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 116
+                                  line: 6
+                                  character: 16
+                                end_position:
+                                  bytes: 117
+                                  line: 6
+                                  character: 17
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      binop:
+                        LessThanEqual:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 117
+                              line: 6
+                              character: 17
+                            end_position:
+                              bytes: 119
+                              line: 6
+                              character: 19
+                            token_type:
+                              type: Symbol
+                              symbol: "<="
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 119
+                                line: 6
+                                character: 19
+                              end_position:
+                                bytes: 120
+                                line: 6
+                                character: 20
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 120
+                                line: 6
+                                character: 20
+                              end_position:
+                                bytes: 121
+                                line: 6
+                                character: 21
+                              token_type:
+                                type: Identifier
+                                identifier: z
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 121
+                                  line: 6
+                                  character: 21
+                                end_position:
+                                  bytes: 122
+                                  line: 6
+                                  character: 21
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 122
+                      line: 7
+                      character: 1
+                    end_position:
+                      bytes: 123
+                      line: 7
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: g
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 123
+                        line: 7
+                        character: 2
+                      end_position:
+                        bytes: 124
+                        line: 7
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 124
+              line: 7
+              character: 3
+            end_position:
+              bytes: 125
+              line: 7
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 125
+                line: 7
+                character: 4
+              end_position:
+                bytes: 126
+                line: 7
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                UnaryOperator:
+                  unop:
+                    Minus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 126
+                          line: 7
+                          character: 5
+                        end_position:
+                          bytes: 127
+                          line: 7
+                          character: 6
+                        token_type:
+                          type: Symbol
+                          symbol: "-"
+                      trailing_trivia: []
+                  expression:
+                    BinaryOperator:
+                      lhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 127
+                                line: 7
+                                character: 6
+                              end_position:
+                                bytes: 128
+                                line: 7
+                                character: 7
+                              token_type:
+                                type: Identifier
+                                identifier: x
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 128
+                                  line: 7
+                                  character: 7
+                                end_position:
+                                  bytes: 129
+                                  line: 7
+                                  character: 8
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      binop:
+                        Caret:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 129
+                              line: 7
+                              character: 8
+                            end_position:
+                              bytes: 130
+                              line: 7
+                              character: 9
+                            token_type:
+                              type: Symbol
+                              symbol: ^
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 130
+                                line: 7
+                                character: 9
+                              end_position:
+                                bytes: 131
+                                line: 7
+                                character: 10
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Number:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 131
+                              line: 7
+                              character: 10
+                            end_position:
+                              bytes: 132
+                              line: 7
+                              character: 11
+                            token_type:
+                              type: Number
+                              text: "2"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 132
+                                line: 7
+                                character: 11
+                              end_position:
+                                bytes: 133
+                                line: 7
+                                character: 11
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 133
+                      line: 8
+                      character: 1
+                    end_position:
+                      bytes: 134
+                      line: 8
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: h
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 134
+                        line: 8
+                        character: 2
+                      end_position:
+                        bytes: 135
+                        line: 8
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 135
+              line: 8
+              character: 3
+            end_position:
+              bytes: 136
+              line: 8
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 136
+                line: 8
+                character: 4
+              end_position:
+                bytes: 137
+                line: 8
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 137
+                            line: 8
+                            character: 5
+                          end_position:
+                            bytes: 138
+                            line: 8
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: x
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 138
+                              line: 8
+                              character: 6
+                            end_position:
+                              bytes: 139
+                              line: 8
+                              character: 7
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  binop:
+                    Caret:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 139
+                          line: 8
+                          character: 7
+                        end_position:
+                          bytes: 140
+                          line: 8
+                          character: 8
+                        token_type:
+                          type: Symbol
+                          symbol: ^
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 140
+                            line: 8
+                            character: 8
+                          end_position:
+                            bytes: 141
+                            line: 8
+                            character: 9
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    BinaryOperator:
+                      lhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 141
+                                line: 8
+                                character: 9
+                              end_position:
+                                bytes: 142
+                                line: 8
+                                character: 10
+                              token_type:
+                                type: Identifier
+                                identifier: y
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 142
+                                  line: 8
+                                  character: 10
+                                end_position:
+                                  bytes: 143
+                                  line: 8
+                                  character: 11
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      binop:
+                        Caret:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 143
+                              line: 8
+                              character: 11
+                            end_position:
+                              bytes: 144
+                              line: 8
+                              character: 12
+                            token_type:
+                              type: Symbol
+                              symbol: ^
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 144
+                                line: 8
+                                character: 12
+                              end_position:
+                                bytes: 145
+                                line: 8
+                                character: 13
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      rhs:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 145
+                                line: 8
+                                character: 13
+                              end_position:
+                                bytes: 146
+                                line: 8
+                                character: 14
+                              token_type:
+                                type: Identifier
+                                identifier: z
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/binops/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/binops/source.lua
new file mode 100644
index 00000000..5397e71c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/binops/source.lua
@@ -0,0 +1,8 @@
+a = foo and bar
+b = foo and bar or baz
+c = 1 + 2 * 3 - 4 ^ 2
+d = a + i < b / 2 + 1
+e = 5 + x ^ 2 * 8
+f = a < y and y <= z
+g = -x ^ 2
+h = x ^ y ^ z
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/binops/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/binops/tokens.snap
new file mode 100644
index 00000000..7d0e52d3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/binops/tokens.snap
@@ -0,0 +1,1425 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/binops
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: and
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 1
+  end_position:
+    bytes: 17
+    line: 2
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 17
+    line: 2
+    character: 2
+  end_position:
+    bytes: 18
+    line: 2
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 2
+    character: 3
+  end_position:
+    bytes: 19
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 19
+    line: 2
+    character: 4
+  end_position:
+    bytes: 20
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 2
+    character: 5
+  end_position:
+    bytes: 23
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 23
+    line: 2
+    character: 8
+  end_position:
+    bytes: 24
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 2
+    character: 9
+  end_position:
+    bytes: 27
+    line: 2
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: and
+- start_position:
+    bytes: 27
+    line: 2
+    character: 12
+  end_position:
+    bytes: 28
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 28
+    line: 2
+    character: 13
+  end_position:
+    bytes: 31
+    line: 2
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 31
+    line: 2
+    character: 16
+  end_position:
+    bytes: 32
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 32
+    line: 2
+    character: 17
+  end_position:
+    bytes: 34
+    line: 2
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: or
+- start_position:
+    bytes: 34
+    line: 2
+    character: 19
+  end_position:
+    bytes: 35
+    line: 2
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 35
+    line: 2
+    character: 20
+  end_position:
+    bytes: 38
+    line: 2
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 38
+    line: 2
+    character: 23
+  end_position:
+    bytes: 39
+    line: 2
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 39
+    line: 3
+    character: 1
+  end_position:
+    bytes: 40
+    line: 3
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 40
+    line: 3
+    character: 2
+  end_position:
+    bytes: 41
+    line: 3
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 41
+    line: 3
+    character: 3
+  end_position:
+    bytes: 42
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 42
+    line: 3
+    character: 4
+  end_position:
+    bytes: 43
+    line: 3
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 43
+    line: 3
+    character: 5
+  end_position:
+    bytes: 44
+    line: 3
+    character: 6
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 44
+    line: 3
+    character: 6
+  end_position:
+    bytes: 45
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 45
+    line: 3
+    character: 7
+  end_position:
+    bytes: 46
+    line: 3
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 46
+    line: 3
+    character: 8
+  end_position:
+    bytes: 47
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 47
+    line: 3
+    character: 9
+  end_position:
+    bytes: 48
+    line: 3
+    character: 10
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 48
+    line: 3
+    character: 10
+  end_position:
+    bytes: 49
+    line: 3
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 49
+    line: 3
+    character: 11
+  end_position:
+    bytes: 50
+    line: 3
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "*"
+- start_position:
+    bytes: 50
+    line: 3
+    character: 12
+  end_position:
+    bytes: 51
+    line: 3
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 51
+    line: 3
+    character: 13
+  end_position:
+    bytes: 52
+    line: 3
+    character: 14
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 52
+    line: 3
+    character: 14
+  end_position:
+    bytes: 53
+    line: 3
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 53
+    line: 3
+    character: 15
+  end_position:
+    bytes: 54
+    line: 3
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 54
+    line: 3
+    character: 16
+  end_position:
+    bytes: 55
+    line: 3
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 55
+    line: 3
+    character: 17
+  end_position:
+    bytes: 56
+    line: 3
+    character: 18
+  token_type:
+    type: Number
+    text: "4"
+- start_position:
+    bytes: 56
+    line: 3
+    character: 18
+  end_position:
+    bytes: 57
+    line: 3
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 57
+    line: 3
+    character: 19
+  end_position:
+    bytes: 58
+    line: 3
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: ^
+- start_position:
+    bytes: 58
+    line: 3
+    character: 20
+  end_position:
+    bytes: 59
+    line: 3
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 59
+    line: 3
+    character: 21
+  end_position:
+    bytes: 60
+    line: 3
+    character: 22
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 60
+    line: 3
+    character: 22
+  end_position:
+    bytes: 61
+    line: 3
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 61
+    line: 4
+    character: 1
+  end_position:
+    bytes: 62
+    line: 4
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: d
+- start_position:
+    bytes: 62
+    line: 4
+    character: 2
+  end_position:
+    bytes: 63
+    line: 4
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 63
+    line: 4
+    character: 3
+  end_position:
+    bytes: 64
+    line: 4
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 64
+    line: 4
+    character: 4
+  end_position:
+    bytes: 65
+    line: 4
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 65
+    line: 4
+    character: 5
+  end_position:
+    bytes: 66
+    line: 4
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 66
+    line: 4
+    character: 6
+  end_position:
+    bytes: 67
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 67
+    line: 4
+    character: 7
+  end_position:
+    bytes: 68
+    line: 4
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 68
+    line: 4
+    character: 8
+  end_position:
+    bytes: 69
+    line: 4
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 69
+    line: 4
+    character: 9
+  end_position:
+    bytes: 70
+    line: 4
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: i
+- start_position:
+    bytes: 70
+    line: 4
+    character: 10
+  end_position:
+    bytes: 71
+    line: 4
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 71
+    line: 4
+    character: 11
+  end_position:
+    bytes: 72
+    line: 4
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 72
+    line: 4
+    character: 12
+  end_position:
+    bytes: 73
+    line: 4
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 73
+    line: 4
+    character: 13
+  end_position:
+    bytes: 74
+    line: 4
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 74
+    line: 4
+    character: 14
+  end_position:
+    bytes: 75
+    line: 4
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 75
+    line: 4
+    character: 15
+  end_position:
+    bytes: 76
+    line: 4
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: /
+- start_position:
+    bytes: 76
+    line: 4
+    character: 16
+  end_position:
+    bytes: 77
+    line: 4
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 77
+    line: 4
+    character: 17
+  end_position:
+    bytes: 78
+    line: 4
+    character: 18
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 78
+    line: 4
+    character: 18
+  end_position:
+    bytes: 79
+    line: 4
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 79
+    line: 4
+    character: 19
+  end_position:
+    bytes: 80
+    line: 4
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 80
+    line: 4
+    character: 20
+  end_position:
+    bytes: 81
+    line: 4
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 81
+    line: 4
+    character: 21
+  end_position:
+    bytes: 82
+    line: 4
+    character: 22
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 82
+    line: 4
+    character: 22
+  end_position:
+    bytes: 83
+    line: 4
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 83
+    line: 5
+    character: 1
+  end_position:
+    bytes: 84
+    line: 5
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: e
+- start_position:
+    bytes: 84
+    line: 5
+    character: 2
+  end_position:
+    bytes: 85
+    line: 5
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 85
+    line: 5
+    character: 3
+  end_position:
+    bytes: 86
+    line: 5
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 86
+    line: 5
+    character: 4
+  end_position:
+    bytes: 87
+    line: 5
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 87
+    line: 5
+    character: 5
+  end_position:
+    bytes: 88
+    line: 5
+    character: 6
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 88
+    line: 5
+    character: 6
+  end_position:
+    bytes: 89
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 89
+    line: 5
+    character: 7
+  end_position:
+    bytes: 90
+    line: 5
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 90
+    line: 5
+    character: 8
+  end_position:
+    bytes: 91
+    line: 5
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 91
+    line: 5
+    character: 9
+  end_position:
+    bytes: 92
+    line: 5
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 92
+    line: 5
+    character: 10
+  end_position:
+    bytes: 93
+    line: 5
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 93
+    line: 5
+    character: 11
+  end_position:
+    bytes: 94
+    line: 5
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: ^
+- start_position:
+    bytes: 94
+    line: 5
+    character: 12
+  end_position:
+    bytes: 95
+    line: 5
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 95
+    line: 5
+    character: 13
+  end_position:
+    bytes: 96
+    line: 5
+    character: 14
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 96
+    line: 5
+    character: 14
+  end_position:
+    bytes: 97
+    line: 5
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 97
+    line: 5
+    character: 15
+  end_position:
+    bytes: 98
+    line: 5
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "*"
+- start_position:
+    bytes: 98
+    line: 5
+    character: 16
+  end_position:
+    bytes: 99
+    line: 5
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 99
+    line: 5
+    character: 17
+  end_position:
+    bytes: 100
+    line: 5
+    character: 18
+  token_type:
+    type: Number
+    text: "8"
+- start_position:
+    bytes: 100
+    line: 5
+    character: 18
+  end_position:
+    bytes: 101
+    line: 5
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 101
+    line: 6
+    character: 1
+  end_position:
+    bytes: 102
+    line: 6
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: f
+- start_position:
+    bytes: 102
+    line: 6
+    character: 2
+  end_position:
+    bytes: 103
+    line: 6
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 103
+    line: 6
+    character: 3
+  end_position:
+    bytes: 104
+    line: 6
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 104
+    line: 6
+    character: 4
+  end_position:
+    bytes: 105
+    line: 6
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 105
+    line: 6
+    character: 5
+  end_position:
+    bytes: 106
+    line: 6
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 106
+    line: 6
+    character: 6
+  end_position:
+    bytes: 107
+    line: 6
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 107
+    line: 6
+    character: 7
+  end_position:
+    bytes: 108
+    line: 6
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 108
+    line: 6
+    character: 8
+  end_position:
+    bytes: 109
+    line: 6
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 109
+    line: 6
+    character: 9
+  end_position:
+    bytes: 110
+    line: 6
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 110
+    line: 6
+    character: 10
+  end_position:
+    bytes: 111
+    line: 6
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 111
+    line: 6
+    character: 11
+  end_position:
+    bytes: 114
+    line: 6
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: and
+- start_position:
+    bytes: 114
+    line: 6
+    character: 14
+  end_position:
+    bytes: 115
+    line: 6
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 115
+    line: 6
+    character: 15
+  end_position:
+    bytes: 116
+    line: 6
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 116
+    line: 6
+    character: 16
+  end_position:
+    bytes: 117
+    line: 6
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 117
+    line: 6
+    character: 17
+  end_position:
+    bytes: 119
+    line: 6
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "<="
+- start_position:
+    bytes: 119
+    line: 6
+    character: 19
+  end_position:
+    bytes: 120
+    line: 6
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 120
+    line: 6
+    character: 20
+  end_position:
+    bytes: 121
+    line: 6
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: z
+- start_position:
+    bytes: 121
+    line: 6
+    character: 21
+  end_position:
+    bytes: 122
+    line: 6
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 122
+    line: 7
+    character: 1
+  end_position:
+    bytes: 123
+    line: 7
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: g
+- start_position:
+    bytes: 123
+    line: 7
+    character: 2
+  end_position:
+    bytes: 124
+    line: 7
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 124
+    line: 7
+    character: 3
+  end_position:
+    bytes: 125
+    line: 7
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 125
+    line: 7
+    character: 4
+  end_position:
+    bytes: 126
+    line: 7
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 126
+    line: 7
+    character: 5
+  end_position:
+    bytes: 127
+    line: 7
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 127
+    line: 7
+    character: 6
+  end_position:
+    bytes: 128
+    line: 7
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 128
+    line: 7
+    character: 7
+  end_position:
+    bytes: 129
+    line: 7
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 129
+    line: 7
+    character: 8
+  end_position:
+    bytes: 130
+    line: 7
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: ^
+- start_position:
+    bytes: 130
+    line: 7
+    character: 9
+  end_position:
+    bytes: 131
+    line: 7
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 131
+    line: 7
+    character: 10
+  end_position:
+    bytes: 132
+    line: 7
+    character: 11
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 132
+    line: 7
+    character: 11
+  end_position:
+    bytes: 133
+    line: 7
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 133
+    line: 8
+    character: 1
+  end_position:
+    bytes: 134
+    line: 8
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: h
+- start_position:
+    bytes: 134
+    line: 8
+    character: 2
+  end_position:
+    bytes: 135
+    line: 8
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 135
+    line: 8
+    character: 3
+  end_position:
+    bytes: 136
+    line: 8
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 136
+    line: 8
+    character: 4
+  end_position:
+    bytes: 137
+    line: 8
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 137
+    line: 8
+    character: 5
+  end_position:
+    bytes: 138
+    line: 8
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 138
+    line: 8
+    character: 6
+  end_position:
+    bytes: 139
+    line: 8
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 139
+    line: 8
+    character: 7
+  end_position:
+    bytes: 140
+    line: 8
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ^
+- start_position:
+    bytes: 140
+    line: 8
+    character: 8
+  end_position:
+    bytes: 141
+    line: 8
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 141
+    line: 8
+    character: 9
+  end_position:
+    bytes: 142
+    line: 8
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 142
+    line: 8
+    character: 10
+  end_position:
+    bytes: 143
+    line: 8
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 143
+    line: 8
+    character: 11
+  end_position:
+    bytes: 144
+    line: 8
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: ^
+- start_position:
+    bytes: 144
+    line: 8
+    character: 12
+  end_position:
+    bytes: 145
+    line: 8
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 145
+    line: 8
+    character: 13
+  end_position:
+    bytes: 146
+    line: 8
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: z
+- start_position:
+    bytes: 146
+    line: 8
+    character: 14
+  end_position:
+    bytes: 146
+    line: 8
+    character: 14
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/ast.snap
new file mode 100644
index 00000000..46d33fda
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/ast.snap
@@ -0,0 +1,62 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - Do:
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 2
+              line: 1
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 3
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts: []
+        end_token:
+          leading_trivia:
+            - start_position:
+                bytes: 3
+                line: 2
+                character: 1
+              end_position:
+                bytes: 8
+                line: 2
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: "    \n"
+          token:
+            start_position:
+              bytes: 8
+              line: 3
+              character: 1
+            end_position:
+              bytes: 11
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/source.lua
new file mode 100644
index 00000000..c0697c93
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/source.lua
@@ -0,0 +1,3 @@
+do
+    
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/tokens.snap
new file mode 100644
index 00000000..841093a4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/body-with-spaces/tokens.snap
@@ -0,0 +1,59 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 3
+    line: 2
+    character: 1
+  end_position:
+    bytes: 8
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    \n"
+- start_position:
+    bytes: 8
+    line: 3
+    character: 1
+  end_position:
+    bytes: 11
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 11
+    line: 3
+    character: 4
+  end_position:
+    bytes: 11
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/call-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/call-1/ast.snap
new file mode 100644
index 00000000..f2b812e7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/call-1/ast.snap
@@ -0,0 +1,265 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/call-1
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          end_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          end_position:
+                            bytes: 6
+                            line: 1
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 6
+                              line: 1
+                              character: 7
+                            end_position:
+                              bytes: 7
+                              line: 1
+                              character: 7
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 7
+                line: 2
+                character: 1
+              end_position:
+                bytes: 11
+                line: 2
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 11
+                            line: 2
+                            character: 5
+                          end_position:
+                            bytes: 12
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 13
+                            line: 2
+                            character: 7
+                          end_position:
+                            bytes: 14
+                            line: 2
+                            character: 8
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 14
+                              line: 2
+                              character: 8
+                            end_position:
+                              bytes: 15
+                              line: 2
+                              character: 8
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          Number:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 12
+                                line: 2
+                                character: 6
+                              end_position:
+                                bytes: 13
+                                line: 2
+                                character: 7
+                              token_type:
+                                type: Number
+                                text: "1"
+                            trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 3
+                character: 1
+              end_position:
+                bytes: 19
+                line: 3
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 19
+                            line: 3
+                            character: 5
+                          end_position:
+                            bytes: 20
+                            line: 3
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 24
+                            line: 3
+                            character: 10
+                          end_position:
+                            bytes: 25
+                            line: 3
+                            character: 11
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - Punctuated:
+                          - Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 20
+                                  line: 3
+                                  character: 6
+                                end_position:
+                                  bytes: 21
+                                  line: 3
+                                  character: 7
+                                token_type:
+                                  type: Number
+                                  text: "1"
+                              trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 21
+                                line: 3
+                                character: 7
+                              end_position:
+                                bytes: 22
+                                line: 3
+                                character: 8
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 22
+                                  line: 3
+                                  character: 8
+                                end_position:
+                                  bytes: 23
+                                  line: 3
+                                  character: 9
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      - End:
+                          Number:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 23
+                                line: 3
+                                character: 9
+                              end_position:
+                                bytes: 24
+                                line: 3
+                                character: 10
+                              token_type:
+                                type: Number
+                                text: "2"
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/call-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/call-1/source.lua
new file mode 100644
index 00000000..42e66348
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/call-1/source.lua
@@ -0,0 +1,3 @@
+call()
+call(1)
+call(1, 2)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/call-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/call-1/tokens.snap
new file mode 100644
index 00000000..c0062d30
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/call-1/tokens.snap
@@ -0,0 +1,193 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/call-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 7
+    line: 2
+    character: 1
+  end_position:
+    bytes: 11
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 11
+    line: 2
+    character: 5
+  end_position:
+    bytes: 12
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 12
+    line: 2
+    character: 6
+  end_position:
+    bytes: 13
+    line: 2
+    character: 7
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 7
+  end_position:
+    bytes: 14
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 2
+    character: 8
+  end_position:
+    bytes: 15
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 3
+    character: 1
+  end_position:
+    bytes: 19
+    line: 3
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 19
+    line: 3
+    character: 5
+  end_position:
+    bytes: 20
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 20
+    line: 3
+    character: 6
+  end_position:
+    bytes: 21
+    line: 3
+    character: 7
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 21
+    line: 3
+    character: 7
+  end_position:
+    bytes: 22
+    line: 3
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 22
+    line: 3
+    character: 8
+  end_position:
+    bytes: 23
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 23
+    line: 3
+    character: 9
+  end_position:
+    bytes: 24
+    line: 3
+    character: 10
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 24
+    line: 3
+    character: 10
+  end_position:
+    bytes: 25
+    line: 3
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 25
+    line: 3
+    character: 11
+  end_position:
+    bytes: 25
+    line: 3
+    character: 11
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/call-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/call-2/ast.snap
new file mode 100644
index 00000000..f31d1a87
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/call-2/ast.snap
@@ -0,0 +1,224 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/call-2
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 1
+                line: 1
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia: []
+        suffixes:
+          - Index:
+              Dot:
+                dot:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    end_position:
+                      bytes: 2
+                      line: 1
+                      character: 3
+                    token_type:
+                      type: Symbol
+                      symbol: "."
+                  trailing_trivia: []
+                name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 2
+                      line: 1
+                      character: 3
+                    end_position:
+                      bytes: 3
+                      line: 1
+                      character: 4
+                    token_type:
+                      type: Identifier
+                      identifier: y
+                  trailing_trivia: []
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 3
+                            line: 1
+                            character: 4
+                          end_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 7
+                            line: 1
+                            character: 8
+                          end_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 8
+                              line: 1
+                              character: 9
+                            end_position:
+                              bytes: 9
+                              line: 1
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 4
+                                line: 1
+                                character: 5
+                              end_position:
+                                bytes: 7
+                                line: 1
+                                character: 8
+                              token_type:
+                                type: StringLiteral
+                                literal: a
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 9
+                line: 2
+                character: 1
+              end_position:
+                bytes: 10
+                line: 2
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              MethodCall:
+                colon_token:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 2
+                      character: 2
+                    end_position:
+                      bytes: 11
+                      line: 2
+                      character: 3
+                    token_type:
+                      type: Symbol
+                      symbol: ":"
+                  trailing_trivia: []
+                name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 11
+                      line: 2
+                      character: 3
+                    end_position:
+                      bytes: 12
+                      line: 2
+                      character: 4
+                    token_type:
+                      type: Identifier
+                      identifier: y
+                  trailing_trivia: []
+                args:
+                  Parentheses:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 12
+                              line: 2
+                              character: 4
+                            end_position:
+                              bytes: 13
+                              line: 2
+                              character: 5
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 16
+                              line: 2
+                              character: 8
+                            end_position:
+                              bytes: 17
+                              line: 2
+                              character: 9
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    arguments:
+                      pairs:
+                        - End:
+                            String:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 13
+                                  line: 2
+                                  character: 5
+                                end_position:
+                                  bytes: 16
+                                  line: 2
+                                  character: 8
+                                token_type:
+                                  type: StringLiteral
+                                  literal: b
+                                  quote_type: Double
+                              trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/call-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/call-2/source.lua
new file mode 100644
index 00000000..d65eca40
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/call-2/source.lua
@@ -0,0 +1,2 @@
+x.y("a")
+x:y("b")
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/call-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/call-2/tokens.snap
new file mode 100644
index 00000000..e265844d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/call-2/tokens.snap
@@ -0,0 +1,162 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/call-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: StringLiteral
+    literal: a
+    quote_type: Double
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 10
+    line: 2
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 10
+    line: 2
+    character: 2
+  end_position:
+    bytes: 11
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 3
+  end_position:
+    bytes: 12
+    line: 2
+    character: 4
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 12
+    line: 2
+    character: 4
+  end_position:
+    bytes: 13
+    line: 2
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 13
+    line: 2
+    character: 5
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: StringLiteral
+    literal: b
+    quote_type: Double
+- start_position:
+    bytes: 16
+    line: 2
+    character: 8
+  end_position:
+    bytes: 17
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 17
+    line: 2
+    character: 9
+  end_position:
+    bytes: 17
+    line: 2
+    character: 9
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/do/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/do/ast.snap
new file mode 100644
index 00000000..68979cf5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/do/ast.snap
@@ -0,0 +1,129 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/do
+
+---
+stmts:
+  - - Do:
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 2
+              line: 1
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 3
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 3
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 4
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 4
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 8
+                          line: 2
+                          character: 6
+                        token_type:
+                          type: Identifier
+                          identifier: call
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 8
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 9
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 9
+                                      line: 2
+                                      character: 7
+                                    end_position:
+                                      bytes: 10
+                                      line: 2
+                                      character: 8
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 10
+                                        line: 2
+                                        character: 8
+                                      end_position:
+                                        bytes: 11
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 11
+              line: 3
+              character: 1
+            end_position:
+              bytes: 14
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/do/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/do/source.lua
new file mode 100644
index 00000000..634f506d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/do/source.lua
@@ -0,0 +1,3 @@
+do
+	call()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/do/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/do/tokens.snap
new file mode 100644
index 00000000..27870214
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/do/tokens.snap
@@ -0,0 +1,105 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/do
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 3
+    line: 2
+    character: 1
+  end_position:
+    bytes: 4
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 4
+    line: 2
+    character: 2
+  end_position:
+    bytes: 8
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 8
+    line: 2
+    character: 6
+  end_position:
+    bytes: 9
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 9
+    line: 2
+    character: 7
+  end_position:
+    bytes: 10
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 10
+    line: 2
+    character: 8
+  end_position:
+    bytes: 11
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 11
+    line: 3
+    character: 1
+  end_position:
+    bytes: 14
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 14
+    line: 3
+    character: 4
+  end_position:
+    bytes: 14
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/empty/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/empty/ast.snap
new file mode 100644
index 00000000..3bc4ce6b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/empty/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/empty
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/empty/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/empty/source.lua
new file mode 100644
index 00000000..e69de29b
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/empty/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/empty/tokens.snap
new file mode 100644
index 00000000..ede4fa88
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/empty/tokens.snap
@@ -0,0 +1,17 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/empty
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 0
+    line: 1
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/exponents/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/exponents/ast.snap
new file mode 100644
index 00000000..1fd0d77f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/exponents/ast.snap
@@ -0,0 +1,330 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/exponents
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: num
+                trailing_trivia:
+                  - start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 10
+              line: 1
+              character: 11
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    end_position:
+                      bytes: 15
+                      line: 1
+                      character: 16
+                    token_type:
+                      type: Number
+                      text: "1e5"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 16
+              line: 2
+              character: 1
+            end_position:
+              bytes: 21
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 21
+                line: 2
+                character: 6
+              end_position:
+                bytes: 22
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 22
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 26
+                    line: 2
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num2
+                trailing_trivia:
+                  - start_position:
+                      bytes: 26
+                      line: 2
+                      character: 11
+                    end_position:
+                      bytes: 27
+                      line: 2
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 27
+              line: 2
+              character: 12
+            end_position:
+              bytes: 28
+              line: 2
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 28
+                line: 2
+                character: 13
+              end_position:
+                bytes: 29
+                line: 2
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 29
+                      line: 2
+                      character: 14
+                    end_position:
+                      bytes: 33
+                      line: 2
+                      character: 18
+                    token_type:
+                      type: Number
+                      text: "1e-5"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 33
+                        line: 2
+                        character: 18
+                      end_position:
+                        bytes: 34
+                        line: 2
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 34
+              line: 3
+              character: 1
+            end_position:
+              bytes: 39
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 39
+                line: 3
+                character: 6
+              end_position:
+                bytes: 40
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 40
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 44
+                    line: 3
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num3
+                trailing_trivia:
+                  - start_position:
+                      bytes: 44
+                      line: 3
+                      character: 11
+                    end_position:
+                      bytes: 45
+                      line: 3
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 45
+              line: 3
+              character: 12
+            end_position:
+              bytes: 46
+              line: 3
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 46
+                line: 3
+                character: 13
+              end_position:
+                bytes: 47
+                line: 3
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 47
+                      line: 3
+                      character: 14
+                    end_position:
+                      bytes: 51
+                      line: 3
+                      character: 18
+                    token_type:
+                      type: Number
+                      text: "1e+5"
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/exponents/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/exponents/source.lua
new file mode 100644
index 00000000..c4300642
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/exponents/source.lua
@@ -0,0 +1,3 @@
+local num = 1e5
+local num2 = 1e-5
+local num3 = 1e+5
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/exponents/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/exponents/tokens.snap
new file mode 100644
index 00000000..f1489769
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/exponents/tokens.snap
@@ -0,0 +1,270 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/exponents
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: num
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Number
+    text: "1e5"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 1
+  end_position:
+    bytes: 21
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 21
+    line: 2
+    character: 6
+  end_position:
+    bytes: 22
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 7
+  end_position:
+    bytes: 26
+    line: 2
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num2
+- start_position:
+    bytes: 26
+    line: 2
+    character: 11
+  end_position:
+    bytes: 27
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 27
+    line: 2
+    character: 12
+  end_position:
+    bytes: 28
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 28
+    line: 2
+    character: 13
+  end_position:
+    bytes: 29
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 29
+    line: 2
+    character: 14
+  end_position:
+    bytes: 33
+    line: 2
+    character: 18
+  token_type:
+    type: Number
+    text: "1e-5"
+- start_position:
+    bytes: 33
+    line: 2
+    character: 18
+  end_position:
+    bytes: 34
+    line: 2
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 34
+    line: 3
+    character: 1
+  end_position:
+    bytes: 39
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 39
+    line: 3
+    character: 6
+  end_position:
+    bytes: 40
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 40
+    line: 3
+    character: 7
+  end_position:
+    bytes: 44
+    line: 3
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num3
+- start_position:
+    bytes: 44
+    line: 3
+    character: 11
+  end_position:
+    bytes: 45
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 45
+    line: 3
+    character: 12
+  end_position:
+    bytes: 46
+    line: 3
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 46
+    line: 3
+    character: 13
+  end_position:
+    bytes: 47
+    line: 3
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 47
+    line: 3
+    character: 14
+  end_position:
+    bytes: 51
+    line: 3
+    character: 18
+  token_type:
+    type: Number
+    text: "1e+5"
+- start_position:
+    bytes: 51
+    line: 3
+    character: 18
+  end_position:
+    bytes: 51
+    line: 3
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/ast.snap
new file mode 100644
index 00000000..01570051
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/ast.snap
@@ -0,0 +1,563 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/fractional-numbers
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: num
+                trailing_trivia:
+                  - start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 10
+              line: 1
+              character: 11
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    end_position:
+                      bytes: 15
+                      line: 1
+                      character: 16
+                    token_type:
+                      type: Number
+                      text: "0.5"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 16
+              line: 2
+              character: 1
+            end_position:
+              bytes: 21
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 21
+                line: 2
+                character: 6
+              end_position:
+                bytes: 22
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 22
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 26
+                    line: 2
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num2
+                trailing_trivia:
+                  - start_position:
+                      bytes: 26
+                      line: 2
+                      character: 11
+                    end_position:
+                      bytes: 27
+                      line: 2
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 27
+              line: 2
+              character: 12
+            end_position:
+              bytes: 28
+              line: 2
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 28
+                line: 2
+                character: 13
+              end_position:
+                bytes: 29
+                line: 2
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 29
+                      line: 2
+                      character: 14
+                    end_position:
+                      bytes: 34
+                      line: 2
+                      character: 19
+                    token_type:
+                      type: Number
+                      text: "0.5e5"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 34
+                        line: 2
+                        character: 19
+                      end_position:
+                        bytes: 35
+                        line: 2
+                        character: 19
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 35
+              line: 3
+              character: 1
+            end_position:
+              bytes: 40
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 40
+                line: 3
+                character: 6
+              end_position:
+                bytes: 41
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 41
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 45
+                    line: 3
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num3
+                trailing_trivia:
+                  - start_position:
+                      bytes: 45
+                      line: 3
+                      character: 11
+                    end_position:
+                      bytes: 46
+                      line: 3
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 46
+              line: 3
+              character: 12
+            end_position:
+              bytes: 47
+              line: 3
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 47
+                line: 3
+                character: 13
+              end_position:
+                bytes: 48
+                line: 3
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 48
+                      line: 3
+                      character: 14
+                    end_position:
+                      bytes: 50
+                      line: 3
+                      character: 16
+                    token_type:
+                      type: Number
+                      text: ".5"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 50
+                        line: 3
+                        character: 16
+                      end_position:
+                        bytes: 51
+                        line: 3
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 51
+              line: 4
+              character: 1
+            end_position:
+              bytes: 56
+              line: 4
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 56
+                line: 4
+                character: 6
+              end_position:
+                bytes: 57
+                line: 4
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 57
+                    line: 4
+                    character: 7
+                  end_position:
+                    bytes: 61
+                    line: 4
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num4
+                trailing_trivia:
+                  - start_position:
+                      bytes: 61
+                      line: 4
+                      character: 11
+                    end_position:
+                      bytes: 62
+                      line: 4
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 62
+              line: 4
+              character: 12
+            end_position:
+              bytes: 63
+              line: 4
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 63
+                line: 4
+                character: 13
+              end_position:
+                bytes: 64
+                line: 4
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 64
+                      line: 4
+                      character: 14
+                    end_position:
+                      bytes: 68
+                      line: 4
+                      character: 18
+                    token_type:
+                      type: Number
+                      text: ".5e5"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 68
+                        line: 4
+                        character: 18
+                      end_position:
+                        bytes: 69
+                        line: 4
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 69
+              line: 5
+              character: 1
+            end_position:
+              bytes: 74
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 74
+                line: 5
+                character: 6
+              end_position:
+                bytes: 75
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 75
+                    line: 5
+                    character: 7
+                  end_position:
+                    bytes: 79
+                    line: 5
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num5
+                trailing_trivia:
+                  - start_position:
+                      bytes: 79
+                      line: 5
+                      character: 11
+                    end_position:
+                      bytes: 80
+                      line: 5
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 80
+              line: 5
+              character: 12
+            end_position:
+              bytes: 81
+              line: 5
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 81
+                line: 5
+                character: 13
+              end_position:
+                bytes: 82
+                line: 5
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 82
+                      line: 5
+                      character: 14
+                    end_position:
+                      bytes: 84
+                      line: 5
+                      character: 16
+                    token_type:
+                      type: Number
+                      text: "1."
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 84
+                        line: 5
+                        character: 16
+                      end_position:
+                        bytes: 85
+                        line: 5
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/source.lua
new file mode 100644
index 00000000..2b757460
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/source.lua
@@ -0,0 +1,5 @@
+local num = 0.5
+local num2 = 0.5e5
+local num3 = .5
+local num4 = .5e5
+local num5 = 1.
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/tokens.snap
new file mode 100644
index 00000000..dffd1e48
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/fractional-numbers/tokens.snap
@@ -0,0 +1,457 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/fractional-numbers
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: num
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Number
+    text: "0.5"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 1
+  end_position:
+    bytes: 21
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 21
+    line: 2
+    character: 6
+  end_position:
+    bytes: 22
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 7
+  end_position:
+    bytes: 26
+    line: 2
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num2
+- start_position:
+    bytes: 26
+    line: 2
+    character: 11
+  end_position:
+    bytes: 27
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 27
+    line: 2
+    character: 12
+  end_position:
+    bytes: 28
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 28
+    line: 2
+    character: 13
+  end_position:
+    bytes: 29
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 29
+    line: 2
+    character: 14
+  end_position:
+    bytes: 34
+    line: 2
+    character: 19
+  token_type:
+    type: Number
+    text: "0.5e5"
+- start_position:
+    bytes: 34
+    line: 2
+    character: 19
+  end_position:
+    bytes: 35
+    line: 2
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 35
+    line: 3
+    character: 1
+  end_position:
+    bytes: 40
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 40
+    line: 3
+    character: 6
+  end_position:
+    bytes: 41
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 41
+    line: 3
+    character: 7
+  end_position:
+    bytes: 45
+    line: 3
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num3
+- start_position:
+    bytes: 45
+    line: 3
+    character: 11
+  end_position:
+    bytes: 46
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 46
+    line: 3
+    character: 12
+  end_position:
+    bytes: 47
+    line: 3
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 47
+    line: 3
+    character: 13
+  end_position:
+    bytes: 48
+    line: 3
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 48
+    line: 3
+    character: 14
+  end_position:
+    bytes: 50
+    line: 3
+    character: 16
+  token_type:
+    type: Number
+    text: ".5"
+- start_position:
+    bytes: 50
+    line: 3
+    character: 16
+  end_position:
+    bytes: 51
+    line: 3
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 51
+    line: 4
+    character: 1
+  end_position:
+    bytes: 56
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 56
+    line: 4
+    character: 6
+  end_position:
+    bytes: 57
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 57
+    line: 4
+    character: 7
+  end_position:
+    bytes: 61
+    line: 4
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num4
+- start_position:
+    bytes: 61
+    line: 4
+    character: 11
+  end_position:
+    bytes: 62
+    line: 4
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 62
+    line: 4
+    character: 12
+  end_position:
+    bytes: 63
+    line: 4
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 63
+    line: 4
+    character: 13
+  end_position:
+    bytes: 64
+    line: 4
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 64
+    line: 4
+    character: 14
+  end_position:
+    bytes: 68
+    line: 4
+    character: 18
+  token_type:
+    type: Number
+    text: ".5e5"
+- start_position:
+    bytes: 68
+    line: 4
+    character: 18
+  end_position:
+    bytes: 69
+    line: 4
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 69
+    line: 5
+    character: 1
+  end_position:
+    bytes: 74
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 74
+    line: 5
+    character: 6
+  end_position:
+    bytes: 75
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 75
+    line: 5
+    character: 7
+  end_position:
+    bytes: 79
+    line: 5
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num5
+- start_position:
+    bytes: 79
+    line: 5
+    character: 11
+  end_position:
+    bytes: 80
+    line: 5
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 80
+    line: 5
+    character: 12
+  end_position:
+    bytes: 81
+    line: 5
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 81
+    line: 5
+    character: 13
+  end_position:
+    bytes: 82
+    line: 5
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 82
+    line: 5
+    character: 14
+  end_position:
+    bytes: 84
+    line: 5
+    character: 16
+  token_type:
+    type: Number
+    text: "1."
+- start_position:
+    bytes: 84
+    line: 5
+    character: 16
+  end_position:
+    bytes: 85
+    line: 5
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 85
+    line: 6
+    character: 1
+  end_position:
+    bytes: 85
+    line: 6
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/ast.snap
new file mode 100644
index 00000000..5a8d4935
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/ast.snap
@@ -0,0 +1,192 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/function-declaration-1
+
+---
+stmts:
+  - - FunctionDeclaration:
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 8
+              line: 1
+              character: 9
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          names:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia: []
+          colon_name: ~
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  end_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  end_position:
+                    bytes: 12
+                    line: 1
+                    character: 13
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    end_position:
+                      bytes: 13
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          parameters:
+            pairs: []
+          block:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 13
+                              line: 2
+                              character: 1
+                            end_position:
+                              bytes: 14
+                              line: 2
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 14
+                            line: 2
+                            character: 2
+                          end_position:
+                            bytes: 18
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 18
+                                        line: 2
+                                        character: 6
+                                      end_position:
+                                        bytes: 19
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 19
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 20
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 20
+                                          line: 2
+                                          character: 8
+                                        end_position:
+                                          bytes: 21
+                                          line: 2
+                                          character: 8
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs: []
+                - ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 21
+                line: 3
+                character: 1
+              end_position:
+                bytes: 24
+                line: 3
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/source.lua
new file mode 100644
index 00000000..a74feae4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/source.lua
@@ -0,0 +1,3 @@
+function x()
+	call()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/tokens.snap
new file mode 100644
index 00000000..7527c162
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-1/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/function-declaration-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 1
+  end_position:
+    bytes: 14
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 14
+    line: 2
+    character: 2
+  end_position:
+    bytes: 18
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 18
+    line: 2
+    character: 6
+  end_position:
+    bytes: 19
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 2
+    character: 7
+  end_position:
+    bytes: 20
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 20
+    line: 2
+    character: 8
+  end_position:
+    bytes: 21
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 21
+    line: 3
+    character: 1
+  end_position:
+    bytes: 24
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 24
+    line: 3
+    character: 4
+  end_position:
+    bytes: 24
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/ast.snap
new file mode 100644
index 00000000..a3faef37
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/ast.snap
@@ -0,0 +1,173 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/function-declaration-2
+
+---
+stmts:
+  - - FunctionDeclaration:
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 8
+              line: 1
+              character: 9
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          names:
+            pairs:
+              - Punctuated:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      end_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      token_type:
+                        type: Identifier
+                        identifier: x
+                    trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Symbol
+                        symbol: "."
+                    trailing_trivia: []
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    end_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Identifier
+                      identifier: y
+                  trailing_trivia: []
+          colon_name:
+            - leading_trivia: []
+              token:
+                start_position:
+                  bytes: 12
+                  line: 1
+                  character: 13
+                end_position:
+                  bytes: 13
+                  line: 1
+                  character: 14
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia: []
+            - leading_trivia: []
+              token:
+                start_position:
+                  bytes: 13
+                  line: 1
+                  character: 14
+                end_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                token_type:
+                  type: Identifier
+                  identifier: z
+              trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 14
+                    line: 1
+                    character: 15
+                  end_position:
+                    bytes: 15
+                    line: 1
+                    character: 16
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 15
+                    line: 1
+                    character: 16
+                  end_position:
+                    bytes: 16
+                    line: 1
+                    character: 17
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          parameters:
+            pairs: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 17
+                line: 1
+                character: 18
+              end_position:
+                bytes: 20
+                line: 1
+                character: 21
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/source.lua
new file mode 100644
index 00000000..b5b1dbc6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/source.lua
@@ -0,0 +1 @@
+function x.y:z() end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/tokens.snap
new file mode 100644
index 00000000..3b0d5449
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-declaration-2/tokens.snap
@@ -0,0 +1,138 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/function-declaration-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: z
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/ast.snap
new file mode 100644
index 00000000..07f5908d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/ast.snap
@@ -0,0 +1,224 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/function-shortcuts
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia:
+              - start_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                end_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        suffixes:
+          - Call:
+              AnonymousCall:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          end_position:
+                            bytes: 6
+                            line: 1
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 6
+                              line: 1
+                              character: 7
+                            end_position:
+                              bytes: 7
+                              line: 1
+                              character: 8
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 13
+                            line: 1
+                            character: 14
+                          end_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 14
+                              line: 1
+                              character: 15
+                            end_position:
+                              bytes: 15
+                              line: 1
+                              character: 15
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  fields:
+                    pairs:
+                      - End:
+                          NameKey:
+                            key:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 7
+                                  line: 1
+                                  character: 8
+                                end_position:
+                                  bytes: 8
+                                  line: 1
+                                  character: 9
+                                token_type:
+                                  type: Identifier
+                                  identifier: x
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 8
+                                    line: 1
+                                    character: 9
+                                  end_position:
+                                    bytes: 9
+                                    line: 1
+                                    character: 10
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            equal:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 9
+                                  line: 1
+                                  character: 10
+                                end_position:
+                                  bytes: 10
+                                  line: 1
+                                  character: 11
+                                token_type:
+                                  type: Symbol
+                                  symbol: "="
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 10
+                                    line: 1
+                                    character: 11
+                                  end_position:
+                                    bytes: 11
+                                    line: 1
+                                    character: 12
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            value:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 11
+                                    line: 1
+                                    character: 12
+                                  end_position:
+                                    bytes: 12
+                                    line: 1
+                                    character: 13
+                                  token_type:
+                                    type: Number
+                                    text: "1"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 12
+                                      line: 1
+                                      character: 13
+                                    end_position:
+                                      bytes: 13
+                                      line: 1
+                                      character: 14
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 2
+                character: 1
+              end_position:
+                bytes: 19
+                line: 2
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia:
+              - start_position:
+                  bytes: 19
+                  line: 2
+                  character: 5
+                end_position:
+                  bytes: 20
+                  line: 2
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        suffixes:
+          - Call:
+              AnonymousCall:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 20
+                      line: 2
+                      character: 6
+                    end_position:
+                      bytes: 27
+                      line: 2
+                      character: 13
+                    token_type:
+                      type: StringLiteral
+                      literal: hello
+                      quote_type: Double
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/source.lua
new file mode 100644
index 00000000..a41c8959
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/source.lua
@@ -0,0 +1,2 @@
+call { x = 1 }
+call "hello"
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/tokens.snap
new file mode 100644
index 00000000..12032a0a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/function-shortcuts/tokens.snap
@@ -0,0 +1,183 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/function-shortcuts
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 19
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 19
+    line: 2
+    character: 5
+  end_position:
+    bytes: 20
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 2
+    character: 6
+  end_position:
+    bytes: 27
+    line: 2
+    character: 13
+  token_type:
+    type: StringLiteral
+    literal: hello
+    quote_type: Double
+- start_position:
+    bytes: 27
+    line: 2
+    character: 13
+  end_position:
+    bytes: 27
+    line: 2
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/ast.snap
new file mode 100644
index 00000000..0a09d51f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/ast.snap
@@ -0,0 +1,392 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/generic-for-loop-1
+---
+stmts:
+  - - GenericFor:
+        for_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: for
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        names:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    token_type:
+                      type: Identifier
+                      identifier: index
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  end_position:
+                    bytes: 16
+                    line: 1
+                    character: 17
+                  token_type:
+                    type: Identifier
+                    identifier: value
+                trailing_trivia:
+                  - start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        in_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 17
+              line: 1
+              character: 18
+            end_position:
+              bytes: 19
+              line: 1
+              character: 20
+            token_type:
+              type: Symbol
+              symbol: in
+          trailing_trivia:
+            - start_position:
+                bytes: 19
+                line: 1
+                character: 20
+              end_position:
+                bytes: 20
+                line: 1
+                character: 21
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        end_position:
+                          bytes: 25
+                          line: 1
+                          character: 26
+                        token_type:
+                          type: Identifier
+                          identifier: pairs
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 25
+                                      line: 1
+                                      character: 26
+                                    end_position:
+                                      bytes: 26
+                                      line: 1
+                                      character: 27
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 30
+                                      line: 1
+                                      character: 31
+                                    end_position:
+                                      bytes: 31
+                                      line: 1
+                                      character: 32
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 31
+                                        line: 1
+                                        character: 32
+                                      end_position:
+                                        bytes: 32
+                                        line: 1
+                                        character: 33
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                            arguments:
+                              pairs:
+                                - End:
+                                    Var:
+                                      Name:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 26
+                                            line: 1
+                                            character: 27
+                                          end_position:
+                                            bytes: 30
+                                            line: 1
+                                            character: 31
+                                          token_type:
+                                            type: Identifier
+                                            identifier: list
+                                        trailing_trivia: []
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 32
+              line: 1
+              character: 33
+            end_position:
+              bytes: 34
+              line: 1
+              character: 35
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 34
+                line: 1
+                character: 35
+              end_position:
+                bytes: 35
+                line: 1
+                character: 35
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 35
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 36
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 36
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 40
+                          line: 2
+                          character: 6
+                        token_type:
+                          type: Identifier
+                          identifier: call
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 40
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 41
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 53
+                                      line: 2
+                                      character: 19
+                                    end_position:
+                                      bytes: 54
+                                      line: 2
+                                      character: 20
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 54
+                                        line: 2
+                                        character: 20
+                                      end_position:
+                                        bytes: 55
+                                        line: 2
+                                        character: 20
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs:
+                                - Punctuated:
+                                    - Var:
+                                        Name:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 41
+                                              line: 2
+                                              character: 7
+                                            end_position:
+                                              bytes: 46
+                                              line: 2
+                                              character: 12
+                                            token_type:
+                                              type: Identifier
+                                              identifier: index
+                                          trailing_trivia: []
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 46
+                                          line: 2
+                                          character: 12
+                                        end_position:
+                                          bytes: 47
+                                          line: 2
+                                          character: 13
+                                        token_type:
+                                          type: Symbol
+                                          symbol: ","
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 47
+                                            line: 2
+                                            character: 13
+                                          end_position:
+                                            bytes: 48
+                                            line: 2
+                                            character: 14
+                                          token_type:
+                                            type: Whitespace
+                                            characters: " "
+                                - End:
+                                    Var:
+                                      Name:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 48
+                                            line: 2
+                                            character: 14
+                                          end_position:
+                                            bytes: 53
+                                            line: 2
+                                            character: 19
+                                          token_type:
+                                            type: Identifier
+                                            identifier: value
+                                        trailing_trivia: []
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 55
+              line: 3
+              character: 1
+            end_position:
+              bytes: 58
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/source.lua
new file mode 100644
index 00000000..2838ff25
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/source.lua
@@ -0,0 +1,3 @@
+for index, value in pairs(list) do
+	call(index, value)
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/tokens.snap
new file mode 100644
index 00000000..28a515ba
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-1/tokens.snap
@@ -0,0 +1,303 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/generic-for-loop-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: index
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: value
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: in
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: pairs
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 30
+    line: 1
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: list
+- start_position:
+    bytes: 30
+    line: 1
+    character: 31
+  end_position:
+    bytes: 31
+    line: 1
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 31
+    line: 1
+    character: 32
+  end_position:
+    bytes: 32
+    line: 1
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 32
+    line: 1
+    character: 33
+  end_position:
+    bytes: 34
+    line: 1
+    character: 35
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 34
+    line: 1
+    character: 35
+  end_position:
+    bytes: 35
+    line: 1
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 35
+    line: 2
+    character: 1
+  end_position:
+    bytes: 36
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 36
+    line: 2
+    character: 2
+  end_position:
+    bytes: 40
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 40
+    line: 2
+    character: 6
+  end_position:
+    bytes: 41
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 41
+    line: 2
+    character: 7
+  end_position:
+    bytes: 46
+    line: 2
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: index
+- start_position:
+    bytes: 46
+    line: 2
+    character: 12
+  end_position:
+    bytes: 47
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 47
+    line: 2
+    character: 13
+  end_position:
+    bytes: 48
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 48
+    line: 2
+    character: 14
+  end_position:
+    bytes: 53
+    line: 2
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: value
+- start_position:
+    bytes: 53
+    line: 2
+    character: 19
+  end_position:
+    bytes: 54
+    line: 2
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 54
+    line: 2
+    character: 20
+  end_position:
+    bytes: 55
+    line: 2
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 55
+    line: 3
+    character: 1
+  end_position:
+    bytes: 58
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 58
+    line: 3
+    character: 4
+  end_position:
+    bytes: 58
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/ast.snap
new file mode 100644
index 00000000..5f58a2c8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/ast.snap
@@ -0,0 +1,380 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/generic-for-loop-2
+---
+stmts:
+  - - GenericFor:
+        for_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: for
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        names:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    token_type:
+                      type: Identifier
+                      identifier: index
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  end_position:
+                    bytes: 16
+                    line: 1
+                    character: 17
+                  token_type:
+                    type: Identifier
+                    identifier: value
+                trailing_trivia:
+                  - start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        in_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 17
+              line: 1
+              character: 18
+            end_position:
+              bytes: 19
+              line: 1
+              character: 20
+            token_type:
+              type: Symbol
+              symbol: in
+          trailing_trivia:
+            - start_position:
+                bytes: 19
+                line: 1
+                character: 20
+              end_position:
+                bytes: 20
+                line: 1
+                character: 21
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - Punctuated:
+                - Var:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        end_position:
+                          bytes: 24
+                          line: 1
+                          character: 25
+                        token_type:
+                          type: Identifier
+                          identifier: next
+                      trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 24
+                      line: 1
+                      character: 25
+                    end_position:
+                      bytes: 25
+                      line: 1
+                      character: 26
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 25
+                        line: 1
+                        character: 26
+                      end_position:
+                        bytes: 26
+                        line: 1
+                        character: 27
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 26
+                        line: 1
+                        character: 27
+                      end_position:
+                        bytes: 30
+                        line: 1
+                        character: 31
+                      token_type:
+                        type: Identifier
+                        identifier: list
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 30
+                          line: 1
+                          character: 31
+                        end_position:
+                          bytes: 31
+                          line: 1
+                          character: 32
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 31
+              line: 1
+              character: 32
+            end_position:
+              bytes: 33
+              line: 1
+              character: 34
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 33
+                line: 1
+                character: 34
+              end_position:
+                bytes: 34
+                line: 1
+                character: 34
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 34
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 35
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 35
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 39
+                          line: 2
+                          character: 6
+                        token_type:
+                          type: Identifier
+                          identifier: call
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 39
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 40
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 52
+                                      line: 2
+                                      character: 19
+                                    end_position:
+                                      bytes: 53
+                                      line: 2
+                                      character: 20
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 53
+                                        line: 2
+                                        character: 20
+                                      end_position:
+                                        bytes: 54
+                                        line: 2
+                                        character: 20
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs:
+                                - Punctuated:
+                                    - Var:
+                                        Name:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 40
+                                              line: 2
+                                              character: 7
+                                            end_position:
+                                              bytes: 45
+                                              line: 2
+                                              character: 12
+                                            token_type:
+                                              type: Identifier
+                                              identifier: index
+                                          trailing_trivia: []
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 45
+                                          line: 2
+                                          character: 12
+                                        end_position:
+                                          bytes: 46
+                                          line: 2
+                                          character: 13
+                                        token_type:
+                                          type: Symbol
+                                          symbol: ","
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 46
+                                            line: 2
+                                            character: 13
+                                          end_position:
+                                            bytes: 47
+                                            line: 2
+                                            character: 14
+                                          token_type:
+                                            type: Whitespace
+                                            characters: " "
+                                - End:
+                                    Var:
+                                      Name:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 47
+                                            line: 2
+                                            character: 14
+                                          end_position:
+                                            bytes: 52
+                                            line: 2
+                                            character: 19
+                                          token_type:
+                                            type: Identifier
+                                            identifier: value
+                                        trailing_trivia: []
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 54
+              line: 3
+              character: 1
+            end_position:
+              bytes: 57
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/source.lua
new file mode 100644
index 00000000..2ddbbb6a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/source.lua
@@ -0,0 +1,3 @@
+for index, value in next, list do
+	call(index, value)
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/tokens.snap
new file mode 100644
index 00000000..9e07f1b1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/generic-for-loop-2/tokens.snap
@@ -0,0 +1,303 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/generic-for-loop-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: index
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: value
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: in
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: next
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 30
+    line: 1
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: list
+- start_position:
+    bytes: 30
+    line: 1
+    character: 31
+  end_position:
+    bytes: 31
+    line: 1
+    character: 32
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 31
+    line: 1
+    character: 32
+  end_position:
+    bytes: 33
+    line: 1
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 33
+    line: 1
+    character: 34
+  end_position:
+    bytes: 34
+    line: 1
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 34
+    line: 2
+    character: 1
+  end_position:
+    bytes: 35
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 35
+    line: 2
+    character: 2
+  end_position:
+    bytes: 39
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 39
+    line: 2
+    character: 6
+  end_position:
+    bytes: 40
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 40
+    line: 2
+    character: 7
+  end_position:
+    bytes: 45
+    line: 2
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: index
+- start_position:
+    bytes: 45
+    line: 2
+    character: 12
+  end_position:
+    bytes: 46
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 46
+    line: 2
+    character: 13
+  end_position:
+    bytes: 47
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 47
+    line: 2
+    character: 14
+  end_position:
+    bytes: 52
+    line: 2
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: value
+- start_position:
+    bytes: 52
+    line: 2
+    character: 19
+  end_position:
+    bytes: 53
+    line: 2
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 53
+    line: 2
+    character: 20
+  end_position:
+    bytes: 54
+    line: 2
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 54
+    line: 3
+    character: 1
+  end_position:
+    bytes: 57
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 57
+    line: 3
+    character: 4
+  end_position:
+    bytes: 57
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/ast.snap
new file mode 100644
index 00000000..59278e60
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/ast.snap
@@ -0,0 +1,133 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/goto-as-identifier
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia:
+              - start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 48
+                  line: 1
+                  character: 49
+                token_type:
+                  type: SingleLineComment
+                  comment: " goto as an identifier is permitted in lua 5.1"
+              - start_position:
+                  bytes: 48
+                  line: 1
+                  character: 49
+                end_position:
+                  bytes: 49
+                  line: 1
+                  character: 49
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 49
+                line: 2
+                character: 1
+              end_position:
+                bytes: 53
+                line: 2
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: self
+            trailing_trivia: []
+        suffixes:
+          - Index:
+              Dot:
+                dot:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 53
+                      line: 2
+                      character: 5
+                    end_position:
+                      bytes: 54
+                      line: 2
+                      character: 6
+                    token_type:
+                      type: Symbol
+                      symbol: "."
+                  trailing_trivia: []
+                name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 54
+                      line: 2
+                      character: 6
+                    end_position:
+                      bytes: 58
+                      line: 2
+                      character: 10
+                    token_type:
+                      type: Identifier
+                      identifier: goto
+                  trailing_trivia: []
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 58
+                            line: 2
+                            character: 10
+                          end_position:
+                            bytes: 59
+                            line: 2
+                            character: 11
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 64
+                            line: 2
+                            character: 16
+                          end_position:
+                            bytes: 65
+                            line: 2
+                            character: 17
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 59
+                                line: 2
+                                character: 11
+                              end_position:
+                                bytes: 64
+                                line: 2
+                                character: 16
+                              token_type:
+                                type: StringLiteral
+                                literal: foo
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/source.lua
new file mode 100644
index 00000000..4a6afecf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/source.lua
@@ -0,0 +1,2 @@
+-- goto as an identifier is permitted in lua 5.1
+self.goto("foo")
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/tokens.snap
new file mode 100644
index 00000000..793591ea
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/goto-as-identifier/tokens.snap
@@ -0,0 +1,105 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 48
+    line: 1
+    character: 49
+  token_type:
+    type: SingleLineComment
+    comment: " goto as an identifier is permitted in lua 5.1"
+- start_position:
+    bytes: 48
+    line: 1
+    character: 49
+  end_position:
+    bytes: 49
+    line: 1
+    character: 49
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 49
+    line: 2
+    character: 1
+  end_position:
+    bytes: 53
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: self
+- start_position:
+    bytes: 53
+    line: 2
+    character: 5
+  end_position:
+    bytes: 54
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 54
+    line: 2
+    character: 6
+  end_position:
+    bytes: 58
+    line: 2
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: goto
+- start_position:
+    bytes: 58
+    line: 2
+    character: 10
+  end_position:
+    bytes: 59
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 59
+    line: 2
+    character: 11
+  end_position:
+    bytes: 64
+    line: 2
+    character: 16
+  token_type:
+    type: StringLiteral
+    literal: foo
+    quote_type: Double
+- start_position:
+    bytes: 64
+    line: 2
+    character: 16
+  end_position:
+    bytes: 65
+    line: 2
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 65
+    line: 2
+    character: 17
+  end_position:
+    bytes: 65
+    line: 2
+    character: 17
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/ast.snap
new file mode 100644
index 00000000..c93c7d18
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/ast.snap
@@ -0,0 +1,684 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/gt-lt
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          end_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          end_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 11
+                              line: 1
+                              character: 12
+                            end_position:
+                              bytes: 12
+                              line: 1
+                              character: 12
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          BinaryOperator:
+                            lhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 5
+                                    line: 1
+                                    character: 6
+                                  end_position:
+                                    bytes: 6
+                                    line: 1
+                                    character: 7
+                                  token_type:
+                                    type: Number
+                                    text: "1"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 6
+                                      line: 1
+                                      character: 7
+                                    end_position:
+                                      bytes: 7
+                                      line: 1
+                                      character: 8
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            binop:
+                              LessThan:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 7
+                                    line: 1
+                                    character: 8
+                                  end_position:
+                                    bytes: 8
+                                    line: 1
+                                    character: 9
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "<"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 8
+                                      line: 1
+                                      character: 9
+                                    end_position:
+                                      bytes: 9
+                                      line: 1
+                                      character: 10
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            rhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 9
+                                    line: 1
+                                    character: 10
+                                  end_position:
+                                    bytes: 10
+                                    line: 1
+                                    character: 11
+                                  token_type:
+                                    type: Number
+                                    text: "2"
+                                trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 12
+                line: 2
+                character: 1
+              end_position:
+                bytes: 16
+                line: 2
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 16
+                            line: 2
+                            character: 5
+                          end_position:
+                            bytes: 17
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 23
+                            line: 2
+                            character: 12
+                          end_position:
+                            bytes: 24
+                            line: 2
+                            character: 13
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 24
+                              line: 2
+                              character: 13
+                            end_position:
+                              bytes: 25
+                              line: 2
+                              character: 13
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          BinaryOperator:
+                            lhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 17
+                                    line: 2
+                                    character: 6
+                                  end_position:
+                                    bytes: 18
+                                    line: 2
+                                    character: 7
+                                  token_type:
+                                    type: Number
+                                    text: "1"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 18
+                                      line: 2
+                                      character: 7
+                                    end_position:
+                                      bytes: 19
+                                      line: 2
+                                      character: 8
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            binop:
+                              LessThanEqual:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 19
+                                    line: 2
+                                    character: 8
+                                  end_position:
+                                    bytes: 21
+                                    line: 2
+                                    character: 10
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "<="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 21
+                                      line: 2
+                                      character: 10
+                                    end_position:
+                                      bytes: 22
+                                      line: 2
+                                      character: 11
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            rhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 22
+                                    line: 2
+                                    character: 11
+                                  end_position:
+                                    bytes: 23
+                                    line: 2
+                                    character: 12
+                                  token_type:
+                                    type: Number
+                                    text: "2"
+                                trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 25
+                line: 3
+                character: 1
+              end_position:
+                bytes: 29
+                line: 3
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 29
+                            line: 3
+                            character: 5
+                          end_position:
+                            bytes: 30
+                            line: 3
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 35
+                            line: 3
+                            character: 11
+                          end_position:
+                            bytes: 36
+                            line: 3
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 36
+                              line: 3
+                              character: 12
+                            end_position:
+                              bytes: 37
+                              line: 3
+                              character: 12
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          BinaryOperator:
+                            lhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 30
+                                    line: 3
+                                    character: 6
+                                  end_position:
+                                    bytes: 31
+                                    line: 3
+                                    character: 7
+                                  token_type:
+                                    type: Number
+                                    text: "2"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 31
+                                      line: 3
+                                      character: 7
+                                    end_position:
+                                      bytes: 32
+                                      line: 3
+                                      character: 8
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            binop:
+                              GreaterThan:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 32
+                                    line: 3
+                                    character: 8
+                                  end_position:
+                                    bytes: 33
+                                    line: 3
+                                    character: 9
+                                  token_type:
+                                    type: Symbol
+                                    symbol: ">"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 33
+                                      line: 3
+                                      character: 9
+                                    end_position:
+                                      bytes: 34
+                                      line: 3
+                                      character: 10
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            rhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 34
+                                    line: 3
+                                    character: 10
+                                  end_position:
+                                    bytes: 35
+                                    line: 3
+                                    character: 11
+                                  token_type:
+                                    type: Number
+                                    text: "1"
+                                trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 37
+                line: 4
+                character: 1
+              end_position:
+                bytes: 41
+                line: 4
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 41
+                            line: 4
+                            character: 5
+                          end_position:
+                            bytes: 42
+                            line: 4
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 48
+                            line: 4
+                            character: 12
+                          end_position:
+                            bytes: 49
+                            line: 4
+                            character: 13
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 49
+                              line: 4
+                              character: 13
+                            end_position:
+                              bytes: 50
+                              line: 4
+                              character: 13
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          BinaryOperator:
+                            lhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 42
+                                    line: 4
+                                    character: 6
+                                  end_position:
+                                    bytes: 43
+                                    line: 4
+                                    character: 7
+                                  token_type:
+                                    type: Number
+                                    text: "2"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 43
+                                      line: 4
+                                      character: 7
+                                    end_position:
+                                      bytes: 44
+                                      line: 4
+                                      character: 8
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            binop:
+                              GreaterThanEqual:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 44
+                                    line: 4
+                                    character: 8
+                                  end_position:
+                                    bytes: 46
+                                    line: 4
+                                    character: 10
+                                  token_type:
+                                    type: Symbol
+                                    symbol: ">="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 46
+                                      line: 4
+                                      character: 10
+                                    end_position:
+                                      bytes: 47
+                                      line: 4
+                                      character: 11
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            rhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 47
+                                    line: 4
+                                    character: 11
+                                  end_position:
+                                    bytes: 48
+                                    line: 4
+                                    character: 12
+                                  token_type:
+                                    type: Number
+                                    text: "1"
+                                trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 50
+                line: 5
+                character: 1
+              end_position:
+                bytes: 54
+                line: 5
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 54
+                            line: 5
+                            character: 5
+                          end_position:
+                            bytes: 55
+                            line: 5
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 61
+                            line: 5
+                            character: 12
+                          end_position:
+                            bytes: 62
+                            line: 5
+                            character: 13
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          BinaryOperator:
+                            lhs:
+                              Var:
+                                Name:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 55
+                                      line: 5
+                                      character: 6
+                                    end_position:
+                                      bytes: 56
+                                      line: 5
+                                      character: 7
+                                    token_type:
+                                      type: Identifier
+                                      identifier: x
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 56
+                                        line: 5
+                                        character: 7
+                                      end_position:
+                                        bytes: 57
+                                        line: 5
+                                        character: 8
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                            binop:
+                              GreaterThanEqual:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 57
+                                    line: 5
+                                    character: 8
+                                  end_position:
+                                    bytes: 59
+                                    line: 5
+                                    character: 10
+                                  token_type:
+                                    type: Symbol
+                                    symbol: ">="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 59
+                                      line: 5
+                                      character: 10
+                                    end_position:
+                                      bytes: 60
+                                      line: 5
+                                      character: 11
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            rhs:
+                              Var:
+                                Name:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 60
+                                      line: 5
+                                      character: 11
+                                    end_position:
+                                      bytes: 61
+                                      line: 5
+                                      character: 12
+                                    token_type:
+                                      type: Identifier
+                                      identifier: y
+                                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/source.lua
new file mode 100644
index 00000000..54e1cf52
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/source.lua
@@ -0,0 +1,5 @@
+call(1 < 2)
+call(1 <= 2)
+call(2 > 1)
+call(2 >= 1)
+call(x >= y)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/tokens.snap
new file mode 100644
index 00000000..df669f6a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/gt-lt/tokens.snap
@@ -0,0 +1,501 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/gt-lt
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 16
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 16
+    line: 2
+    character: 5
+  end_position:
+    bytes: 17
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 2
+    character: 6
+  end_position:
+    bytes: 18
+    line: 2
+    character: 7
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 18
+    line: 2
+    character: 7
+  end_position:
+    bytes: 19
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 8
+  end_position:
+    bytes: 21
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "<="
+- start_position:
+    bytes: 21
+    line: 2
+    character: 10
+  end_position:
+    bytes: 22
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 11
+  end_position:
+    bytes: 23
+    line: 2
+    character: 12
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 23
+    line: 2
+    character: 12
+  end_position:
+    bytes: 24
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 24
+    line: 2
+    character: 13
+  end_position:
+    bytes: 25
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 25
+    line: 3
+    character: 1
+  end_position:
+    bytes: 29
+    line: 3
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 29
+    line: 3
+    character: 5
+  end_position:
+    bytes: 30
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 30
+    line: 3
+    character: 6
+  end_position:
+    bytes: 31
+    line: 3
+    character: 7
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 31
+    line: 3
+    character: 7
+  end_position:
+    bytes: 32
+    line: 3
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 32
+    line: 3
+    character: 8
+  end_position:
+    bytes: 33
+    line: 3
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 33
+    line: 3
+    character: 9
+  end_position:
+    bytes: 34
+    line: 3
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 34
+    line: 3
+    character: 10
+  end_position:
+    bytes: 35
+    line: 3
+    character: 11
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 35
+    line: 3
+    character: 11
+  end_position:
+    bytes: 36
+    line: 3
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 36
+    line: 3
+    character: 12
+  end_position:
+    bytes: 37
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 37
+    line: 4
+    character: 1
+  end_position:
+    bytes: 41
+    line: 4
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 41
+    line: 4
+    character: 5
+  end_position:
+    bytes: 42
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 42
+    line: 4
+    character: 6
+  end_position:
+    bytes: 43
+    line: 4
+    character: 7
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 43
+    line: 4
+    character: 7
+  end_position:
+    bytes: 44
+    line: 4
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 44
+    line: 4
+    character: 8
+  end_position:
+    bytes: 46
+    line: 4
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: ">="
+- start_position:
+    bytes: 46
+    line: 4
+    character: 10
+  end_position:
+    bytes: 47
+    line: 4
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 47
+    line: 4
+    character: 11
+  end_position:
+    bytes: 48
+    line: 4
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 48
+    line: 4
+    character: 12
+  end_position:
+    bytes: 49
+    line: 4
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 49
+    line: 4
+    character: 13
+  end_position:
+    bytes: 50
+    line: 4
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 50
+    line: 5
+    character: 1
+  end_position:
+    bytes: 54
+    line: 5
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 54
+    line: 5
+    character: 5
+  end_position:
+    bytes: 55
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 55
+    line: 5
+    character: 6
+  end_position:
+    bytes: 56
+    line: 5
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 56
+    line: 5
+    character: 7
+  end_position:
+    bytes: 57
+    line: 5
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 57
+    line: 5
+    character: 8
+  end_position:
+    bytes: 59
+    line: 5
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: ">="
+- start_position:
+    bytes: 59
+    line: 5
+    character: 10
+  end_position:
+    bytes: 60
+    line: 5
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 60
+    line: 5
+    character: 11
+  end_position:
+    bytes: 61
+    line: 5
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 61
+    line: 5
+    character: 12
+  end_position:
+    bytes: 62
+    line: 5
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 62
+    line: 5
+    character: 13
+  end_position:
+    bytes: 62
+    line: 5
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/if-1/ast.snap
new file mode 100644
index 00000000..1102488e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-1/ast.snap
@@ -0,0 +1,186 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/if-1
+---
+stmts:
+  - - If:
+        if_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 2
+              line: 1
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: if
+          trailing_trivia:
+            - start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: " "
+        condition:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Identifier
+                  identifier: x
+              trailing_trivia:
+                - start_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  end_position:
+                    bytes: 5
+                    line: 1
+                    character: 6
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+        then_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: then
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 10
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 11
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 11
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 15
+                          line: 2
+                          character: 6
+                        token_type:
+                          type: Identifier
+                          identifier: call
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 16
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 16
+                                      line: 2
+                                      character: 7
+                                    end_position:
+                                      bytes: 17
+                                      line: 2
+                                      character: 8
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 17
+                                        line: 2
+                                        character: 8
+                                      end_position:
+                                        bytes: 18
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+        else_if: ~
+        else_token: ~
+        else: ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 18
+              line: 3
+              character: 1
+            end_position:
+              bytes: 21
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/if-1/source.lua
new file mode 100644
index 00000000..9211c966
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-1/source.lua
@@ -0,0 +1,3 @@
+if x then
+	call()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/if-1/tokens.snap
new file mode 100644
index 00000000..8b7f1476
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-1/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/if-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 11
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 2
+  end_position:
+    bytes: 15
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 15
+    line: 2
+    character: 6
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 17
+    line: 2
+    character: 8
+  end_position:
+    bytes: 18
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 18
+    line: 3
+    character: 1
+  end_position:
+    bytes: 21
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 21
+    line: 3
+    character: 4
+  end_position:
+    bytes: 21
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/if-2/ast.snap
new file mode 100644
index 00000000..c11da4fe
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-2/ast.snap
@@ -0,0 +1,288 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/if-2
+---
+stmts:
+  - - If:
+        if_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 2
+              line: 1
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: if
+          trailing_trivia:
+            - start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: " "
+        condition:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Identifier
+                  identifier: x
+              trailing_trivia:
+                - start_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  end_position:
+                    bytes: 5
+                    line: 1
+                    character: 6
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+        then_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: then
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 10
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 11
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 11
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 14
+                          line: 2
+                          character: 5
+                        token_type:
+                          type: Identifier
+                          identifier: foo
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 14
+                                      line: 2
+                                      character: 5
+                                    end_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 6
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 16
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 16
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 17
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+        else_if: ~
+        else_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 17
+              line: 3
+              character: 1
+            end_position:
+              bytes: 21
+              line: 3
+              character: 5
+            token_type:
+              type: Symbol
+              symbol: else
+          trailing_trivia:
+            - start_position:
+                bytes: 21
+                line: 3
+                character: 5
+              end_position:
+                bytes: 22
+                line: 3
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        else:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 22
+                            line: 4
+                            character: 1
+                          end_position:
+                            bytes: 23
+                            line: 4
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 23
+                          line: 4
+                          character: 2
+                        end_position:
+                          bytes: 26
+                          line: 4
+                          character: 5
+                        token_type:
+                          type: Identifier
+                          identifier: bar
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 26
+                                      line: 4
+                                      character: 5
+                                    end_position:
+                                      bytes: 27
+                                      line: 4
+                                      character: 6
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 27
+                                      line: 4
+                                      character: 6
+                                    end_position:
+                                      bytes: 28
+                                      line: 4
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 28
+                                        line: 4
+                                        character: 7
+                                      end_position:
+                                        bytes: 29
+                                        line: 4
+                                        character: 7
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 29
+              line: 5
+              character: 1
+            end_position:
+              bytes: 32
+              line: 5
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/if-2/source.lua
new file mode 100644
index 00000000..faf9ce59
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-2/source.lua
@@ -0,0 +1,5 @@
+if x then
+	foo()
+else
+	bar()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/if-2/tokens.snap
new file mode 100644
index 00000000..3824b1b9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-2/tokens.snap
@@ -0,0 +1,226 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/if-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 11
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 2
+  end_position:
+    bytes: 14
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 14
+    line: 2
+    character: 5
+  end_position:
+    bytes: 15
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 2
+    character: 6
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 17
+    line: 3
+    character: 1
+  end_position:
+    bytes: 21
+    line: 3
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 21
+    line: 3
+    character: 5
+  end_position:
+    bytes: 22
+    line: 3
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 22
+    line: 4
+    character: 1
+  end_position:
+    bytes: 23
+    line: 4
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 23
+    line: 4
+    character: 2
+  end_position:
+    bytes: 26
+    line: 4
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 26
+    line: 4
+    character: 5
+  end_position:
+    bytes: 27
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 27
+    line: 4
+    character: 6
+  end_position:
+    bytes: 28
+    line: 4
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 28
+    line: 4
+    character: 7
+  end_position:
+    bytes: 29
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 29
+    line: 5
+    character: 1
+  end_position:
+    bytes: 32
+    line: 5
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 32
+    line: 5
+    character: 4
+  end_position:
+    bytes: 32
+    line: 5
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/if-3/ast.snap
new file mode 100644
index 00000000..d439a602
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-3/ast.snap
@@ -0,0 +1,344 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/if-3
+---
+stmts:
+  - - If:
+        if_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 2
+              line: 1
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: if
+          trailing_trivia:
+            - start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: " "
+        condition:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Identifier
+                  identifier: x
+              trailing_trivia:
+                - start_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  end_position:
+                    bytes: 5
+                    line: 1
+                    character: 6
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+        then_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: then
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 10
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 11
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 11
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 14
+                          line: 2
+                          character: 5
+                        token_type:
+                          type: Identifier
+                          identifier: foo
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 14
+                                      line: 2
+                                      character: 5
+                                    end_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 6
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 16
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 16
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 17
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+        else_if:
+          - else_if_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 17
+                  line: 3
+                  character: 1
+                end_position:
+                  bytes: 23
+                  line: 3
+                  character: 7
+                token_type:
+                  type: Symbol
+                  symbol: elseif
+              trailing_trivia:
+                - start_position:
+                    bytes: 23
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 24
+                    line: 3
+                    character: 8
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            condition:
+              Var:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 24
+                      line: 3
+                      character: 8
+                    end_position:
+                      bytes: 25
+                      line: 3
+                      character: 9
+                    token_type:
+                      type: Identifier
+                      identifier: y
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 25
+                        line: 3
+                        character: 9
+                      end_position:
+                        bytes: 26
+                        line: 3
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            then_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 26
+                  line: 3
+                  character: 10
+                end_position:
+                  bytes: 30
+                  line: 3
+                  character: 14
+                token_type:
+                  type: Symbol
+                  symbol: then
+              trailing_trivia:
+                - start_position:
+                    bytes: 30
+                    line: 3
+                    character: 14
+                  end_position:
+                    bytes: 31
+                    line: 3
+                    character: 14
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+            block:
+              stmts:
+                - - FunctionCall:
+                      prefix:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 31
+                                line: 4
+                                character: 1
+                              end_position:
+                                bytes: 32
+                                line: 4
+                                character: 2
+                              token_type:
+                                type: Whitespace
+                                characters: "\t"
+                          token:
+                            start_position:
+                              bytes: 32
+                              line: 4
+                              character: 2
+                            end_position:
+                              bytes: 35
+                              line: 4
+                              character: 5
+                            token_type:
+                              type: Identifier
+                              identifier: bar
+                          trailing_trivia: []
+                      suffixes:
+                        - Call:
+                            AnonymousCall:
+                              Parentheses:
+                                parentheses:
+                                  tokens:
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 35
+                                          line: 4
+                                          character: 5
+                                        end_position:
+                                          bytes: 36
+                                          line: 4
+                                          character: 6
+                                        token_type:
+                                          type: Symbol
+                                          symbol: (
+                                      trailing_trivia: []
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 36
+                                          line: 4
+                                          character: 6
+                                        end_position:
+                                          bytes: 37
+                                          line: 4
+                                          character: 7
+                                        token_type:
+                                          type: Symbol
+                                          symbol: )
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 37
+                                            line: 4
+                                            character: 7
+                                          end_position:
+                                            bytes: 38
+                                            line: 4
+                                            character: 7
+                                          token_type:
+                                            type: Whitespace
+                                            characters: "\n"
+                                arguments:
+                                  pairs: []
+                  - ~
+        else_token: ~
+        else: ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 38
+              line: 5
+              character: 1
+            end_position:
+              bytes: 41
+              line: 5
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/if-3/source.lua
new file mode 100644
index 00000000..6dd9718d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-3/source.lua
@@ -0,0 +1,5 @@
+if x then
+	foo()
+elseif y then
+	bar()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/if-3/tokens.snap
new file mode 100644
index 00000000..0e16a5d7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-3/tokens.snap
@@ -0,0 +1,270 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/if-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 11
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 2
+  end_position:
+    bytes: 14
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 14
+    line: 2
+    character: 5
+  end_position:
+    bytes: 15
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 2
+    character: 6
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 17
+    line: 3
+    character: 1
+  end_position:
+    bytes: 23
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: elseif
+- start_position:
+    bytes: 23
+    line: 3
+    character: 7
+  end_position:
+    bytes: 24
+    line: 3
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 3
+    character: 8
+  end_position:
+    bytes: 25
+    line: 3
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 25
+    line: 3
+    character: 9
+  end_position:
+    bytes: 26
+    line: 3
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 3
+    character: 10
+  end_position:
+    bytes: 30
+    line: 3
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 30
+    line: 3
+    character: 14
+  end_position:
+    bytes: 31
+    line: 3
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 31
+    line: 4
+    character: 1
+  end_position:
+    bytes: 32
+    line: 4
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 32
+    line: 4
+    character: 2
+  end_position:
+    bytes: 35
+    line: 4
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 35
+    line: 4
+    character: 5
+  end_position:
+    bytes: 36
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 36
+    line: 4
+    character: 6
+  end_position:
+    bytes: 37
+    line: 4
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 37
+    line: 4
+    character: 7
+  end_position:
+    bytes: 38
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 38
+    line: 5
+    character: 1
+  end_position:
+    bytes: 41
+    line: 5
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 41
+    line: 5
+    character: 4
+  end_position:
+    bytes: 41
+    line: 5
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/if-4/ast.snap
new file mode 100644
index 00000000..8af517ba
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-4/ast.snap
@@ -0,0 +1,446 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/if-4
+---
+stmts:
+  - - If:
+        if_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 2
+              line: 1
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: if
+          trailing_trivia:
+            - start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: " "
+        condition:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 3
+                  line: 1
+                  character: 4
+                end_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                token_type:
+                  type: Identifier
+                  identifier: x
+              trailing_trivia:
+                - start_position:
+                    bytes: 4
+                    line: 1
+                    character: 5
+                  end_position:
+                    bytes: 5
+                    line: 1
+                    character: 6
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+        then_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: then
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 10
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 11
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 11
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 14
+                          line: 2
+                          character: 5
+                        token_type:
+                          type: Identifier
+                          identifier: foo
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 14
+                                      line: 2
+                                      character: 5
+                                    end_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 6
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 16
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 16
+                                        line: 2
+                                        character: 7
+                                      end_position:
+                                        bytes: 17
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+        else_if:
+          - else_if_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 17
+                  line: 3
+                  character: 1
+                end_position:
+                  bytes: 23
+                  line: 3
+                  character: 7
+                token_type:
+                  type: Symbol
+                  symbol: elseif
+              trailing_trivia:
+                - start_position:
+                    bytes: 23
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 24
+                    line: 3
+                    character: 8
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            condition:
+              Var:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 24
+                      line: 3
+                      character: 8
+                    end_position:
+                      bytes: 25
+                      line: 3
+                      character: 9
+                    token_type:
+                      type: Identifier
+                      identifier: y
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 25
+                        line: 3
+                        character: 9
+                      end_position:
+                        bytes: 26
+                        line: 3
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            then_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 26
+                  line: 3
+                  character: 10
+                end_position:
+                  bytes: 30
+                  line: 3
+                  character: 14
+                token_type:
+                  type: Symbol
+                  symbol: then
+              trailing_trivia:
+                - start_position:
+                    bytes: 30
+                    line: 3
+                    character: 14
+                  end_position:
+                    bytes: 31
+                    line: 3
+                    character: 14
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+            block:
+              stmts:
+                - - FunctionCall:
+                      prefix:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 31
+                                line: 4
+                                character: 1
+                              end_position:
+                                bytes: 32
+                                line: 4
+                                character: 2
+                              token_type:
+                                type: Whitespace
+                                characters: "\t"
+                          token:
+                            start_position:
+                              bytes: 32
+                              line: 4
+                              character: 2
+                            end_position:
+                              bytes: 35
+                              line: 4
+                              character: 5
+                            token_type:
+                              type: Identifier
+                              identifier: bar
+                          trailing_trivia: []
+                      suffixes:
+                        - Call:
+                            AnonymousCall:
+                              Parentheses:
+                                parentheses:
+                                  tokens:
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 35
+                                          line: 4
+                                          character: 5
+                                        end_position:
+                                          bytes: 36
+                                          line: 4
+                                          character: 6
+                                        token_type:
+                                          type: Symbol
+                                          symbol: (
+                                      trailing_trivia: []
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 36
+                                          line: 4
+                                          character: 6
+                                        end_position:
+                                          bytes: 37
+                                          line: 4
+                                          character: 7
+                                        token_type:
+                                          type: Symbol
+                                          symbol: )
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 37
+                                            line: 4
+                                            character: 7
+                                          end_position:
+                                            bytes: 38
+                                            line: 4
+                                            character: 7
+                                          token_type:
+                                            type: Whitespace
+                                            characters: "\n"
+                                arguments:
+                                  pairs: []
+                  - ~
+        else_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 38
+              line: 5
+              character: 1
+            end_position:
+              bytes: 42
+              line: 5
+              character: 5
+            token_type:
+              type: Symbol
+              symbol: else
+          trailing_trivia:
+            - start_position:
+                bytes: 42
+                line: 5
+                character: 5
+              end_position:
+                bytes: 43
+                line: 5
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        else:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 43
+                            line: 6
+                            character: 1
+                          end_position:
+                            bytes: 44
+                            line: 6
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 44
+                          line: 6
+                          character: 2
+                        end_position:
+                          bytes: 47
+                          line: 6
+                          character: 5
+                        token_type:
+                          type: Identifier
+                          identifier: baz
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 47
+                                      line: 6
+                                      character: 5
+                                    end_position:
+                                      bytes: 48
+                                      line: 6
+                                      character: 6
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 48
+                                      line: 6
+                                      character: 6
+                                    end_position:
+                                      bytes: 49
+                                      line: 6
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 49
+                                        line: 6
+                                        character: 7
+                                      end_position:
+                                        bytes: 50
+                                        line: 6
+                                        character: 7
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 50
+              line: 7
+              character: 1
+            end_position:
+              bytes: 53
+              line: 7
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/if-4/source.lua
new file mode 100644
index 00000000..f710ef9a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-4/source.lua
@@ -0,0 +1,7 @@
+if x then
+	foo()
+elseif y then
+	bar()
+else
+	baz()
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/if-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/if-4/tokens.snap
new file mode 100644
index 00000000..daa96296
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/if-4/tokens.snap
@@ -0,0 +1,347 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/if-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 11
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 2
+  end_position:
+    bytes: 14
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 14
+    line: 2
+    character: 5
+  end_position:
+    bytes: 15
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 2
+    character: 6
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 17
+    line: 3
+    character: 1
+  end_position:
+    bytes: 23
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: elseif
+- start_position:
+    bytes: 23
+    line: 3
+    character: 7
+  end_position:
+    bytes: 24
+    line: 3
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 3
+    character: 8
+  end_position:
+    bytes: 25
+    line: 3
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 25
+    line: 3
+    character: 9
+  end_position:
+    bytes: 26
+    line: 3
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 3
+    character: 10
+  end_position:
+    bytes: 30
+    line: 3
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 30
+    line: 3
+    character: 14
+  end_position:
+    bytes: 31
+    line: 3
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 31
+    line: 4
+    character: 1
+  end_position:
+    bytes: 32
+    line: 4
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 32
+    line: 4
+    character: 2
+  end_position:
+    bytes: 35
+    line: 4
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 35
+    line: 4
+    character: 5
+  end_position:
+    bytes: 36
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 36
+    line: 4
+    character: 6
+  end_position:
+    bytes: 37
+    line: 4
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 37
+    line: 4
+    character: 7
+  end_position:
+    bytes: 38
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 38
+    line: 5
+    character: 1
+  end_position:
+    bytes: 42
+    line: 5
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 42
+    line: 5
+    character: 5
+  end_position:
+    bytes: 43
+    line: 5
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 43
+    line: 6
+    character: 1
+  end_position:
+    bytes: 44
+    line: 6
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 44
+    line: 6
+    character: 2
+  end_position:
+    bytes: 47
+    line: 6
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 47
+    line: 6
+    character: 5
+  end_position:
+    bytes: 48
+    line: 6
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 48
+    line: 6
+    character: 6
+  end_position:
+    bytes: 49
+    line: 6
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 49
+    line: 6
+    character: 7
+  end_position:
+    bytes: 50
+    line: 6
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 50
+    line: 7
+    character: 1
+  end_position:
+    bytes: 53
+    line: 7
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 53
+    line: 7
+    character: 4
+  end_position:
+    bytes: 53
+    line: 7
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/index-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/index-1/ast.snap
new file mode 100644
index 00000000..80575bcd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/index-1/ast.snap
@@ -0,0 +1,176 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/index-1
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Var:
+                  Expression:
+                    prefix:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          end_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          token_type:
+                            type: Identifier
+                            identifier: a
+                        trailing_trivia: []
+                    suffixes:
+                      - Index:
+                          Dot:
+                            dot:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 11
+                                  line: 1
+                                  character: 12
+                                end_position:
+                                  bytes: 12
+                                  line: 1
+                                  character: 13
+                                token_type:
+                                  type: Symbol
+                                  symbol: "."
+                              trailing_trivia: []
+                            name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 12
+                                  line: 1
+                                  character: 13
+                                end_position:
+                                  bytes: 13
+                                  line: 1
+                                  character: 14
+                                token_type:
+                                  type: Identifier
+                                  identifier: b
+                              trailing_trivia: []
+                      - Index:
+                          Dot:
+                            dot:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 13
+                                  line: 1
+                                  character: 14
+                                end_position:
+                                  bytes: 14
+                                  line: 1
+                                  character: 15
+                                token_type:
+                                  type: Symbol
+                                  symbol: "."
+                              trailing_trivia: []
+                            name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 14
+                                  line: 1
+                                  character: 15
+                                end_position:
+                                  bytes: 15
+                                  line: 1
+                                  character: 16
+                                token_type:
+                                  type: Identifier
+                                  identifier: c
+                              trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/index-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/index-1/source.lua
new file mode 100644
index 00000000..81c84820
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/index-1/source.lua
@@ -0,0 +1 @@
+local x = a.b.c
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/index-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/index-1/tokens.snap
new file mode 100644
index 00000000..e077e506
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/index-1/tokens.snap
@@ -0,0 +1,138 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/index-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/index-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/index-2/ast.snap
new file mode 100644
index 00000000..ec946cc3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/index-2/ast.snap
@@ -0,0 +1,196 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/index-2
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Var:
+                  Expression:
+                    prefix:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          end_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 14
+                                        line: 1
+                                        character: 15
+                                      end_position:
+                                        bytes: 15
+                                        line: 1
+                                        character: 16
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 18
+                                        line: 1
+                                        character: 19
+                                      end_position:
+                                        bytes: 19
+                                        line: 1
+                                        character: 20
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs:
+                                  - End:
+                                      String:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 15
+                                            line: 1
+                                            character: 16
+                                          end_position:
+                                            bytes: 18
+                                            line: 1
+                                            character: 19
+                                          token_type:
+                                            type: StringLiteral
+                                            literal: a
+                                            quote_type: Double
+                                        trailing_trivia: []
+                      - Index:
+                          Dot:
+                            dot:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 19
+                                  line: 1
+                                  character: 20
+                                end_position:
+                                  bytes: 20
+                                  line: 1
+                                  character: 21
+                                token_type:
+                                  type: Symbol
+                                  symbol: "."
+                              trailing_trivia: []
+                            name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 20
+                                  line: 1
+                                  character: 21
+                                end_position:
+                                  bytes: 21
+                                  line: 1
+                                  character: 22
+                                token_type:
+                                  type: Identifier
+                                  identifier: b
+                              trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/index-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/index-2/source.lua
new file mode 100644
index 00000000..1db46c3b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/index-2/source.lua
@@ -0,0 +1 @@
+local x = call("a").b
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/index-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/index-2/tokens.snap
new file mode 100644
index 00000000..fc7c3722
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/index-2/tokens.snap
@@ -0,0 +1,150 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/index-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: StringLiteral
+    literal: a
+    quote_type: Double
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/ast.snap
new file mode 100644
index 00000000..8c25f01a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/ast.snap
@@ -0,0 +1,56 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/local-assignment-1
+
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia: []
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/source.lua
new file mode 100644
index 00000000..da0c326a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/source.lua
@@ -0,0 +1 @@
+local x
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/tokens.snap
new file mode 100644
index 00000000..770c6551
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/local-assignment-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/ast.snap
new file mode 100644
index 00000000..fadcf3e2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/ast.snap
@@ -0,0 +1,108 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/local-assignment-2
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/source.lua
new file mode 100644
index 00000000..aa28c09f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/source.lua
@@ -0,0 +1 @@
+local x = 1
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/tokens.snap
new file mode 100644
index 00000000..7f0e22c0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-2/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/local-assignment-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/ast.snap
new file mode 100644
index 00000000..9f61423c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/ast.snap
@@ -0,0 +1,573 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/local-assignment-3
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: a
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      end_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  end_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: b
+                trailing_trivia:
+                  - start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 11
+              line: 1
+              character: 12
+            end_position:
+              bytes: 12
+              line: 1
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 12
+                line: 1
+                character: 13
+              end_position:
+                bytes: 13
+                line: 1
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - Punctuated:
+                - Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 13
+                        line: 1
+                        character: 14
+                      end_position:
+                        bytes: 14
+                        line: 1
+                        character: 15
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    end_position:
+                      bytes: 15
+                      line: 1
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 17
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Number
+                      text: "2"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 17
+                        line: 1
+                        character: 18
+                      end_position:
+                        bytes: 18
+                        line: 1
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 18
+              line: 2
+              character: 1
+            end_position:
+              bytes: 23
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 23
+                line: 2
+                character: 6
+              end_position:
+                bytes: 24
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 24
+                      line: 2
+                      character: 7
+                    end_position:
+                      bytes: 25
+                      line: 2
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: c
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 25
+                      line: 2
+                      character: 8
+                    end_position:
+                      bytes: 26
+                      line: 2
+                      character: 9
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 26
+                        line: 2
+                        character: 9
+                      end_position:
+                        bytes: 27
+                        line: 2
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 27
+                    line: 2
+                    character: 10
+                  end_position:
+                    bytes: 28
+                    line: 2
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: d
+                trailing_trivia:
+                  - start_position:
+                      bytes: 28
+                      line: 2
+                      character: 11
+                    end_position:
+                      bytes: 29
+                      line: 2
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 29
+              line: 2
+              character: 12
+            end_position:
+              bytes: 30
+              line: 2
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 30
+                line: 2
+                character: 13
+              end_position:
+                bytes: 31
+                line: 2
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - Punctuated:
+                - Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 31
+                        line: 2
+                        character: 14
+                      end_position:
+                        bytes: 32
+                        line: 2
+                        character: 15
+                      token_type:
+                        type: Number
+                        text: "3"
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 32
+                      line: 2
+                      character: 15
+                    end_position:
+                      bytes: 33
+                      line: 2
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 33
+                        line: 2
+                        character: 16
+                      end_position:
+                        bytes: 34
+                        line: 2
+                        character: 17
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 34
+                      line: 2
+                      character: 17
+                    end_position:
+                      bytes: 35
+                      line: 2
+                      character: 18
+                    token_type:
+                      type: Number
+                      text: "4"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 35
+                        line: 2
+                        character: 18
+                      end_position:
+                        bytes: 36
+                        line: 2
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 36
+              line: 3
+              character: 1
+            end_position:
+              bytes: 41
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 41
+                line: 3
+                character: 6
+              end_position:
+                bytes: 42
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 42
+                      line: 3
+                      character: 7
+                    end_position:
+                      bytes: 43
+                      line: 3
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: e
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 43
+                      line: 3
+                      character: 8
+                    end_position:
+                      bytes: 44
+                      line: 3
+                      character: 9
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 44
+                        line: 3
+                        character: 9
+                      end_position:
+                        bytes: 45
+                        line: 3
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 45
+                    line: 3
+                    character: 10
+                  end_position:
+                    bytes: 46
+                    line: 3
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: f
+                trailing_trivia:
+                  - start_position:
+                      bytes: 46
+                      line: 3
+                      character: 11
+                    end_position:
+                      bytes: 47
+                      line: 3
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 47
+              line: 3
+              character: 12
+            end_position:
+              bytes: 48
+              line: 3
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 48
+                line: 3
+                character: 13
+              end_position:
+                bytes: 49
+                line: 3
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - Punctuated:
+                - Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 49
+                        line: 3
+                        character: 14
+                      end_position:
+                        bytes: 50
+                        line: 3
+                        character: 15
+                      token_type:
+                        type: Number
+                        text: "5"
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 50
+                      line: 3
+                      character: 15
+                    end_position:
+                      bytes: 51
+                      line: 3
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 51
+                        line: 3
+                        character: 16
+                      end_position:
+                        bytes: 52
+                        line: 3
+                        character: 17
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 52
+                      line: 3
+                      character: 17
+                    end_position:
+                      bytes: 53
+                      line: 3
+                      character: 18
+                    token_type:
+                      type: Number
+                      text: "6"
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/source.lua
new file mode 100644
index 00000000..74c0ed47
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/source.lua
@@ -0,0 +1,3 @@
+local a, b = 1, 2
+local c, d = 3, 4
+local e, f = 5, 6
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/tokens.snap
new file mode 100644
index 00000000..1ebb9f19
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-3/tokens.snap
@@ -0,0 +1,468 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/local-assignment-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 18
+    line: 2
+    character: 1
+  end_position:
+    bytes: 23
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 23
+    line: 2
+    character: 6
+  end_position:
+    bytes: 24
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 2
+    character: 7
+  end_position:
+    bytes: 25
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 25
+    line: 2
+    character: 8
+  end_position:
+    bytes: 26
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 26
+    line: 2
+    character: 9
+  end_position:
+    bytes: 27
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 27
+    line: 2
+    character: 10
+  end_position:
+    bytes: 28
+    line: 2
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: d
+- start_position:
+    bytes: 28
+    line: 2
+    character: 11
+  end_position:
+    bytes: 29
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 29
+    line: 2
+    character: 12
+  end_position:
+    bytes: 30
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 30
+    line: 2
+    character: 13
+  end_position:
+    bytes: 31
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 31
+    line: 2
+    character: 14
+  end_position:
+    bytes: 32
+    line: 2
+    character: 15
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 32
+    line: 2
+    character: 15
+  end_position:
+    bytes: 33
+    line: 2
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 33
+    line: 2
+    character: 16
+  end_position:
+    bytes: 34
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 34
+    line: 2
+    character: 17
+  end_position:
+    bytes: 35
+    line: 2
+    character: 18
+  token_type:
+    type: Number
+    text: "4"
+- start_position:
+    bytes: 35
+    line: 2
+    character: 18
+  end_position:
+    bytes: 36
+    line: 2
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 36
+    line: 3
+    character: 1
+  end_position:
+    bytes: 41
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 41
+    line: 3
+    character: 6
+  end_position:
+    bytes: 42
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 42
+    line: 3
+    character: 7
+  end_position:
+    bytes: 43
+    line: 3
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: e
+- start_position:
+    bytes: 43
+    line: 3
+    character: 8
+  end_position:
+    bytes: 44
+    line: 3
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 44
+    line: 3
+    character: 9
+  end_position:
+    bytes: 45
+    line: 3
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 45
+    line: 3
+    character: 10
+  end_position:
+    bytes: 46
+    line: 3
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: f
+- start_position:
+    bytes: 46
+    line: 3
+    character: 11
+  end_position:
+    bytes: 47
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 47
+    line: 3
+    character: 12
+  end_position:
+    bytes: 48
+    line: 3
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 48
+    line: 3
+    character: 13
+  end_position:
+    bytes: 49
+    line: 3
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 49
+    line: 3
+    character: 14
+  end_position:
+    bytes: 50
+    line: 3
+    character: 15
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 50
+    line: 3
+    character: 15
+  end_position:
+    bytes: 51
+    line: 3
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 51
+    line: 3
+    character: 16
+  end_position:
+    bytes: 52
+    line: 3
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 52
+    line: 3
+    character: 17
+  end_position:
+    bytes: 53
+    line: 3
+    character: 18
+  token_type:
+    type: Number
+    text: "6"
+- start_position:
+    bytes: 53
+    line: 3
+    character: 18
+  end_position:
+    bytes: 53
+    line: 3
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/ast.snap
new file mode 100644
index 00000000..90c44c12
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/ast.snap
@@ -0,0 +1,96 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/local-assignment-4
+
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      end_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  end_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: y
+                trailing_trivia: []
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/source.lua
new file mode 100644
index 00000000..43ae2544
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/source.lua
@@ -0,0 +1 @@
+local x, y
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/tokens.snap
new file mode 100644
index 00000000..1748c541
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-4/tokens.snap
@@ -0,0 +1,83 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/local-assignment-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/ast.snap
new file mode 100644
index 00000000..0e5be521
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/ast.snap
@@ -0,0 +1,252 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/local-assignment-5
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 12
+                line: 2
+                character: 1
+              end_position:
+                bytes: 29
+                line: 2
+                character: 18
+              token_type:
+                type: SingleLineComment
+                comment: " Then a comment"
+            - start_position:
+                bytes: 29
+                line: 2
+                character: 18
+              end_position:
+                bytes: 30
+                line: 2
+                character: 18
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 30
+              line: 3
+              character: 1
+            end_position:
+              bytes: 35
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 35
+                line: 3
+                character: 6
+              end_position:
+                bytes: 36
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 36
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 37
+                    line: 3
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: y
+                trailing_trivia:
+                  - start_position:
+                      bytes: 37
+                      line: 3
+                      character: 8
+                    end_position:
+                      bytes: 38
+                      line: 3
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 38
+              line: 3
+              character: 9
+            end_position:
+              bytes: 39
+              line: 3
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 39
+                line: 3
+                character: 10
+              end_position:
+                bytes: 40
+                line: 3
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 40
+                      line: 3
+                      character: 11
+                    end_position:
+                      bytes: 41
+                      line: 3
+                      character: 12
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 41
+                        line: 3
+                        character: 12
+                      end_position:
+                        bytes: 42
+                        line: 3
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/source.lua
new file mode 100644
index 00000000..53d943cc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/source.lua
@@ -0,0 +1,3 @@
+local x = 1
+-- Then a comment
+local y = 1
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/tokens.snap
new file mode 100644
index 00000000..c74b7be6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-assignment-5/tokens.snap
@@ -0,0 +1,215 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/local-assignment-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 29
+    line: 2
+    character: 18
+  token_type:
+    type: SingleLineComment
+    comment: " Then a comment"
+- start_position:
+    bytes: 29
+    line: 2
+    character: 18
+  end_position:
+    bytes: 30
+    line: 2
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 30
+    line: 3
+    character: 1
+  end_position:
+    bytes: 35
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 35
+    line: 3
+    character: 6
+  end_position:
+    bytes: 36
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 36
+    line: 3
+    character: 7
+  end_position:
+    bytes: 37
+    line: 3
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 37
+    line: 3
+    character: 8
+  end_position:
+    bytes: 38
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 38
+    line: 3
+    character: 9
+  end_position:
+    bytes: 39
+    line: 3
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 39
+    line: 3
+    character: 10
+  end_position:
+    bytes: 40
+    line: 3
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 40
+    line: 3
+    character: 11
+  end_position:
+    bytes: 41
+    line: 3
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 41
+    line: 3
+    character: 12
+  end_position:
+    bytes: 42
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 42
+    line: 4
+    character: 1
+  end_position:
+    bytes: 42
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/ast.snap
new file mode 100644
index 00000000..04393d9f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/ast.snap
@@ -0,0 +1,241 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/local-function-1
+---
+stmts:
+  - - LocalFunction:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 6
+              line: 1
+              character: 7
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 15
+              line: 1
+              character: 16
+            end_position:
+              bytes: 16
+              line: 1
+              character: 17
+            token_type:
+              type: Identifier
+              identifier: x
+          trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 16
+                    line: 1
+                    character: 17
+                  end_position:
+                    bytes: 17
+                    line: 1
+                    character: 18
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 17
+                    line: 1
+                    character: 18
+                  end_position:
+                    bytes: 18
+                    line: 1
+                    character: 19
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 18
+                      line: 1
+                      character: 19
+                    end_position:
+                      bytes: 19
+                      line: 1
+                      character: 19
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          parameters:
+            pairs: []
+          block:
+            stmts:
+              - - FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 19
+                              line: 2
+                              character: 1
+                            end_position:
+                              bytes: 20
+                              line: 2
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\t"
+                        token:
+                          start_position:
+                            bytes: 20
+                            line: 2
+                            character: 2
+                          end_position:
+                            bytes: 24
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Identifier
+                            identifier: call
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 24
+                                        line: 2
+                                        character: 6
+                                      end_position:
+                                        bytes: 25
+                                        line: 2
+                                        character: 7
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 26
+                                        line: 2
+                                        character: 8
+                                      end_position:
+                                        bytes: 27
+                                        line: 2
+                                        character: 9
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 27
+                                          line: 2
+                                          character: 9
+                                        end_position:
+                                          bytes: 28
+                                          line: 2
+                                          character: 9
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs:
+                                  - End:
+                                      Number:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 25
+                                            line: 2
+                                            character: 7
+                                          end_position:
+                                            bytes: 26
+                                            line: 2
+                                            character: 8
+                                          token_type:
+                                            type: Number
+                                            text: "1"
+                                        trailing_trivia: []
+                - ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 28
+                line: 3
+                character: 1
+              end_position:
+                bytes: 31
+                line: 3
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 31
+                  line: 3
+                  character: 4
+                end_position:
+                  bytes: 32
+                  line: 3
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/source.lua
new file mode 100644
index 00000000..fbbbdc20
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/source.lua
@@ -0,0 +1,3 @@
+local function x()
+	call(1)
+end
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/tokens.snap
new file mode 100644
index 00000000..b813f3bd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-1/tokens.snap
@@ -0,0 +1,193 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/local-function-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 2
+    character: 1
+  end_position:
+    bytes: 20
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 20
+    line: 2
+    character: 2
+  end_position:
+    bytes: 24
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 24
+    line: 2
+    character: 6
+  end_position:
+    bytes: 25
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 25
+    line: 2
+    character: 7
+  end_position:
+    bytes: 26
+    line: 2
+    character: 8
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 26
+    line: 2
+    character: 8
+  end_position:
+    bytes: 27
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 27
+    line: 2
+    character: 9
+  end_position:
+    bytes: 28
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 28
+    line: 3
+    character: 1
+  end_position:
+    bytes: 31
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 31
+    line: 3
+    character: 4
+  end_position:
+    bytes: 32
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 32
+    line: 4
+    character: 1
+  end_position:
+    bytes: 32
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/ast.snap
new file mode 100644
index 00000000..b1ab1c0e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/ast.snap
@@ -0,0 +1,590 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+
+---
+stmts:
+  - - LocalFunction:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 6
+              line: 1
+              character: 7
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 15
+              line: 1
+              character: 16
+            end_position:
+              bytes: 18
+              line: 1
+              character: 19
+            token_type:
+              type: Identifier
+              identifier: foo
+          trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 18
+                    line: 1
+                    character: 19
+                  end_position:
+                    bytes: 19
+                    line: 1
+                    character: 20
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 23
+                    line: 1
+                    character: 24
+                  end_position:
+                    bytes: 24
+                    line: 1
+                    character: 25
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 24
+                      line: 1
+                      character: 25
+                    end_position:
+                      bytes: 25
+                      line: 1
+                      character: 26
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          parameters:
+            pairs:
+              - Punctuated:
+                  - Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 19
+                          line: 1
+                          character: 20
+                        end_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        token_type:
+                          type: Identifier
+                          identifier: a
+                      trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 20
+                        line: 1
+                        character: 21
+                      end_position:
+                        bytes: 21
+                        line: 1
+                        character: 22
+                      token_type:
+                        type: Symbol
+                        symbol: ","
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 21
+                          line: 1
+                          character: 22
+                        end_position:
+                          bytes: 22
+                          line: 1
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+              - End:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 22
+                        line: 1
+                        character: 23
+                      end_position:
+                        bytes: 23
+                        line: 1
+                        character: 24
+                      token_type:
+                        type: Identifier
+                        identifier: b
+                    trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 25
+                line: 1
+                character: 26
+              end_position:
+                bytes: 28
+                line: 1
+                character: 29
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 28
+                  line: 1
+                  character: 29
+                end_position:
+                  bytes: 29
+                  line: 1
+                  character: 29
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - LocalFunction:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 29
+              line: 2
+              character: 1
+            end_position:
+              bytes: 34
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 34
+                line: 2
+                character: 6
+              end_position:
+                bytes: 35
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 35
+              line: 2
+              character: 7
+            end_position:
+              bytes: 43
+              line: 2
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 43
+                line: 2
+                character: 15
+              end_position:
+                bytes: 44
+                line: 2
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 44
+              line: 2
+              character: 16
+            end_position:
+              bytes: 47
+              line: 2
+              character: 19
+            token_type:
+              type: Identifier
+              identifier: bar
+          trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 47
+                    line: 2
+                    character: 19
+                  end_position:
+                    bytes: 48
+                    line: 2
+                    character: 20
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 51
+                    line: 2
+                    character: 23
+                  end_position:
+                    bytes: 52
+                    line: 2
+                    character: 24
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 52
+                      line: 2
+                      character: 24
+                    end_position:
+                      bytes: 53
+                      line: 2
+                      character: 25
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          parameters:
+            pairs:
+              - End:
+                  Ellipse:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 48
+                        line: 2
+                        character: 20
+                      end_position:
+                        bytes: 51
+                        line: 2
+                        character: 23
+                      token_type:
+                        type: Symbol
+                        symbol: "..."
+                    trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 53
+                line: 2
+                character: 25
+              end_position:
+                bytes: 56
+                line: 2
+                character: 28
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 56
+                  line: 2
+                  character: 28
+                end_position:
+                  bytes: 57
+                  line: 2
+                  character: 28
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - LocalFunction:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 57
+              line: 3
+              character: 1
+            end_position:
+              bytes: 62
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 62
+                line: 3
+                character: 6
+              end_position:
+                bytes: 63
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 63
+              line: 3
+              character: 7
+            end_position:
+              bytes: 71
+              line: 3
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 71
+                line: 3
+                character: 15
+              end_position:
+                bytes: 72
+                line: 3
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 72
+              line: 3
+              character: 16
+            end_position:
+              bytes: 75
+              line: 3
+              character: 19
+            token_type:
+              type: Identifier
+              identifier: baz
+          trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 75
+                    line: 3
+                    character: 19
+                  end_position:
+                    bytes: 76
+                    line: 3
+                    character: 20
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 85
+                    line: 3
+                    character: 29
+                  end_position:
+                    bytes: 86
+                    line: 3
+                    character: 30
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 86
+                      line: 3
+                      character: 30
+                    end_position:
+                      bytes: 87
+                      line: 3
+                      character: 31
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          parameters:
+            pairs:
+              - Punctuated:
+                  - Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 76
+                          line: 3
+                          character: 20
+                        end_position:
+                          bytes: 77
+                          line: 3
+                          character: 21
+                        token_type:
+                          type: Identifier
+                          identifier: a
+                      trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 77
+                        line: 3
+                        character: 21
+                      end_position:
+                        bytes: 78
+                        line: 3
+                        character: 22
+                      token_type:
+                        type: Symbol
+                        symbol: ","
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 78
+                          line: 3
+                          character: 22
+                        end_position:
+                          bytes: 79
+                          line: 3
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+              - Punctuated:
+                  - Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 79
+                          line: 3
+                          character: 23
+                        end_position:
+                          bytes: 80
+                          line: 3
+                          character: 24
+                        token_type:
+                          type: Identifier
+                          identifier: b
+                      trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 80
+                        line: 3
+                        character: 24
+                      end_position:
+                        bytes: 81
+                        line: 3
+                        character: 25
+                      token_type:
+                        type: Symbol
+                        symbol: ","
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 81
+                          line: 3
+                          character: 25
+                        end_position:
+                          bytes: 82
+                          line: 3
+                          character: 26
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+              - End:
+                  Ellipse:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 82
+                        line: 3
+                        character: 26
+                      end_position:
+                        bytes: 85
+                        line: 3
+                        character: 29
+                      token_type:
+                        type: Symbol
+                        symbol: "..."
+                    trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 87
+                line: 3
+                character: 31
+              end_position:
+                bytes: 90
+                line: 3
+                character: 34
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/source.lua
new file mode 100644
index 00000000..a17fbee1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/source.lua
@@ -0,0 +1,3 @@
+local function foo(a, b) end
+local function bar(...) end
+local function baz(a, b, ...) end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/tokens.snap
new file mode 100644
index 00000000..13cbe428
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/local-function-2/tokens.snap
@@ -0,0 +1,468 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/local-function-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 28
+    line: 1
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 28
+    line: 1
+    character: 29
+  end_position:
+    bytes: 29
+    line: 1
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 29
+    line: 2
+    character: 1
+  end_position:
+    bytes: 34
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 34
+    line: 2
+    character: 6
+  end_position:
+    bytes: 35
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 35
+    line: 2
+    character: 7
+  end_position:
+    bytes: 43
+    line: 2
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 43
+    line: 2
+    character: 15
+  end_position:
+    bytes: 44
+    line: 2
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 44
+    line: 2
+    character: 16
+  end_position:
+    bytes: 47
+    line: 2
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 47
+    line: 2
+    character: 19
+  end_position:
+    bytes: 48
+    line: 2
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 48
+    line: 2
+    character: 20
+  end_position:
+    bytes: 51
+    line: 2
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: "..."
+- start_position:
+    bytes: 51
+    line: 2
+    character: 23
+  end_position:
+    bytes: 52
+    line: 2
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 52
+    line: 2
+    character: 24
+  end_position:
+    bytes: 53
+    line: 2
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 53
+    line: 2
+    character: 25
+  end_position:
+    bytes: 56
+    line: 2
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 56
+    line: 2
+    character: 28
+  end_position:
+    bytes: 57
+    line: 2
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 57
+    line: 3
+    character: 1
+  end_position:
+    bytes: 62
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 62
+    line: 3
+    character: 6
+  end_position:
+    bytes: 63
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 63
+    line: 3
+    character: 7
+  end_position:
+    bytes: 71
+    line: 3
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 71
+    line: 3
+    character: 15
+  end_position:
+    bytes: 72
+    line: 3
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 72
+    line: 3
+    character: 16
+  end_position:
+    bytes: 75
+    line: 3
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 75
+    line: 3
+    character: 19
+  end_position:
+    bytes: 76
+    line: 3
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 76
+    line: 3
+    character: 20
+  end_position:
+    bytes: 77
+    line: 3
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 77
+    line: 3
+    character: 21
+  end_position:
+    bytes: 78
+    line: 3
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 78
+    line: 3
+    character: 22
+  end_position:
+    bytes: 79
+    line: 3
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 79
+    line: 3
+    character: 23
+  end_position:
+    bytes: 80
+    line: 3
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 80
+    line: 3
+    character: 24
+  end_position:
+    bytes: 81
+    line: 3
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 81
+    line: 3
+    character: 25
+  end_position:
+    bytes: 82
+    line: 3
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 82
+    line: 3
+    character: 26
+  end_position:
+    bytes: 85
+    line: 3
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "..."
+- start_position:
+    bytes: 85
+    line: 3
+    character: 29
+  end_position:
+    bytes: 86
+    line: 3
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 86
+    line: 3
+    character: 30
+  end_position:
+    bytes: 87
+    line: 3
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 87
+    line: 3
+    character: 31
+  end_position:
+    bytes: 90
+    line: 3
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 90
+    line: 3
+    character: 34
+  end_position:
+    bytes: 90
+    line: 3
+    character: 34
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/ast.snap
new file mode 100644
index 00000000..7750c787
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/mixed-indented-comments
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/source.lua
new file mode 100644
index 00000000..23c37db1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/source.lua
@@ -0,0 +1,4 @@
+	-- Indented single line
+	--[[
+		Indented multi line
+	]]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/tokens.snap
new file mode 100644
index 00000000..78d7f720
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/mixed-indented-comments/tokens.snap
@@ -0,0 +1,73 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/mixed-indented-comments
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: SingleLineComment
+    comment: " Indented single line"
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 25
+    line: 2
+    character: 1
+  end_position:
+    bytes: 26
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 26
+    line: 2
+    character: 2
+  end_position:
+    bytes: 56
+    line: 4
+    character: 4
+  token_type:
+    type: MultiLineComment
+    blocks: 0
+    comment: "\n\t\tIndented multi line\n\t"
+- start_position:
+    bytes: 56
+    line: 4
+    character: 4
+  end_position:
+    bytes: 56
+    line: 4
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/ast.snap
new file mode 100644
index 00000000..31b6ed8e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/multi-line-comments-1
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/source.lua
new file mode 100644
index 00000000..5a8bf75e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/source.lua
@@ -0,0 +1,5 @@
+--[[
+	such comments
+	much lines
+	wow
+]]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/tokens.snap
new file mode 100644
index 00000000..5920d2c9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-1/tokens.snap
@@ -0,0 +1,29 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-comments-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 39
+    line: 5
+    character: 3
+  token_type:
+    type: MultiLineComment
+    blocks: 0
+    comment: "\n\tsuch comments\n\tmuch lines\n\twow\n"
+- start_position:
+    bytes: 39
+    line: 5
+    character: 3
+  end_position:
+    bytes: 39
+    line: 5
+    character: 3
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/ast.snap
new file mode 100644
index 00000000..95de1b46
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/multi-line-comments-2
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/source.lua
new file mode 100644
index 00000000..56291f7f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/source.lua
@@ -0,0 +1,4 @@
+--[=[
+	never have i used these weird equals signs comments
+	but im sure someone does
+]=]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/tokens.snap
new file mode 100644
index 00000000..9ae8494d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-2/tokens.snap
@@ -0,0 +1,29 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-comments-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 88
+    line: 4
+    character: 4
+  token_type:
+    type: MultiLineComment
+    blocks: 1
+    comment: "\n\tnever have i used these weird equals signs comments\n\tbut im sure someone does\n"
+- start_position:
+    bytes: 88
+    line: 4
+    character: 4
+  end_position:
+    bytes: 88
+    line: 4
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/ast.snap
new file mode 100644
index 00000000..3d31018e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/multi-line-comments-3
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/source.lua
new file mode 100644
index 00000000..977869da
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/source.lua
@@ -0,0 +1,3 @@
+--[=[
+--[[
+]=]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/tokens.snap
new file mode 100644
index 00000000..6cb4728f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-3/tokens.snap
@@ -0,0 +1,29 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-comments-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 14
+    line: 3
+    character: 4
+  token_type:
+    type: MultiLineComment
+    blocks: 1
+    comment: "\n--[[\n"
+- start_position:
+    bytes: 14
+    line: 3
+    character: 4
+  end_position:
+    bytes: 14
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/ast.snap
new file mode 100644
index 00000000..e5cbdd6e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/multi-line-comments-4
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/source.lua
new file mode 100644
index 00000000..72b48afc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/source.lua
@@ -0,0 +1,5 @@
+--[=====[
+	lua be like
+]====]
+	still going
+]=====]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/tokens.snap
new file mode 100644
index 00000000..cbc8ac66
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-4/tokens.snap
@@ -0,0 +1,29 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-comments-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 50
+    line: 5
+    character: 8
+  token_type:
+    type: MultiLineComment
+    blocks: 5
+    comment: "\n\tlua be like\n]====]\n\tstill going\n"
+- start_position:
+    bytes: 50
+    line: 5
+    character: 8
+  end_position:
+    bytes: 50
+    line: 5
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/ast.snap
new file mode 100644
index 00000000..b52c100b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/multi-line-comments-5
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/source.lua
new file mode 100644
index 00000000..116f6fb0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/source.lua
@@ -0,0 +1,6 @@
+--[[
+local emotes = {
+	[":thinking:"] = "http://www.roblox.com/asset/?id=643340245",
+	[":bug:"] = "http://www.roblox.com/asset/?id=860037275"
+}
+]]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/tokens.snap
new file mode 100644
index 00000000..cac4f568
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-5/tokens.snap
@@ -0,0 +1,29 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-comments-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 146
+    line: 6
+    character: 3
+  token_type:
+    type: MultiLineComment
+    blocks: 0
+    comment: "\nlocal emotes = {\n\t[\":thinking:\"] = \"http://www.roblox.com/asset/?id=643340245\",\n\t[\":bug:\"] = \"http://www.roblox.com/asset/?id=860037275\"\n}\n"
+- start_position:
+    bytes: 146
+    line: 6
+    character: 3
+  end_position:
+    bytes: 146
+    line: 6
+    character: 3
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/ast.snap
new file mode 100644
index 00000000..2b3b7063
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/ast.snap
@@ -0,0 +1,165 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+
+---
+stmts:
+  - - LocalFunction:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 6
+              line: 1
+              character: 7
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 15
+              line: 1
+              character: 16
+            end_position:
+              bytes: 16
+              line: 1
+              character: 17
+            token_type:
+              type: Identifier
+              identifier: x
+          trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 16
+                    line: 1
+                    character: 17
+                  end_position:
+                    bytes: 17
+                    line: 1
+                    character: 18
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 38
+                    line: 1
+                    character: 39
+                  end_position:
+                    bytes: 39
+                    line: 1
+                    character: 40
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 39
+                      line: 1
+                      character: 40
+                    end_position:
+                      bytes: 40
+                      line: 1
+                      character: 40
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          parameters:
+            pairs:
+              - End:
+                  Ellipse:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 17
+                        line: 1
+                        character: 18
+                      end_position:
+                        bytes: 20
+                        line: 1
+                        character: 21
+                      token_type:
+                        type: Symbol
+                        symbol: "..."
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        end_position:
+                          bytes: 38
+                          line: 1
+                          character: 39
+                        token_type:
+                          type: MultiLineComment
+                          blocks: 0
+                          comment: comment here
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 40
+                line: 2
+                character: 1
+              end_position:
+                bytes: 43
+                line: 2
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/source.lua
new file mode 100644
index 00000000..e5f7405c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/source.lua
@@ -0,0 +1,2 @@
+local function x(...--[[comment here]])
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/tokens.snap
new file mode 100644
index 00000000..36675a2e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-6/tokens.snap
@@ -0,0 +1,139 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-comments-6
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "..."
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 38
+    line: 1
+    character: 39
+  token_type:
+    type: MultiLineComment
+    blocks: 0
+    comment: comment here
+- start_position:
+    bytes: 38
+    line: 1
+    character: 39
+  end_position:
+    bytes: 39
+    line: 1
+    character: 40
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 39
+    line: 1
+    character: 40
+  end_position:
+    bytes: 40
+    line: 1
+    character: 40
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 40
+    line: 2
+    character: 1
+  end_position:
+    bytes: 43
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 43
+    line: 2
+    character: 4
+  end_position:
+    bytes: 43
+    line: 2
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/ast.snap
new file mode 100644
index 00000000..d4bf0738
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/multi-line-comments-7
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/source.lua
new file mode 100644
index 00000000..946434aa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/source.lua
@@ -0,0 +1,3 @@
+--[=[ μέλλον ]=]
+
+-- some text here
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/tokens.snap
new file mode 100644
index 00000000..276b2ecc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-7/tokens.snap
@@ -0,0 +1,73 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-comments-7
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 22
+    line: 1
+    character: 17
+  token_type:
+    type: MultiLineComment
+    blocks: 1
+    comment: " μέλλον "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 17
+  end_position:
+    bytes: 23
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 23
+    line: 2
+    character: 1
+  end_position:
+    bytes: 24
+    line: 2
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 24
+    line: 3
+    character: 1
+  end_position:
+    bytes: 41
+    line: 3
+    character: 18
+  token_type:
+    type: SingleLineComment
+    comment: " some text here"
+- start_position:
+    bytes: 41
+    line: 3
+    character: 18
+  end_position:
+    bytes: 42
+    line: 3
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 42
+    line: 4
+    character: 1
+  end_position:
+    bytes: 42
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/ast.snap
new file mode 100644
index 00000000..b3b3fb27
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/ast.snap
@@ -0,0 +1,143 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/multi-line-comments-8
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 21
+                line: 1
+                character: 11
+              token_type:
+                type: MultiLineComment
+                blocks: 0
+                comment: 👨🏾‍💻
+            - start_position:
+                bytes: 21
+                line: 1
+                character: 11
+              end_position:
+                bytes: 22
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 22
+              line: 2
+              character: 1
+            end_position:
+              bytes: 27
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 27
+                line: 2
+                character: 6
+              end_position:
+                bytes: 28
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 28
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 37
+                    line: 2
+                    character: 16
+                  token_type:
+                    type: Identifier
+                    identifier: more_code
+                trailing_trivia:
+                  - start_position:
+                      bytes: 37
+                      line: 2
+                      character: 16
+                    end_position:
+                      bytes: 38
+                      line: 2
+                      character: 17
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 38
+              line: 2
+              character: 17
+            end_position:
+              bytes: 39
+              line: 2
+              character: 18
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 39
+                line: 2
+                character: 18
+              end_position:
+                bytes: 40
+                line: 2
+                character: 19
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 40
+                        line: 2
+                        character: 19
+                      end_position:
+                        bytes: 44
+                        line: 2
+                        character: 23
+                      token_type:
+                        type: Identifier
+                        identifier: here
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 44
+                          line: 2
+                          character: 23
+                        end_position:
+                          bytes: 45
+                          line: 2
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/source.lua
new file mode 100644
index 00000000..048d0711
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/source.lua
@@ -0,0 +1,2 @@
+--[[👨🏾‍💻]]
+local more_code = here
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/tokens.snap
new file mode 100644
index 00000000..3eafa0cc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-8/tokens.snap
@@ -0,0 +1,128 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-comments-8
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 21
+    line: 1
+    character: 11
+  token_type:
+    type: MultiLineComment
+    blocks: 0
+    comment: 👨🏾‍💻
+- start_position:
+    bytes: 21
+    line: 1
+    character: 11
+  end_position:
+    bytes: 22
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 22
+    line: 2
+    character: 1
+  end_position:
+    bytes: 27
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 27
+    line: 2
+    character: 6
+  end_position:
+    bytes: 28
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 28
+    line: 2
+    character: 7
+  end_position:
+    bytes: 37
+    line: 2
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: more_code
+- start_position:
+    bytes: 37
+    line: 2
+    character: 16
+  end_position:
+    bytes: 38
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 38
+    line: 2
+    character: 17
+  end_position:
+    bytes: 39
+    line: 2
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 39
+    line: 2
+    character: 18
+  end_position:
+    bytes: 40
+    line: 2
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 40
+    line: 2
+    character: 19
+  end_position:
+    bytes: 44
+    line: 2
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: here
+- start_position:
+    bytes: 44
+    line: 2
+    character: 23
+  end_position:
+    bytes: 45
+    line: 2
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 45
+    line: 3
+    character: 1
+  end_position:
+    bytes: 45
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/ast.snap
new file mode 100644
index 00000000..6e1d3d1a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/ast.snap
@@ -0,0 +1,6 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/source.lua
new file mode 100644
index 00000000..5ef37535
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/source.lua
@@ -0,0 +1,21 @@
+--[=[
+
+	This description starts one line down,
+
+	And has a line in the middle, followed by trailing lines.
+
+	```lua
+	function test()
+		print("indentation")
+
+		do
+			print("more indented")
+		end
+	end
+	```
+
+
+	@class indentation
+
+
+]=]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/tokens.snap
new file mode 100644
index 00000000..3385af38
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-comments-9/tokens.snap
@@ -0,0 +1,27 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 231
+    line: 21
+    character: 4
+  token_type:
+    type: MultiLineComment
+    blocks: 1
+    comment: "\n\n\tThis description starts one line down,\n\n\tAnd has a line in the middle, followed by trailing lines.\n\n\t```lua\n\tfunction test()\n\t\tprint(\"indentation\")\n\n\t\tdo\n\t\t\tprint(\"more indented\")\n\t\tend\n\tend\n\t```\n\n\n\t@class indentation\n\n\n"
+- start_position:
+    bytes: 231
+    line: 21
+    character: 4
+  end_position:
+    bytes: 231
+    line: 21
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/ast.snap
new file mode 100644
index 00000000..56c703f6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/ast.snap
@@ -0,0 +1,107 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 48
+                      line: 4
+                      character: 13
+                    token_type:
+                      type: StringLiteral
+                      literal: "Full Moon\nis a\nlossless\nLua parser"
+                      quote_type: Brackets
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/source.lua
new file mode 100644
index 00000000..1cb9d196
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/source.lua
@@ -0,0 +1,4 @@
+local x = [[Full Moon
+is a
+lossless
+Lua parser]]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/tokens.snap
new file mode 100644
index 00000000..cdb29fb3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-1/tokens.snap
@@ -0,0 +1,93 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 48
+    line: 4
+    character: 13
+  token_type:
+    type: StringLiteral
+    literal: "Full Moon\nis a\nlossless\nLua parser"
+    quote_type: Brackets
+- start_position:
+    bytes: 48
+    line: 4
+    character: 13
+  end_position:
+    bytes: 48
+    line: 4
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/ast.snap
new file mode 100644
index 00000000..e0c6de1e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/ast.snap
@@ -0,0 +1,108 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 43
+                      line: 3
+                      character: 9
+                    token_type:
+                      type: StringLiteral
+                      literal: "This is\nseveral equal\nsigns"
+                      multi_line_depth: 1
+                      quote_type: Brackets
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/source.lua
new file mode 100644
index 00000000..8e6c09eb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/source.lua
@@ -0,0 +1,3 @@
+local x = [=[This is
+several equal
+signs]=]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/tokens.snap
new file mode 100644
index 00000000..9254ab63
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-2/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 43
+    line: 3
+    character: 9
+  token_type:
+    type: StringLiteral
+    literal: "This is\nseveral equal\nsigns"
+    multi_line_depth: 1
+    quote_type: Brackets
+- start_position:
+    bytes: 43
+    line: 3
+    character: 9
+  end_position:
+    bytes: 43
+    line: 3
+    character: 9
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/ast.snap
new file mode 100644
index 00000000..c71df3ec
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/ast.snap
@@ -0,0 +1,107 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 154
+                      line: 6
+                      character: 3
+                    token_type:
+                      type: StringLiteral
+                      literal: "\nlocal emotes = {\n\t[\":thinking:\"] = \"http://www.roblox.com/asset/?id=643340245\",\n\t[\":bug:\"] = \"http://www.roblox.com/asset/?id=860037275\"\n}\n"
+                      quote_type: Brackets
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/source.lua
new file mode 100644
index 00000000..0856c4d2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/source.lua
@@ -0,0 +1,6 @@
+local x = [[
+local emotes = {
+	[":thinking:"] = "http://www.roblox.com/asset/?id=643340245",
+	[":bug:"] = "http://www.roblox.com/asset/?id=860037275"
+}
+]]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/tokens.snap
new file mode 100644
index 00000000..ec9dc295
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-3/tokens.snap
@@ -0,0 +1,93 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 154
+    line: 6
+    character: 3
+  token_type:
+    type: StringLiteral
+    literal: "\nlocal emotes = {\n\t[\":thinking:\"] = \"http://www.roblox.com/asset/?id=643340245\",\n\t[\":bug:\"] = \"http://www.roblox.com/asset/?id=860037275\"\n}\n"
+    quote_type: Brackets
+- start_position:
+    bytes: 154
+    line: 6
+    character: 3
+  end_position:
+    bytes: 154
+    line: 6
+    character: 3
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/ast.snap
new file mode 100644
index 00000000..af33a16f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/ast.snap
@@ -0,0 +1,77 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          end_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 13
+                            line: 1
+                            character: 14
+                          end_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 5
+                                line: 1
+                                character: 6
+                              end_position:
+                                bytes: 13
+                                line: 1
+                                character: 14
+                              token_type:
+                                type: StringLiteral
+                                literal: doge
+                                quote_type: Brackets
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/source.lua
new file mode 100644
index 00000000..12a0b783
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/source.lua
@@ -0,0 +1 @@
+call([[doge]])
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/tokens.snap
new file mode 100644
index 00000000..cf929dfd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-4/tokens.snap
@@ -0,0 +1,60 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: StringLiteral
+    literal: doge
+    quote_type: Brackets
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/ast.snap
new file mode 100644
index 00000000..3f3efe1e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/ast.snap
@@ -0,0 +1,230 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  token_type:
+                    type: Identifier
+                    identifier: emoji
+                trailing_trivia:
+                  - start_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    end_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 1
+              character: 13
+            end_position:
+              bytes: 13
+              line: 1
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 13
+                line: 1
+                character: 14
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    end_position:
+                      bytes: 26
+                      line: 1
+                      character: 21
+                    token_type:
+                      type: StringLiteral
+                      literal: 🧓🏽
+                      quote_type: Brackets
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 26
+                        line: 1
+                        character: 21
+                      end_position:
+                        bytes: 27
+                        line: 1
+                        character: 21
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 27
+              line: 2
+              character: 1
+            end_position:
+              bytes: 32
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 32
+                line: 2
+                character: 6
+              end_position:
+                bytes: 33
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 33
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 42
+                    line: 2
+                    character: 16
+                  token_type:
+                    type: Identifier
+                    identifier: more_code
+                trailing_trivia:
+                  - start_position:
+                      bytes: 42
+                      line: 2
+                      character: 16
+                    end_position:
+                      bytes: 43
+                      line: 2
+                      character: 17
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 43
+              line: 2
+              character: 17
+            end_position:
+              bytes: 44
+              line: 2
+              character: 18
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 44
+                line: 2
+                character: 18
+              end_position:
+                bytes: 45
+                line: 2
+                character: 19
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 45
+                        line: 2
+                        character: 19
+                      end_position:
+                        bytes: 49
+                        line: 2
+                        character: 23
+                      token_type:
+                        type: Identifier
+                        identifier: here
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 49
+                          line: 2
+                          character: 23
+                        end_position:
+                          bytes: 50
+                          line: 2
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/source.lua
new file mode 100644
index 00000000..4780d5f2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/source.lua
@@ -0,0 +1,2 @@
+local emoji = [[🧓🏽]]
+local more_code = here
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/tokens.snap
new file mode 100644
index 00000000..034d5f0c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-5/tokens.snap
@@ -0,0 +1,192 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: emoji
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 26
+    line: 1
+    character: 21
+  token_type:
+    type: StringLiteral
+    literal: 🧓🏽
+    quote_type: Brackets
+- start_position:
+    bytes: 26
+    line: 1
+    character: 21
+  end_position:
+    bytes: 27
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 27
+    line: 2
+    character: 1
+  end_position:
+    bytes: 32
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 32
+    line: 2
+    character: 6
+  end_position:
+    bytes: 33
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 33
+    line: 2
+    character: 7
+  end_position:
+    bytes: 42
+    line: 2
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: more_code
+- start_position:
+    bytes: 42
+    line: 2
+    character: 16
+  end_position:
+    bytes: 43
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 43
+    line: 2
+    character: 17
+  end_position:
+    bytes: 44
+    line: 2
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 44
+    line: 2
+    character: 18
+  end_position:
+    bytes: 45
+    line: 2
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 45
+    line: 2
+    character: 19
+  end_position:
+    bytes: 49
+    line: 2
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: here
+- start_position:
+    bytes: 49
+    line: 2
+    character: 23
+  end_position:
+    bytes: 50
+    line: 2
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 50
+    line: 3
+    character: 1
+  end_position:
+    bytes: 50
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/ast.snap
new file mode 100644
index 00000000..e389a6fc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/ast.snap
@@ -0,0 +1,120 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/multi-line-string-6
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: foo
+                trailing_trivia:
+                  - start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 10
+              line: 1
+              character: 11
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    end_position:
+                      bytes: 22
+                      line: 2
+                      character: 5
+                    token_type:
+                      type: StringLiteral
+                      literal: "bar\\\nbaz"
+                      quote_type: Double
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 22
+                        line: 2
+                        character: 5
+                      end_position:
+                        bytes: 23
+                        line: 2
+                        character: 5
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/source.lua
new file mode 100644
index 00000000..f090ebd0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/source.lua
@@ -0,0 +1,2 @@
+local foo = "bar\
+baz"
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/tokens.snap
new file mode 100644
index 00000000..d89312a4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-6/tokens.snap
@@ -0,0 +1,106 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/multi-line-string-6
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 22
+    line: 2
+    character: 5
+  token_type:
+    type: StringLiteral
+    literal: "bar\\\nbaz"
+    quote_type: Double
+- start_position:
+    bytes: 22
+    line: 2
+    character: 5
+  end_position:
+    bytes: 23
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 23
+    line: 3
+    character: 1
+  end_position:
+    bytes: 23
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/ast.snap
new file mode 100644
index 00000000..5fd0d30f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/ast.snap
@@ -0,0 +1,108 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: a
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 20
+                      line: 1
+                      character: 21
+                    token_type:
+                      type: StringLiteral
+                      literal: "[%s]"
+                      multi_line_depth: 1
+                      quote_type: Brackets
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/source.lua
new file mode 100644
index 00000000..902027fc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/source.lua
@@ -0,0 +1 @@
+local a = [=[[%s]]=]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/tokens.snap
new file mode 100644
index 00000000..3babacfa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-7/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: StringLiteral
+    literal: "[%s]"
+    multi_line_depth: 1
+    quote_type: Brackets
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/ast.snap
new file mode 100644
index 00000000..a89e03a8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/ast.snap
@@ -0,0 +1,108 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 68
+                      line: 1
+                      character: 69
+                    token_type:
+                      type: StringLiteral
+                      literal: "\\v<((do|load)file|require)\\s*\\(?['\"]\\zs[^'\"]+\\ze['\"]"
+                      multi_line_depth: 1
+                      quote_type: Brackets
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/source.lua
new file mode 100644
index 00000000..93ec4d94
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/source.lua
@@ -0,0 +1 @@
+local x = [=[\v<((do|load)file|require)\s*\(?['"]\zs[^'"]+\ze['"]]=]
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/tokens.snap
new file mode 100644
index 00000000..eefcaa22
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/multi-line-string-8/tokens.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 68
+    line: 1
+    character: 69
+  token_type:
+    type: StringLiteral
+    literal: "\\v<((do|load)file|require)\\s*\\(?['\"]\\zs[^'\"]+\\ze['\"]"
+    multi_line_depth: 1
+    quote_type: Brackets
+- start_position:
+    bytes: 68
+    line: 1
+    character: 69
+  end_position:
+    bytes: 68
+    line: 1
+    character: 69
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/ast.snap
new file mode 100644
index 00000000..4315cf30
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/ast.snap
@@ -0,0 +1,595 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/negative-numbers
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: foo
+                trailing_trivia:
+                  - start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 10
+              line: 1
+              character: 11
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 12
+                            line: 1
+                            character: 13
+                          end_position:
+                            bytes: 13
+                            line: 1
+                            character: 14
+                          token_type:
+                            type: Identifier
+                            identifier: x
+                        trailing_trivia: []
+                  binop:
+                    Minus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 13
+                          line: 1
+                          character: 14
+                        end_position:
+                          bytes: 14
+                          line: 1
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: "-"
+                      trailing_trivia: []
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 14
+                          line: 1
+                          character: 15
+                        end_position:
+                          bytes: 15
+                          line: 1
+                          character: 16
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 15
+                            line: 1
+                            character: 16
+                          end_position:
+                            bytes: 16
+                            line: 1
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 16
+              line: 2
+              character: 1
+            end_position:
+              bytes: 21
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 21
+                line: 2
+                character: 6
+              end_position:
+                bytes: 22
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 22
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 25
+                    line: 2
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: foo
+                trailing_trivia:
+                  - start_position:
+                      bytes: 25
+                      line: 2
+                      character: 10
+                    end_position:
+                      bytes: 26
+                      line: 2
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 26
+              line: 2
+              character: 11
+            end_position:
+              bytes: 27
+              line: 2
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 27
+                line: 2
+                character: 12
+              end_position:
+                bytes: 28
+                line: 2
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 28
+                            line: 2
+                            character: 13
+                          end_position:
+                            bytes: 29
+                            line: 2
+                            character: 14
+                          token_type:
+                            type: Identifier
+                            identifier: x
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 29
+                              line: 2
+                              character: 14
+                            end_position:
+                              bytes: 30
+                              line: 2
+                              character: 15
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  binop:
+                    Minus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 30
+                          line: 2
+                          character: 15
+                        end_position:
+                          bytes: 31
+                          line: 2
+                          character: 16
+                        token_type:
+                          type: Symbol
+                          symbol: "-"
+                      trailing_trivia: []
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 31
+                          line: 2
+                          character: 16
+                        end_position:
+                          bytes: 32
+                          line: 2
+                          character: 17
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 32
+                            line: 2
+                            character: 17
+                          end_position:
+                            bytes: 33
+                            line: 2
+                            character: 17
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 33
+                line: 3
+                character: 1
+              end_position:
+                bytes: 38
+                line: 3
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: print
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 38
+                            line: 3
+                            character: 6
+                          end_position:
+                            bytes: 39
+                            line: 3
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 43
+                            line: 3
+                            character: 11
+                          end_position:
+                            bytes: 44
+                            line: 3
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 44
+                              line: 3
+                              character: 12
+                            end_position:
+                              bytes: 45
+                              line: 3
+                              character: 12
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          BinaryOperator:
+                            lhs:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 39
+                                    line: 3
+                                    character: 7
+                                  end_position:
+                                    bytes: 40
+                                    line: 3
+                                    character: 8
+                                  token_type:
+                                    type: Number
+                                    text: "1"
+                                trailing_trivia: []
+                            binop:
+                              Plus:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 40
+                                    line: 3
+                                    character: 8
+                                  end_position:
+                                    bytes: 41
+                                    line: 3
+                                    character: 9
+                                  token_type:
+                                    type: Symbol
+                                    symbol: +
+                                trailing_trivia: []
+                            rhs:
+                              UnaryOperator:
+                                unop:
+                                  Minus:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 41
+                                        line: 3
+                                        character: 9
+                                      end_position:
+                                        bytes: 42
+                                        line: 3
+                                        character: 10
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "-"
+                                    trailing_trivia: []
+                                expression:
+                                  Number:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 42
+                                        line: 3
+                                        character: 10
+                                      end_position:
+                                        bytes: 43
+                                        line: 3
+                                        character: 11
+                                      token_type:
+                                        type: Number
+                                        text: "3"
+                                    trailing_trivia: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 45
+              line: 4
+              character: 1
+            end_position:
+              bytes: 50
+              line: 4
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 50
+                line: 4
+                character: 6
+              end_position:
+                bytes: 51
+                line: 4
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 51
+                    line: 4
+                    character: 7
+                  end_position:
+                    bytes: 54
+                    line: 4
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: foo
+                trailing_trivia:
+                  - start_position:
+                      bytes: 54
+                      line: 4
+                      character: 10
+                    end_position:
+                      bytes: 55
+                      line: 4
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 55
+              line: 4
+              character: 11
+            end_position:
+              bytes: 56
+              line: 4
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 56
+                line: 4
+                character: 12
+              end_position:
+                bytes: 57
+                line: 4
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    UnaryOperator:
+                      unop:
+                        Minus:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 57
+                              line: 4
+                              character: 13
+                            end_position:
+                              bytes: 58
+                              line: 4
+                              character: 14
+                            token_type:
+                              type: Symbol
+                              symbol: "-"
+                          trailing_trivia: []
+                      expression:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 58
+                                line: 4
+                                character: 14
+                              end_position:
+                                bytes: 59
+                                line: 4
+                                character: 15
+                              token_type:
+                                type: Identifier
+                                identifier: x
+                            trailing_trivia: []
+                  binop:
+                    Plus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 59
+                          line: 4
+                          character: 15
+                        end_position:
+                          bytes: 60
+                          line: 4
+                          character: 16
+                        token_type:
+                          type: Symbol
+                          symbol: +
+                      trailing_trivia: []
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 60
+                          line: 4
+                          character: 16
+                        end_position:
+                          bytes: 61
+                          line: 4
+                          character: 17
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia: []
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/source.lua
new file mode 100644
index 00000000..3b7ccd77
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/source.lua
@@ -0,0 +1,4 @@
+local foo = x-1
+local foo = x -1
+print(1+-3)
+local foo = -x+1
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/tokens.snap
new file mode 100644
index 00000000..ab3ba56a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/negative-numbers/tokens.snap
@@ -0,0 +1,444 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/negative-numbers
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 1
+  end_position:
+    bytes: 21
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 21
+    line: 2
+    character: 6
+  end_position:
+    bytes: 22
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 7
+  end_position:
+    bytes: 25
+    line: 2
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 25
+    line: 2
+    character: 10
+  end_position:
+    bytes: 26
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 2
+    character: 11
+  end_position:
+    bytes: 27
+    line: 2
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 27
+    line: 2
+    character: 12
+  end_position:
+    bytes: 28
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 28
+    line: 2
+    character: 13
+  end_position:
+    bytes: 29
+    line: 2
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 29
+    line: 2
+    character: 14
+  end_position:
+    bytes: 30
+    line: 2
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 30
+    line: 2
+    character: 15
+  end_position:
+    bytes: 31
+    line: 2
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 31
+    line: 2
+    character: 16
+  end_position:
+    bytes: 32
+    line: 2
+    character: 17
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 32
+    line: 2
+    character: 17
+  end_position:
+    bytes: 33
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 33
+    line: 3
+    character: 1
+  end_position:
+    bytes: 38
+    line: 3
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 38
+    line: 3
+    character: 6
+  end_position:
+    bytes: 39
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 39
+    line: 3
+    character: 7
+  end_position:
+    bytes: 40
+    line: 3
+    character: 8
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 40
+    line: 3
+    character: 8
+  end_position:
+    bytes: 41
+    line: 3
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 41
+    line: 3
+    character: 9
+  end_position:
+    bytes: 42
+    line: 3
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 42
+    line: 3
+    character: 10
+  end_position:
+    bytes: 43
+    line: 3
+    character: 11
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 43
+    line: 3
+    character: 11
+  end_position:
+    bytes: 44
+    line: 3
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 44
+    line: 3
+    character: 12
+  end_position:
+    bytes: 45
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 45
+    line: 4
+    character: 1
+  end_position:
+    bytes: 50
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 50
+    line: 4
+    character: 6
+  end_position:
+    bytes: 51
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 51
+    line: 4
+    character: 7
+  end_position:
+    bytes: 54
+    line: 4
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 54
+    line: 4
+    character: 10
+  end_position:
+    bytes: 55
+    line: 4
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 55
+    line: 4
+    character: 11
+  end_position:
+    bytes: 56
+    line: 4
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 56
+    line: 4
+    character: 12
+  end_position:
+    bytes: 57
+    line: 4
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 57
+    line: 4
+    character: 13
+  end_position:
+    bytes: 58
+    line: 4
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 58
+    line: 4
+    character: 14
+  end_position:
+    bytes: 59
+    line: 4
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 59
+    line: 4
+    character: 15
+  end_position:
+    bytes: 60
+    line: 4
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 60
+    line: 4
+    character: 16
+  end_position:
+    bytes: 61
+    line: 4
+    character: 17
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 61
+    line: 4
+    character: 17
+  end_position:
+    bytes: 61
+    line: 4
+    character: 17
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/ast.snap
new file mode 100644
index 00000000..af82c9c1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/ast.snap
@@ -0,0 +1,94 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 47
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/numbers-1
+---
+stmts:
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 0
+                      line: 1
+                      character: 1
+                    end_position:
+                      bytes: 1
+                      line: 1
+                      character: 2
+                    token_type:
+                      type: Identifier
+                      identifier: _
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      end_position:
+                        bytes: 2
+                        line: 1
+                        character: 3
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 2
+              line: 1
+              character: 3
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Number
+                      text: "0x02"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 8
+                        line: 1
+                        character: 9
+                      end_position:
+                        bytes: 9
+                        line: 1
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/source.lua
new file mode 100644
index 00000000..71e00d7f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/source.lua
@@ -0,0 +1 @@
+_ = 0x02
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/tokens.snap
new file mode 100644
index 00000000..6abe86fa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/numbers-1/tokens.snap
@@ -0,0 +1,83 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 40
+expression: tokens
+input_file: full-moon/tests/cases/pass/numbers-1
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: _
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Number
+    text: "0x02"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 9
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/ast.snap
new file mode 100644
index 00000000..8d1cb626
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/ast.snap
@@ -0,0 +1,736 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/numeric-for-loop
+---
+stmts:
+  - - NumericFor:
+        for_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: for
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        index_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 4
+              line: 1
+              character: 5
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Identifier
+              identifier: index
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 10
+              line: 1
+              character: 11
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        start:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 12
+                line: 1
+                character: 13
+              end_position:
+                bytes: 13
+                line: 1
+                character: 14
+              token_type:
+                type: Number
+                text: "1"
+            trailing_trivia: []
+        start_end_comma:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 13
+              line: 1
+              character: 14
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: ","
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        end:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 1
+                character: 16
+              end_position:
+                bytes: 17
+                line: 1
+                character: 18
+              token_type:
+                type: Number
+                text: "10"
+            trailing_trivia:
+              - start_position:
+                  bytes: 17
+                  line: 1
+                  character: 18
+                end_position:
+                  bytes: 18
+                  line: 1
+                  character: 19
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        end_step_comma: ~
+        step: ~
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 18
+              line: 1
+              character: 19
+            end_position:
+              bytes: 20
+              line: 1
+              character: 21
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 20
+                line: 1
+                character: 21
+              end_position:
+                bytes: 21
+                line: 1
+                character: 22
+              token_type:
+                type: Whitespace
+                characters: " "
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 21
+                          line: 1
+                          character: 22
+                        end_position:
+                          bytes: 25
+                          line: 1
+                          character: 26
+                        token_type:
+                          type: Identifier
+                          identifier: call
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 25
+                                      line: 1
+                                      character: 26
+                                    end_position:
+                                      bytes: 26
+                                      line: 1
+                                      character: 27
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 31
+                                      line: 1
+                                      character: 32
+                                    end_position:
+                                      bytes: 32
+                                      line: 1
+                                      character: 33
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 32
+                                        line: 1
+                                        character: 33
+                                      end_position:
+                                        bytes: 33
+                                        line: 1
+                                        character: 34
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                            arguments:
+                              pairs:
+                                - End:
+                                    Var:
+                                      Name:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 26
+                                            line: 1
+                                            character: 27
+                                          end_position:
+                                            bytes: 31
+                                            line: 1
+                                            character: 32
+                                          token_type:
+                                            type: Identifier
+                                            identifier: index
+                                        trailing_trivia: []
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 33
+              line: 1
+              character: 34
+            end_position:
+              bytes: 36
+              line: 1
+              character: 37
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 36
+                line: 1
+                character: 37
+              end_position:
+                bytes: 37
+                line: 1
+                character: 37
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
+  - - NumericFor:
+        for_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 37
+              line: 2
+              character: 1
+            end_position:
+              bytes: 40
+              line: 2
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: for
+          trailing_trivia:
+            - start_position:
+                bytes: 40
+                line: 2
+                character: 4
+              end_position:
+                bytes: 41
+                line: 2
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        index_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 41
+              line: 2
+              character: 5
+            end_position:
+              bytes: 42
+              line: 2
+              character: 6
+            token_type:
+              type: Identifier
+              identifier: _
+          trailing_trivia:
+            - start_position:
+                bytes: 42
+                line: 2
+                character: 6
+              end_position:
+                bytes: 43
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 43
+              line: 2
+              character: 7
+            end_position:
+              bytes: 44
+              line: 2
+              character: 8
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 44
+                line: 2
+                character: 8
+              end_position:
+                bytes: 45
+                line: 2
+                character: 9
+              token_type:
+                type: Whitespace
+                characters: " "
+        start:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 45
+                  line: 2
+                  character: 9
+                end_position:
+                  bytes: 50
+                  line: 2
+                  character: 14
+                token_type:
+                  type: Identifier
+                  identifier: start
+              trailing_trivia: []
+        start_end_comma:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 50
+              line: 2
+              character: 14
+            end_position:
+              bytes: 51
+              line: 2
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: ","
+          trailing_trivia:
+            - start_position:
+                bytes: 51
+                line: 2
+                character: 15
+              end_position:
+                bytes: 52
+                line: 2
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        end:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 52
+                  line: 2
+                  character: 16
+                end_position:
+                  bytes: 57
+                  line: 2
+                  character: 21
+                token_type:
+                  type: Identifier
+                  identifier: final
+              trailing_trivia:
+                - start_position:
+                    bytes: 57
+                    line: 2
+                    character: 21
+                  end_position:
+                    bytes: 58
+                    line: 2
+                    character: 22
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+        end_step_comma: ~
+        step: ~
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 58
+              line: 2
+              character: 22
+            end_position:
+              bytes: 60
+              line: 2
+              character: 24
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 60
+                line: 2
+                character: 24
+              end_position:
+                bytes: 61
+                line: 2
+                character: 25
+              token_type:
+                type: Whitespace
+                characters: " "
+        block:
+          stmts: []
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 61
+              line: 2
+              character: 25
+            end_position:
+              bytes: 64
+              line: 2
+              character: 28
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 64
+                line: 2
+                character: 28
+              end_position:
+                bytes: 65
+                line: 2
+                character: 28
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
+  - - NumericFor:
+        for_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 65
+              line: 3
+              character: 1
+            end_position:
+              bytes: 68
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: for
+          trailing_trivia:
+            - start_position:
+                bytes: 68
+                line: 3
+                character: 4
+              end_position:
+                bytes: 69
+                line: 3
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        index_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 69
+              line: 3
+              character: 5
+            end_position:
+              bytes: 70
+              line: 3
+              character: 6
+            token_type:
+              type: Identifier
+              identifier: _
+          trailing_trivia:
+            - start_position:
+                bytes: 70
+                line: 3
+                character: 6
+              end_position:
+                bytes: 71
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 71
+              line: 3
+              character: 7
+            end_position:
+              bytes: 72
+              line: 3
+              character: 8
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 72
+                line: 3
+                character: 8
+              end_position:
+                bytes: 73
+                line: 3
+                character: 9
+              token_type:
+                type: Whitespace
+                characters: " "
+        start:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 73
+                line: 3
+                character: 9
+              end_position:
+                bytes: 74
+                line: 3
+                character: 10
+              token_type:
+                type: Number
+                text: "1"
+            trailing_trivia: []
+        start_end_comma:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 74
+              line: 3
+              character: 10
+            end_position:
+              bytes: 75
+              line: 3
+              character: 11
+            token_type:
+              type: Symbol
+              symbol: ","
+          trailing_trivia:
+            - start_position:
+                bytes: 75
+                line: 3
+                character: 11
+              end_position:
+                bytes: 76
+                line: 3
+                character: 12
+              token_type:
+                type: Whitespace
+                characters: " "
+        end:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 76
+                line: 3
+                character: 12
+              end_position:
+                bytes: 78
+                line: 3
+                character: 14
+              token_type:
+                type: Number
+                text: "10"
+            trailing_trivia: []
+        end_step_comma:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 78
+              line: 3
+              character: 14
+            end_position:
+              bytes: 79
+              line: 3
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: ","
+          trailing_trivia:
+            - start_position:
+                bytes: 79
+                line: 3
+                character: 15
+              end_position:
+                bytes: 80
+                line: 3
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        step:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 80
+                line: 3
+                character: 16
+              end_position:
+                bytes: 81
+                line: 3
+                character: 17
+              token_type:
+                type: Number
+                text: "2"
+            trailing_trivia:
+              - start_position:
+                  bytes: 81
+                  line: 3
+                  character: 17
+                end_position:
+                  bytes: 82
+                  line: 3
+                  character: 18
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 82
+              line: 3
+              character: 18
+            end_position:
+              bytes: 84
+              line: 3
+              character: 20
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 84
+                line: 3
+                character: 20
+              end_position:
+                bytes: 85
+                line: 3
+                character: 21
+              token_type:
+                type: Whitespace
+                characters: " "
+        block:
+          stmts: []
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 85
+              line: 3
+              character: 21
+            end_position:
+              bytes: 88
+              line: 3
+              character: 24
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/source.lua
new file mode 100644
index 00000000..7d940114
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/source.lua
@@ -0,0 +1,3 @@
+for index = 1, 10 do call(index) end
+for _ = start, final do end
+for _ = 1, 10, 2 do end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/tokens.snap
new file mode 100644
index 00000000..8abf9e6e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/numeric-for-loop/tokens.snap
@@ -0,0 +1,589 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/numeric-for-loop
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: index
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Number
+    text: "10"
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 31
+    line: 1
+    character: 32
+  token_type:
+    type: Identifier
+    identifier: index
+- start_position:
+    bytes: 31
+    line: 1
+    character: 32
+  end_position:
+    bytes: 32
+    line: 1
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 32
+    line: 1
+    character: 33
+  end_position:
+    bytes: 33
+    line: 1
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 33
+    line: 1
+    character: 34
+  end_position:
+    bytes: 36
+    line: 1
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 36
+    line: 1
+    character: 37
+  end_position:
+    bytes: 37
+    line: 1
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 37
+    line: 2
+    character: 1
+  end_position:
+    bytes: 40
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 40
+    line: 2
+    character: 4
+  end_position:
+    bytes: 41
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 41
+    line: 2
+    character: 5
+  end_position:
+    bytes: 42
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: _
+- start_position:
+    bytes: 42
+    line: 2
+    character: 6
+  end_position:
+    bytes: 43
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 43
+    line: 2
+    character: 7
+  end_position:
+    bytes: 44
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 44
+    line: 2
+    character: 8
+  end_position:
+    bytes: 45
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 45
+    line: 2
+    character: 9
+  end_position:
+    bytes: 50
+    line: 2
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: start
+- start_position:
+    bytes: 50
+    line: 2
+    character: 14
+  end_position:
+    bytes: 51
+    line: 2
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 51
+    line: 2
+    character: 15
+  end_position:
+    bytes: 52
+    line: 2
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 52
+    line: 2
+    character: 16
+  end_position:
+    bytes: 57
+    line: 2
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: final
+- start_position:
+    bytes: 57
+    line: 2
+    character: 21
+  end_position:
+    bytes: 58
+    line: 2
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 58
+    line: 2
+    character: 22
+  end_position:
+    bytes: 60
+    line: 2
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 60
+    line: 2
+    character: 24
+  end_position:
+    bytes: 61
+    line: 2
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 61
+    line: 2
+    character: 25
+  end_position:
+    bytes: 64
+    line: 2
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 64
+    line: 2
+    character: 28
+  end_position:
+    bytes: 65
+    line: 2
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 65
+    line: 3
+    character: 1
+  end_position:
+    bytes: 68
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 68
+    line: 3
+    character: 4
+  end_position:
+    bytes: 69
+    line: 3
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 69
+    line: 3
+    character: 5
+  end_position:
+    bytes: 70
+    line: 3
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: _
+- start_position:
+    bytes: 70
+    line: 3
+    character: 6
+  end_position:
+    bytes: 71
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 71
+    line: 3
+    character: 7
+  end_position:
+    bytes: 72
+    line: 3
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 72
+    line: 3
+    character: 8
+  end_position:
+    bytes: 73
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 73
+    line: 3
+    character: 9
+  end_position:
+    bytes: 74
+    line: 3
+    character: 10
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 74
+    line: 3
+    character: 10
+  end_position:
+    bytes: 75
+    line: 3
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 75
+    line: 3
+    character: 11
+  end_position:
+    bytes: 76
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 76
+    line: 3
+    character: 12
+  end_position:
+    bytes: 78
+    line: 3
+    character: 14
+  token_type:
+    type: Number
+    text: "10"
+- start_position:
+    bytes: 78
+    line: 3
+    character: 14
+  end_position:
+    bytes: 79
+    line: 3
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 79
+    line: 3
+    character: 15
+  end_position:
+    bytes: 80
+    line: 3
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 80
+    line: 3
+    character: 16
+  end_position:
+    bytes: 81
+    line: 3
+    character: 17
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 81
+    line: 3
+    character: 17
+  end_position:
+    bytes: 82
+    line: 3
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 82
+    line: 3
+    character: 18
+  end_position:
+    bytes: 84
+    line: 3
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 84
+    line: 3
+    character: 20
+  end_position:
+    bytes: 85
+    line: 3
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 85
+    line: 3
+    character: 21
+  end_position:
+    bytes: 88
+    line: 3
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 88
+    line: 3
+    character: 24
+  end_position:
+    bytes: 88
+    line: 3
+    character: 24
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/ast.snap
new file mode 100644
index 00000000..3da56a49
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/ast.snap
@@ -0,0 +1,252 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/paren-expressions
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 10
+                          line: 1
+                          character: 11
+                        end_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          end_position:
+                            bytes: 12
+                            line: 1
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    Plus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 12
+                          line: 1
+                          character: 13
+                        end_position:
+                          bytes: 13
+                          line: 1
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: +
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 13
+                            line: 1
+                            character: 14
+                          end_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Parentheses:
+                      contained:
+                        tokens:
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 14
+                                line: 1
+                                character: 15
+                              end_position:
+                                bytes: 15
+                                line: 1
+                                character: 16
+                              token_type:
+                                type: Symbol
+                                symbol: (
+                            trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 20
+                                line: 1
+                                character: 21
+                              end_position:
+                                bytes: 21
+                                line: 1
+                                character: 22
+                              token_type:
+                                type: Symbol
+                                symbol: )
+                            trailing_trivia: []
+                      expression:
+                        BinaryOperator:
+                          lhs:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 15
+                                  line: 1
+                                  character: 16
+                                end_position:
+                                  bytes: 16
+                                  line: 1
+                                  character: 17
+                                token_type:
+                                  type: Number
+                                  text: "2"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 16
+                                    line: 1
+                                    character: 17
+                                  end_position:
+                                    bytes: 17
+                                    line: 1
+                                    character: 18
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                          binop:
+                            Minus:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 17
+                                  line: 1
+                                  character: 18
+                                end_position:
+                                  bytes: 18
+                                  line: 1
+                                  character: 19
+                                token_type:
+                                  type: Symbol
+                                  symbol: "-"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 18
+                                    line: 1
+                                    character: 19
+                                  end_position:
+                                    bytes: 19
+                                    line: 1
+                                    character: 20
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                          rhs:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 19
+                                  line: 1
+                                  character: 20
+                                end_position:
+                                  bytes: 20
+                                  line: 1
+                                  character: 21
+                                token_type:
+                                  type: Number
+                                  text: "3"
+                              trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/source.lua
new file mode 100644
index 00000000..58013466
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/source.lua
@@ -0,0 +1 @@
+local x = 1 + (2 - 3)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/tokens.snap
new file mode 100644
index 00000000..93d1a56d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/paren-expressions/tokens.snap
@@ -0,0 +1,204 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/paren-expressions
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/ast.snap
new file mode 100644
index 00000000..119545d9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/ast.snap
@@ -0,0 +1,157 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/repeat-until
+---
+stmts:
+  - - Repeat:
+        repeat_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: repeat
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 7
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 8
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 8
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 12
+                          line: 2
+                          character: 6
+                        token_type:
+                          type: Identifier
+                          identifier: call
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 12
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 13
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 13
+                                      line: 2
+                                      character: 7
+                                    end_position:
+                                      bytes: 14
+                                      line: 2
+                                      character: 8
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 14
+                                        line: 2
+                                        character: 8
+                                      end_position:
+                                        bytes: 15
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+        until_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 15
+              line: 3
+              character: 1
+            end_position:
+              bytes: 20
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: until
+          trailing_trivia:
+            - start_position:
+                bytes: 20
+                line: 3
+                character: 6
+              end_position:
+                bytes: 21
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        until:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 21
+                  line: 3
+                  character: 7
+                end_position:
+                  bytes: 30
+                  line: 3
+                  character: 16
+                token_type:
+                  type: Identifier
+                  identifier: condition
+              trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/source.lua
new file mode 100644
index 00000000..e9b8e592
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/source.lua
@@ -0,0 +1,3 @@
+repeat
+	call()
+until condition
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/tokens.snap
new file mode 100644
index 00000000..6a469aeb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/repeat-until/tokens.snap
@@ -0,0 +1,127 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/repeat-until
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: repeat
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 7
+    line: 2
+    character: 1
+  end_position:
+    bytes: 8
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 8
+    line: 2
+    character: 2
+  end_position:
+    bytes: 12
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 12
+    line: 2
+    character: 6
+  end_position:
+    bytes: 13
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 13
+    line: 2
+    character: 7
+  end_position:
+    bytes: 14
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 2
+    character: 8
+  end_position:
+    bytes: 15
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 3
+    character: 1
+  end_position:
+    bytes: 20
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: until
+- start_position:
+    bytes: 20
+    line: 3
+    character: 6
+  end_position:
+    bytes: 21
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 21
+    line: 3
+    character: 7
+  end_position:
+    bytes: 30
+    line: 3
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: condition
+- start_position:
+    bytes: 30
+    line: 3
+    character: 16
+  end_position:
+    bytes: 30
+    line: 3
+    character: 16
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/return-break/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/return-break/ast.snap
new file mode 100644
index 00000000..eddce61d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/return-break/ast.snap
@@ -0,0 +1,346 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/return-break
+---
+stmts:
+  - - Do:
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 2
+              line: 1
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 2
+                line: 1
+                character: 3
+              end_position:
+                bytes: 3
+                line: 1
+                character: 3
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts: []
+          last_stmt:
+            - Return:
+                token:
+                  leading_trivia:
+                    - start_position:
+                        bytes: 3
+                        line: 2
+                        character: 1
+                      end_position:
+                        bytes: 4
+                        line: 2
+                        character: 2
+                      token_type:
+                        type: Whitespace
+                        characters: "\t"
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 2
+                      character: 2
+                    end_position:
+                      bytes: 10
+                      line: 2
+                      character: 8
+                    token_type:
+                      type: Symbol
+                      symbol: return
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 10
+                        line: 2
+                        character: 8
+                      end_position:
+                        bytes: 11
+                        line: 2
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                returns:
+                  pairs:
+                    - End:
+                        Number:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 11
+                              line: 2
+                              character: 9
+                            end_position:
+                              bytes: 12
+                              line: 2
+                              character: 10
+                            token_type:
+                              type: Number
+                              text: "1"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 12
+                                line: 2
+                                character: 10
+                              end_position:
+                                bytes: 13
+                                line: 2
+                                character: 10
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+            - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 13
+              line: 3
+              character: 1
+            end_position:
+              bytes: 16
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 16
+                line: 3
+                character: 4
+              end_position:
+                bytes: 17
+                line: 3
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
+  - - Do:
+        do_token:
+          leading_trivia:
+            - start_position:
+                bytes: 17
+                line: 4
+                character: 1
+              end_position:
+                bytes: 18
+                line: 4
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 18
+              line: 5
+              character: 1
+            end_position:
+              bytes: 20
+              line: 5
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 20
+                line: 5
+                character: 3
+              end_position:
+                bytes: 21
+                line: 5
+                character: 3
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts: []
+          last_stmt:
+            - Break:
+                leading_trivia:
+                  - start_position:
+                      bytes: 21
+                      line: 6
+                      character: 1
+                    end_position:
+                      bytes: 22
+                      line: 6
+                      character: 2
+                    token_type:
+                      type: Whitespace
+                      characters: "\t"
+                token:
+                  start_position:
+                    bytes: 22
+                    line: 6
+                    character: 2
+                  end_position:
+                    bytes: 27
+                    line: 6
+                    character: 7
+                  token_type:
+                    type: Symbol
+                    symbol: break
+                trailing_trivia:
+                  - start_position:
+                      bytes: 27
+                      line: 6
+                      character: 7
+                    end_position:
+                      bytes: 28
+                      line: 6
+                      character: 7
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+            - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 28
+              line: 7
+              character: 1
+            end_position:
+              bytes: 31
+              line: 7
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 31
+                line: 7
+                character: 4
+              end_position:
+                bytes: 32
+                line: 7
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
+last_stmt:
+  - Return:
+      token:
+        leading_trivia:
+          - start_position:
+              bytes: 32
+              line: 8
+              character: 1
+            end_position:
+              bytes: 33
+              line: 8
+              character: 1
+            token_type:
+              type: Whitespace
+              characters: "\n"
+        token:
+          start_position:
+            bytes: 33
+            line: 9
+            character: 1
+          end_position:
+            bytes: 39
+            line: 9
+            character: 7
+          token_type:
+            type: Symbol
+            symbol: return
+        trailing_trivia:
+          - start_position:
+              bytes: 39
+              line: 9
+              character: 7
+            end_position:
+              bytes: 40
+              line: 9
+              character: 8
+            token_type:
+              type: Whitespace
+              characters: " "
+      returns:
+        pairs:
+          - End:
+              FunctionCall:
+                prefix:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 40
+                        line: 9
+                        character: 8
+                      end_position:
+                        bytes: 44
+                        line: 9
+                        character: 12
+                      token_type:
+                        type: Identifier
+                        identifier: call
+                    trailing_trivia: []
+                suffixes:
+                  - Call:
+                      AnonymousCall:
+                        Parentheses:
+                          parentheses:
+                            tokens:
+                              - leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 44
+                                    line: 9
+                                    character: 12
+                                  end_position:
+                                    bytes: 45
+                                    line: 9
+                                    character: 13
+                                  token_type:
+                                    type: Symbol
+                                    symbol: (
+                                trailing_trivia: []
+                              - leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 45
+                                    line: 9
+                                    character: 13
+                                  end_position:
+                                    bytes: 46
+                                    line: 9
+                                    character: 14
+                                  token_type:
+                                    type: Symbol
+                                    symbol: )
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 46
+                                      line: 9
+                                      character: 14
+                                    end_position:
+                                      bytes: 47
+                                      line: 9
+                                      character: 14
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\n"
+                          arguments:
+                            pairs: []
+  - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/return-break/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/return-break/source.lua
new file mode 100644
index 00000000..e0cf1504
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/return-break/source.lua
@@ -0,0 +1,9 @@
+do
+	return 1
+end
+
+do
+	break
+end
+
+return call()
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/return-break/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/return-break/tokens.snap
new file mode 100644
index 00000000..1038c32a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/return-break/tokens.snap
@@ -0,0 +1,281 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/return-break
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 3
+    line: 1
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 3
+    line: 2
+    character: 1
+  end_position:
+    bytes: 4
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 4
+    line: 2
+    character: 2
+  end_position:
+    bytes: 10
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 10
+    line: 2
+    character: 8
+  end_position:
+    bytes: 11
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 2
+    character: 9
+  end_position:
+    bytes: 12
+    line: 2
+    character: 10
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 10
+  end_position:
+    bytes: 13
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 13
+    line: 3
+    character: 1
+  end_position:
+    bytes: 16
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 16
+    line: 3
+    character: 4
+  end_position:
+    bytes: 17
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 17
+    line: 4
+    character: 1
+  end_position:
+    bytes: 18
+    line: 4
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 18
+    line: 5
+    character: 1
+  end_position:
+    bytes: 20
+    line: 5
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 20
+    line: 5
+    character: 3
+  end_position:
+    bytes: 21
+    line: 5
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 21
+    line: 6
+    character: 1
+  end_position:
+    bytes: 22
+    line: 6
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 22
+    line: 6
+    character: 2
+  end_position:
+    bytes: 27
+    line: 6
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: break
+- start_position:
+    bytes: 27
+    line: 6
+    character: 7
+  end_position:
+    bytes: 28
+    line: 6
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 28
+    line: 7
+    character: 1
+  end_position:
+    bytes: 31
+    line: 7
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 31
+    line: 7
+    character: 4
+  end_position:
+    bytes: 32
+    line: 7
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 32
+    line: 8
+    character: 1
+  end_position:
+    bytes: 33
+    line: 8
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 33
+    line: 9
+    character: 1
+  end_position:
+    bytes: 39
+    line: 9
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 39
+    line: 9
+    character: 7
+  end_position:
+    bytes: 40
+    line: 9
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 40
+    line: 9
+    character: 8
+  end_position:
+    bytes: 44
+    line: 9
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 44
+    line: 9
+    character: 12
+  end_position:
+    bytes: 45
+    line: 9
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 45
+    line: 9
+    character: 13
+  end_position:
+    bytes: 46
+    line: 9
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 46
+    line: 9
+    character: 14
+  end_position:
+    bytes: 47
+    line: 9
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 47
+    line: 10
+    character: 1
+  end_position:
+    bytes: 47
+    line: 10
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/ast.snap
new file mode 100644
index 00000000..04d72ebf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/ast.snap
@@ -0,0 +1,264 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/semicolons-1
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia: []
+    - leading_trivia: []
+      token:
+        start_position:
+          bytes: 11
+          line: 1
+          character: 12
+        end_position:
+          bytes: 12
+          line: 1
+          character: 13
+        token_type:
+          type: Symbol
+          symbol: ;
+      trailing_trivia:
+        - start_position:
+            bytes: 12
+            line: 1
+            character: 13
+          end_position:
+            bytes: 13
+            line: 1
+            character: 14
+          token_type:
+            type: Whitespace
+            characters: " "
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 13
+                      line: 1
+                      character: 14
+                    end_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 14
+                        line: 1
+                        character: 15
+                      end_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 15
+              line: 1
+              character: 16
+            end_position:
+              bytes: 16
+              line: 1
+              character: 17
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 16
+                line: 1
+                character: 17
+              end_position:
+                bytes: 17
+                line: 1
+                character: 18
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 17
+                            line: 1
+                            character: 18
+                          end_position:
+                            bytes: 18
+                            line: 1
+                            character: 19
+                          token_type:
+                            type: Identifier
+                            identifier: x
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 18
+                              line: 1
+                              character: 19
+                            end_position:
+                              bytes: 19
+                              line: 1
+                              character: 20
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  binop:
+                    Plus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 19
+                          line: 1
+                          character: 20
+                        end_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        token_type:
+                          type: Symbol
+                          symbol: +
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 20
+                            line: 1
+                            character: 21
+                          end_position:
+                            bytes: 21
+                            line: 1
+                            character: 22
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 21
+                          line: 1
+                          character: 22
+                        end_position:
+                          bytes: 22
+                          line: 1
+                          character: 23
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/source.lua
new file mode 100644
index 00000000..60b7ec8f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/source.lua
@@ -0,0 +1 @@
+local x = 1; x = x + 1
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/tokens.snap
new file mode 100644
index 00000000..36c82311
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-1/tokens.snap
@@ -0,0 +1,215 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/semicolons-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/ast.snap
new file mode 100644
index 00000000..8424289c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/ast.snap
@@ -0,0 +1,180 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/semicolons-2
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+last_stmt:
+  - Return:
+      token:
+        leading_trivia: []
+        token:
+          start_position:
+            bytes: 12
+            line: 2
+            character: 1
+          end_position:
+            bytes: 18
+            line: 2
+            character: 7
+          token_type:
+            type: Symbol
+            symbol: return
+        trailing_trivia:
+          - start_position:
+              bytes: 18
+              line: 2
+              character: 7
+            end_position:
+              bytes: 19
+              line: 2
+              character: 8
+            token_type:
+              type: Whitespace
+              characters: " "
+      returns:
+        pairs:
+          - End:
+              Var:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 19
+                      line: 2
+                      character: 8
+                    end_position:
+                      bytes: 20
+                      line: 2
+                      character: 9
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia: []
+  - leading_trivia: []
+    token:
+      start_position:
+        bytes: 20
+        line: 2
+        character: 9
+      end_position:
+        bytes: 21
+        line: 2
+        character: 10
+      token_type:
+        type: Symbol
+        symbol: ;
+    trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/source.lua
new file mode 100644
index 00000000..ad92d125
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/source.lua
@@ -0,0 +1,2 @@
+local x = 1
+return x;
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/tokens.snap
new file mode 100644
index 00000000..ba27d4cb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/semicolons-2/tokens.snap
@@ -0,0 +1,149 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/semicolons-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 18
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 18
+    line: 2
+    character: 7
+  end_position:
+    bytes: 19
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 8
+  end_position:
+    bytes: 20
+    line: 2
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 20
+    line: 2
+    character: 9
+  end_position:
+    bytes: 21
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 21
+    line: 2
+    character: 10
+  end_position:
+    bytes: 21
+    line: 2
+    character: 10
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/shebang/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/shebang/ast.snap
new file mode 100644
index 00000000..6b459033
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/shebang/ast.snap
@@ -0,0 +1,136 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 47
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/shebang
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia:
+              - start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 18
+                  line: 1
+                  character: 19
+                token_type:
+                  type: Shebang
+                  line: "#!/usr/bin/env lua"
+              - start_position:
+                  bytes: 18
+                  line: 1
+                  character: 19
+                end_position:
+                  bytes: 19
+                  line: 1
+                  character: 19
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+              - start_position:
+                  bytes: 19
+                  line: 2
+                  character: 1
+                end_position:
+                  bytes: 20
+                  line: 2
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 20
+                line: 3
+                character: 1
+              end_position:
+                bytes: 25
+                line: 3
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: print
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 25
+                            line: 3
+                            character: 6
+                          end_position:
+                            bytes: 26
+                            line: 3
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 39
+                            line: 3
+                            character: 20
+                          end_position:
+                            bytes: 40
+                            line: 3
+                            character: 21
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 26
+                                line: 3
+                                character: 7
+                              end_position:
+                                bytes: 39
+                                line: 3
+                                character: 20
+                              token_type:
+                                type: StringLiteral
+                                literal: Hello world
+                                quote_type: Double
+                            trailing_trivia: []
+    - leading_trivia: []
+      token:
+        start_position:
+          bytes: 40
+          line: 3
+          character: 21
+        end_position:
+          bytes: 41
+          line: 3
+          character: 22
+        token_type:
+          type: Symbol
+          symbol: ;
+      trailing_trivia:
+        - start_position:
+            bytes: 41
+            line: 3
+            character: 22
+          end_position:
+            bytes: 42
+            line: 3
+            character: 22
+          token_type:
+            type: Whitespace
+            characters: "\n"
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/shebang/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/shebang/source.lua
new file mode 100644
index 00000000..202a2c86
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/shebang/source.lua
@@ -0,0 +1,3 @@
+#!/usr/bin/env lua
+
+print("Hello world");
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/shebang/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/shebang/tokens.snap
new file mode 100644
index 00000000..2cea7643
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/shebang/tokens.snap
@@ -0,0 +1,117 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 40
+expression: tokens
+input_file: full-moon/tests/cases/pass/shebang
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Shebang
+    line: "#!/usr/bin/env lua"
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 2
+    character: 1
+  end_position:
+    bytes: 20
+    line: 2
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 20
+    line: 3
+    character: 1
+  end_position:
+    bytes: 25
+    line: 3
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 25
+    line: 3
+    character: 6
+  end_position:
+    bytes: 26
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 26
+    line: 3
+    character: 7
+  end_position:
+    bytes: 39
+    line: 3
+    character: 20
+  token_type:
+    type: StringLiteral
+    literal: Hello world
+    quote_type: Double
+- start_position:
+    bytes: 39
+    line: 3
+    character: 20
+  end_position:
+    bytes: 40
+    line: 3
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 40
+    line: 3
+    character: 21
+  end_position:
+    bytes: 41
+    line: 3
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 41
+    line: 3
+    character: 22
+  end_position:
+    bytes: 42
+    line: 3
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 42
+    line: 4
+    character: 1
+  end_position:
+    bytes: 42
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/ast.snap
new file mode 100644
index 00000000..1dda28e0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/single-line-comment-1
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/source.lua
new file mode 100644
index 00000000..4a7ee141
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/source.lua
@@ -0,0 +1,2 @@
+-- hello world
+-- and doge you too
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/tokens.snap
new file mode 100644
index 00000000..92ea6957
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-1/tokens.snap
@@ -0,0 +1,50 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/single-line-comment-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: SingleLineComment
+    comment: " hello world"
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 34
+    line: 2
+    character: 20
+  token_type:
+    type: SingleLineComment
+    comment: " and doge you too"
+- start_position:
+    bytes: 34
+    line: 2
+    character: 20
+  end_position:
+    bytes: 34
+    line: 2
+    character: 20
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/ast.snap
new file mode 100644
index 00000000..540e9bcc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/ast.snap
@@ -0,0 +1,84 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/single-line-comment-2
+
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          end_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          end_position:
+                            bytes: 6
+                            line: 1
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 6
+                              line: 1
+                              character: 7
+                            end_position:
+                              bytes: 7
+                              line: 1
+                              character: 8
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                          - start_position:
+                              bytes: 7
+                              line: 1
+                              character: 8
+                            end_position:
+                              bytes: 20
+                              line: 1
+                              character: 21
+                            token_type:
+                              type: SingleLineComment
+                              comment: " This calls"
+                  arguments:
+                    pairs: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/source.lua
new file mode 100644
index 00000000..2e1eecc9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/source.lua
@@ -0,0 +1 @@
+call() -- This calls
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/tokens.snap
new file mode 100644
index 00000000..37c9362a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-2/tokens.snap
@@ -0,0 +1,72 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/single-line-comment-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: SingleLineComment
+    comment: " This calls"
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/ast.snap
new file mode 100644
index 00000000..cb7ae8e8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/single-line-comment-3
+
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/source.lua
new file mode 100644
index 00000000..d83f9542
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/source.lua
@@ -0,0 +1 @@
+-- tab	in comment
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/tokens.snap
new file mode 100644
index 00000000..3405d41f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-3/tokens.snap
@@ -0,0 +1,28 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/single-line-comment-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: SingleLineComment
+    comment: " tab\tin comment"
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/ast.snap
new file mode 100644
index 00000000..1ffe9aa9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/ast.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/single-line-comment-4
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/source.lua
new file mode 100644
index 00000000..59720073
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/source.lua
@@ -0,0 +1,4 @@
+--[comment
+--(comment)
+--[=comment
+--
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/tokens.snap
new file mode 100644
index 00000000..e016797a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-4/tokens.snap
@@ -0,0 +1,105 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 38
+expression: tokens
+input_file: full-moon/tests/cases/pass/single-line-comment-4
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: SingleLineComment
+    comment: "[comment"
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 1
+  end_position:
+    bytes: 22
+    line: 2
+    character: 12
+  token_type:
+    type: SingleLineComment
+    comment: (comment)
+- start_position:
+    bytes: 22
+    line: 2
+    character: 12
+  end_position:
+    bytes: 23
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 23
+    line: 3
+    character: 1
+  end_position:
+    bytes: 34
+    line: 3
+    character: 12
+  token_type:
+    type: SingleLineComment
+    comment: "[=comment"
+- start_position:
+    bytes: 34
+    line: 3
+    character: 12
+  end_position:
+    bytes: 35
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 35
+    line: 4
+    character: 1
+  end_position:
+    bytes: 37
+    line: 4
+    character: 3
+  token_type:
+    type: SingleLineComment
+    comment: ""
+- start_position:
+    bytes: 37
+    line: 4
+    character: 3
+  end_position:
+    bytes: 38
+    line: 4
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 38
+    line: 5
+    character: 1
+  end_position:
+    bytes: 38
+    line: 5
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/ast.snap
new file mode 100644
index 00000000..25ffa732
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/ast.snap
@@ -0,0 +1,7 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/source.lua
new file mode 100644
index 00000000..2e983ada
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/source.lua
@@ -0,0 +1,2 @@
+--`signatures` the value defaults to zero or is ignored if `signatures.length
+--=== 0`. Whenever possible implementors should make an active decision about
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/tokens.snap
new file mode 100644
index 00000000..f17080eb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-5/tokens.snap
@@ -0,0 +1,49 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 38
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 77
+    line: 1
+    character: 78
+  token_type:
+    type: SingleLineComment
+    comment: "`signatures` the value defaults to zero or is ignored if `signatures.length"
+- start_position:
+    bytes: 77
+    line: 1
+    character: 78
+  end_position:
+    bytes: 78
+    line: 1
+    character: 78
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 78
+    line: 2
+    character: 1
+  end_position:
+    bytes: 155
+    line: 2
+    character: 78
+  token_type:
+    type: SingleLineComment
+    comment: "=== 0`. Whenever possible implementors should make an active decision about"
+- start_position:
+    bytes: 155
+    line: 2
+    character: 78
+  end_position:
+    bytes: 155
+    line: 2
+    character: 78
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/ast.snap
new file mode 100644
index 00000000..25ffa732
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/ast.snap
@@ -0,0 +1,7 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+---
+stmts: []
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/source.lua
new file mode 100644
index 00000000..f822b93c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/source.lua
@@ -0,0 +1 @@
+--随便写点中文
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/tokens.snap
new file mode 100644
index 00000000..223fb990
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-6/tokens.snap
@@ -0,0 +1,39 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 40
+expression: tokens
+input_file: full-moon/tests/cases/pass/single-line-comment-6
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 20
+    line: 1
+    character: 9
+  token_type:
+    type: SingleLineComment
+    comment: 随便写点中文
+- start_position:
+    bytes: 20
+    line: 1
+    character: 9
+  end_position:
+    bytes: 21
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 21
+    line: 2
+    character: 1
+  end_position:
+    bytes: 21
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/ast.snap
new file mode 100644
index 00000000..640d51b6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/ast.snap
@@ -0,0 +1,119 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/single-line-comment-7
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: a
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/source.lua
new file mode 100644
index 00000000..2f5cb166
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/source.lua
@@ -0,0 +1,3 @@
+local a = 1
+
+--}}封装方便访问的接口==========================================
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/tokens.snap
new file mode 100644
index 00000000..87f28442
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/single-line-comment-7/tokens.snap
@@ -0,0 +1,127 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 40
+expression: tokens
+input_file: full-moon/tests/cases/pass/single-line-comment-7
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 13
+    line: 2
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 13
+    line: 3
+    character: 1
+  end_position:
+    bytes: 86
+    line: 3
+    character: 56
+  token_type:
+    type: SingleLineComment
+    comment: "}}封装方便访问的接口=========================================="
+- start_position:
+    bytes: 86
+    line: 3
+    character: 56
+  end_position:
+    bytes: 86
+    line: 3
+    character: 56
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/ast.snap
new file mode 100644
index 00000000..d36adc4b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/ast.snap
@@ -0,0 +1,90 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/strings-escape-newline
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: print
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          end_position:
+                            bytes: 6
+                            line: 1
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 17
+                            line: 2
+                            character: 6
+                          end_position:
+                            bytes: 18
+                            line: 2
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 18
+                              line: 2
+                              character: 7
+                            end_position:
+                              bytes: 19
+                              line: 2
+                              character: 7
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 6
+                                line: 1
+                                character: 7
+                              end_position:
+                                bytes: 17
+                                line: 2
+                                character: 6
+                              token_type:
+                                type: StringLiteral
+                                literal: "foo\\\n\tbar"
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/source.lua
new file mode 100644
index 00000000..4ed7bf4c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/source.lua
@@ -0,0 +1,2 @@
+print("foo\
+	bar")
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/tokens.snap
new file mode 100644
index 00000000..173ab55c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape-newline/tokens.snap
@@ -0,0 +1,73 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/strings-escape-newline
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 6
+  token_type:
+    type: StringLiteral
+    literal: "foo\\\n\tbar"
+    quote_type: Double
+- start_position:
+    bytes: 17
+    line: 2
+    character: 6
+  end_position:
+    bytes: 18
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 18
+    line: 2
+    character: 7
+  end_position:
+    bytes: 19
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 3
+    character: 1
+  end_position:
+    bytes: 19
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/ast.snap
new file mode 100644
index 00000000..f1cdb6c7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/ast.snap
@@ -0,0 +1,385 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/strings-escape
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          end_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 9
+                            line: 1
+                            character: 10
+                          end_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 10
+                              line: 1
+                              character: 11
+                            end_position:
+                              bytes: 11
+                              line: 1
+                              character: 11
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 5
+                                line: 1
+                                character: 6
+                              end_position:
+                                bytes: 9
+                                line: 1
+                                character: 10
+                              token_type:
+                                type: StringLiteral
+                                literal: "\\\\"
+                                quote_type: Single
+                            trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 11
+                line: 2
+                character: 1
+              end_position:
+                bytes: 15
+                line: 2
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 15
+                            line: 2
+                            character: 5
+                          end_position:
+                            bytes: 16
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 20
+                            line: 2
+                            character: 10
+                          end_position:
+                            bytes: 21
+                            line: 2
+                            character: 11
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 21
+                              line: 2
+                              character: 11
+                            end_position:
+                              bytes: 22
+                              line: 2
+                              character: 11
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 16
+                                line: 2
+                                character: 6
+                              end_position:
+                                bytes: 20
+                                line: 2
+                                character: 10
+                              token_type:
+                                type: StringLiteral
+                                literal: "\\\\"
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 22
+                line: 3
+                character: 1
+              end_position:
+                bytes: 26
+                line: 3
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 26
+                            line: 3
+                            character: 5
+                          end_position:
+                            bytes: 27
+                            line: 3
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 42
+                            line: 3
+                            character: 21
+                          end_position:
+                            bytes: 43
+                            line: 3
+                            character: 22
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          TableConstructor:
+                            braces:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 27
+                                      line: 3
+                                      character: 6
+                                    end_position:
+                                      bytes: 28
+                                      line: 3
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "{"
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 28
+                                        line: 3
+                                        character: 7
+                                      end_position:
+                                        bytes: 29
+                                        line: 3
+                                        character: 8
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 41
+                                      line: 3
+                                      character: 20
+                                    end_position:
+                                      bytes: 42
+                                      line: 3
+                                      character: 21
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "}"
+                                  trailing_trivia: []
+                            fields:
+                              pairs:
+                                - End:
+                                    ExpressionKey:
+                                      brackets:
+                                        tokens:
+                                          - leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 29
+                                                line: 3
+                                                character: 8
+                                              end_position:
+                                                bytes: 30
+                                                line: 3
+                                                character: 9
+                                              token_type:
+                                                type: Symbol
+                                                symbol: "["
+                                            trailing_trivia: []
+                                          - leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 34
+                                                line: 3
+                                                character: 13
+                                              end_position:
+                                                bytes: 35
+                                                line: 3
+                                                character: 14
+                                              token_type:
+                                                type: Symbol
+                                                symbol: "]"
+                                            trailing_trivia:
+                                              - start_position:
+                                                  bytes: 35
+                                                  line: 3
+                                                  character: 14
+                                                end_position:
+                                                  bytes: 36
+                                                  line: 3
+                                                  character: 15
+                                                token_type:
+                                                  type: Whitespace
+                                                  characters: " "
+                                      key:
+                                        String:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 30
+                                              line: 3
+                                              character: 9
+                                            end_position:
+                                              bytes: 34
+                                              line: 3
+                                              character: 13
+                                            token_type:
+                                              type: StringLiteral
+                                              literal: "\\\\"
+                                              quote_type: Double
+                                          trailing_trivia: []
+                                      equal:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 36
+                                            line: 3
+                                            character: 15
+                                          end_position:
+                                            bytes: 37
+                                            line: 3
+                                            character: 16
+                                          token_type:
+                                            type: Symbol
+                                            symbol: "="
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 37
+                                              line: 3
+                                              character: 16
+                                            end_position:
+                                              bytes: 38
+                                              line: 3
+                                              character: 17
+                                            token_type:
+                                              type: Whitespace
+                                              characters: " "
+                                      value:
+                                        String:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 38
+                                              line: 3
+                                              character: 17
+                                            end_position:
+                                              bytes: 40
+                                              line: 3
+                                              character: 19
+                                            token_type:
+                                              type: StringLiteral
+                                              literal: ""
+                                              quote_type: Double
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 40
+                                                line: 3
+                                                character: 19
+                                              end_position:
+                                                bytes: 41
+                                                line: 3
+                                                character: 20
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/source.lua
new file mode 100644
index 00000000..5c2e4f13
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/source.lua
@@ -0,0 +1,3 @@
+call('\\')
+call("\\")
+call({ ["\\"] = "" })
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/tokens.snap
new file mode 100644
index 00000000..b5501309
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings-escape/tokens.snap
@@ -0,0 +1,284 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 38
+expression: tokens
+input_file: full-moon/tests/cases/pass/strings-escape
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: StringLiteral
+    literal: "\\\\"
+    quote_type: Single
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 11
+    line: 2
+    character: 1
+  end_position:
+    bytes: 15
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 15
+    line: 2
+    character: 5
+  end_position:
+    bytes: 16
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 16
+    line: 2
+    character: 6
+  end_position:
+    bytes: 20
+    line: 2
+    character: 10
+  token_type:
+    type: StringLiteral
+    literal: "\\\\"
+    quote_type: Double
+- start_position:
+    bytes: 20
+    line: 2
+    character: 10
+  end_position:
+    bytes: 21
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 21
+    line: 2
+    character: 11
+  end_position:
+    bytes: 22
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 22
+    line: 3
+    character: 1
+  end_position:
+    bytes: 26
+    line: 3
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 26
+    line: 3
+    character: 5
+  end_position:
+    bytes: 27
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 27
+    line: 3
+    character: 6
+  end_position:
+    bytes: 28
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 28
+    line: 3
+    character: 7
+  end_position:
+    bytes: 29
+    line: 3
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 29
+    line: 3
+    character: 8
+  end_position:
+    bytes: 30
+    line: 3
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 30
+    line: 3
+    character: 9
+  end_position:
+    bytes: 34
+    line: 3
+    character: 13
+  token_type:
+    type: StringLiteral
+    literal: "\\\\"
+    quote_type: Double
+- start_position:
+    bytes: 34
+    line: 3
+    character: 13
+  end_position:
+    bytes: 35
+    line: 3
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 35
+    line: 3
+    character: 14
+  end_position:
+    bytes: 36
+    line: 3
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 36
+    line: 3
+    character: 15
+  end_position:
+    bytes: 37
+    line: 3
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 37
+    line: 3
+    character: 16
+  end_position:
+    bytes: 38
+    line: 3
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 38
+    line: 3
+    character: 17
+  end_position:
+    bytes: 40
+    line: 3
+    character: 19
+  token_type:
+    type: StringLiteral
+    literal: ""
+    quote_type: Double
+- start_position:
+    bytes: 40
+    line: 3
+    character: 19
+  end_position:
+    bytes: 41
+    line: 3
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 41
+    line: 3
+    character: 20
+  end_position:
+    bytes: 42
+    line: 3
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 42
+    line: 3
+    character: 21
+  end_position:
+    bytes: 43
+    line: 3
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 43
+    line: 3
+    character: 22
+  end_position:
+    bytes: 43
+    line: 3
+    character: 22
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/strings/ast.snap
new file mode 100644
index 00000000..4a9bf05e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings/ast.snap
@@ -0,0 +1,325 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/strings
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 4
+                            line: 1
+                            character: 5
+                          end_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 13
+                            line: 1
+                            character: 14
+                          end_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 14
+                              line: 1
+                              character: 15
+                            end_position:
+                              bytes: 15
+                              line: 1
+                              character: 15
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 5
+                                line: 1
+                                character: 6
+                              end_position:
+                                bytes: 13
+                                line: 1
+                                character: 14
+                              token_type:
+                                type: StringLiteral
+                                literal: double
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 15
+                line: 2
+                character: 1
+              end_position:
+                bytes: 19
+                line: 2
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 19
+                            line: 2
+                            character: 5
+                          end_position:
+                            bytes: 20
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 28
+                            line: 2
+                            character: 14
+                          end_position:
+                            bytes: 29
+                            line: 2
+                            character: 15
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 29
+                              line: 2
+                              character: 15
+                            end_position:
+                              bytes: 30
+                              line: 2
+                              character: 15
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 20
+                                line: 2
+                                character: 6
+                              end_position:
+                                bytes: 28
+                                line: 2
+                                character: 14
+                              token_type:
+                                type: StringLiteral
+                                literal: single
+                                quote_type: Single
+                            trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 30
+                line: 3
+                character: 1
+              end_position:
+                bytes: 34
+                line: 3
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 34
+                            line: 3
+                            character: 5
+                          end_position:
+                            bytes: 35
+                            line: 3
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 45
+                            line: 3
+                            character: 16
+                          end_position:
+                            bytes: 46
+                            line: 3
+                            character: 17
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 46
+                              line: 3
+                              character: 17
+                            end_position:
+                              bytes: 47
+                              line: 3
+                              character: 17
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 35
+                                line: 3
+                                character: 6
+                              end_position:
+                                bytes: 45
+                                line: 3
+                                character: 16
+                              token_type:
+                                type: StringLiteral
+                                literal: "foo\\nbar"
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 47
+                line: 4
+                character: 1
+              end_position:
+                bytes: 51
+                line: 4
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: call
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 51
+                            line: 4
+                            character: 5
+                          end_position:
+                            bytes: 52
+                            line: 4
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 54
+                            line: 4
+                            character: 8
+                          end_position:
+                            bytes: 55
+                            line: 4
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 52
+                                line: 4
+                                character: 6
+                              end_position:
+                                bytes: 54
+                                line: 4
+                                character: 8
+                              token_type:
+                                type: StringLiteral
+                                literal: ""
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/strings/source.lua
new file mode 100644
index 00000000..9f416840
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings/source.lua
@@ -0,0 +1,4 @@
+call("double")
+call('single')
+call("foo\nbar")
+call("")
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/strings/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/strings/tokens.snap
new file mode 100644
index 00000000..a8ec42c7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/strings/tokens.snap
@@ -0,0 +1,230 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/strings
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: StringLiteral
+    literal: double
+    quote_type: Double
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 19
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 19
+    line: 2
+    character: 5
+  end_position:
+    bytes: 20
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 20
+    line: 2
+    character: 6
+  end_position:
+    bytes: 28
+    line: 2
+    character: 14
+  token_type:
+    type: StringLiteral
+    literal: single
+    quote_type: Single
+- start_position:
+    bytes: 28
+    line: 2
+    character: 14
+  end_position:
+    bytes: 29
+    line: 2
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 29
+    line: 2
+    character: 15
+  end_position:
+    bytes: 30
+    line: 2
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 30
+    line: 3
+    character: 1
+  end_position:
+    bytes: 34
+    line: 3
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 34
+    line: 3
+    character: 5
+  end_position:
+    bytes: 35
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 35
+    line: 3
+    character: 6
+  end_position:
+    bytes: 45
+    line: 3
+    character: 16
+  token_type:
+    type: StringLiteral
+    literal: "foo\\nbar"
+    quote_type: Double
+- start_position:
+    bytes: 45
+    line: 3
+    character: 16
+  end_position:
+    bytes: 46
+    line: 3
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 46
+    line: 3
+    character: 17
+  end_position:
+    bytes: 47
+    line: 3
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 47
+    line: 4
+    character: 1
+  end_position:
+    bytes: 51
+    line: 4
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 51
+    line: 4
+    character: 5
+  end_position:
+    bytes: 52
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 52
+    line: 4
+    character: 6
+  end_position:
+    bytes: 54
+    line: 4
+    character: 8
+  token_type:
+    type: StringLiteral
+    literal: ""
+    quote_type: Double
+- start_position:
+    bytes: 54
+    line: 4
+    character: 8
+  end_position:
+    bytes: 55
+    line: 4
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 55
+    line: 4
+    character: 9
+  end_position:
+    bytes: 55
+    line: 4
+    character: 9
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/ast.snap
new file mode 100644
index 00000000..9c19b7a6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/ast.snap
@@ -0,0 +1,137 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/table-constructor-1
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          end_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 11
+                              line: 1
+                              character: 12
+                            end_position:
+                              bytes: 12
+                              line: 1
+                              character: 12
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 12
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 13
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/source.lua
new file mode 100644
index 00000000..0e6aaa89
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/source.lua
@@ -0,0 +1,2 @@
+local x = {
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/tokens.snap
new file mode 100644
index 00000000..5e2fdf49
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-1/tokens.snap
@@ -0,0 +1,116 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/table-constructor-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 13
+    line: 2
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 2
+  end_position:
+    bytes: 13
+    line: 2
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/ast.snap
new file mode 100644
index 00000000..6c551af2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/ast.snap
@@ -0,0 +1,227 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/table-constructor-2
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          end_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 18
+                            line: 1
+                            character: 19
+                          end_position:
+                            bytes: 19
+                            line: 1
+                            character: 20
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs:
+                      - Punctuated:
+                          - NoKey:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 11
+                                    line: 1
+                                    character: 12
+                                  end_position:
+                                    bytes: 12
+                                    line: 1
+                                    character: 13
+                                  token_type:
+                                    type: Number
+                                    text: "1"
+                                trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 12
+                                line: 1
+                                character: 13
+                              end_position:
+                                bytes: 13
+                                line: 1
+                                character: 14
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 13
+                                  line: 1
+                                  character: 14
+                                end_position:
+                                  bytes: 14
+                                  line: 1
+                                  character: 15
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      - Punctuated:
+                          - NoKey:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 14
+                                    line: 1
+                                    character: 15
+                                  end_position:
+                                    bytes: 15
+                                    line: 1
+                                    character: 16
+                                  token_type:
+                                    type: Number
+                                    text: "2"
+                                trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 15
+                                line: 1
+                                character: 16
+                              end_position:
+                                bytes: 16
+                                line: 1
+                                character: 17
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 16
+                                  line: 1
+                                  character: 17
+                                end_position:
+                                  bytes: 17
+                                  line: 1
+                                  character: 18
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      - End:
+                          NoKey:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 17
+                                  line: 1
+                                  character: 18
+                                end_position:
+                                  bytes: 18
+                                  line: 1
+                                  character: 19
+                                token_type:
+                                  type: Number
+                                  text: "3"
+                              trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/source.lua
new file mode 100644
index 00000000..7192737b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/source.lua
@@ -0,0 +1 @@
+local x = {1, 2, 3}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/tokens.snap
new file mode 100644
index 00000000..7a2f30eb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-2/tokens.snap
@@ -0,0 +1,182 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/table-constructor-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/ast.snap
new file mode 100644
index 00000000..d8685812
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/ast.snap
@@ -0,0 +1,910 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/table-constructor-3
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          end_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 11
+                              line: 1
+                              character: 12
+                            end_position:
+                              bytes: 12
+                              line: 1
+                              character: 12
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 35
+                            line: 5
+                            character: 1
+                          end_position:
+                            bytes: 36
+                            line: 5
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 36
+                              line: 5
+                              character: 2
+                            end_position:
+                              bytes: 37
+                              line: 5
+                              character: 2
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  fields:
+                    pairs:
+                      - Punctuated:
+                          - NameKey:
+                              key:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 12
+                                      line: 2
+                                      character: 1
+                                    end_position:
+                                      bytes: 13
+                                      line: 2
+                                      character: 2
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\t"
+                                token:
+                                  start_position:
+                                    bytes: 13
+                                    line: 2
+                                    character: 2
+                                  end_position:
+                                    bytes: 14
+                                    line: 2
+                                    character: 3
+                                  token_type:
+                                    type: Identifier
+                                    identifier: a
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 14
+                                      line: 2
+                                      character: 3
+                                    end_position:
+                                      bytes: 15
+                                      line: 2
+                                      character: 4
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 15
+                                    line: 2
+                                    character: 4
+                                  end_position:
+                                    bytes: 16
+                                    line: 2
+                                    character: 5
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 16
+                                      line: 2
+                                      character: 5
+                                    end_position:
+                                      bytes: 17
+                                      line: 2
+                                      character: 6
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Number:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 17
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 18
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Number
+                                      text: "1"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 18
+                                line: 2
+                                character: 7
+                              end_position:
+                                bytes: 19
+                                line: 2
+                                character: 8
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 19
+                                  line: 2
+                                  character: 8
+                                end_position:
+                                  bytes: 20
+                                  line: 2
+                                  character: 8
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                      - Punctuated:
+                          - NameKey:
+                              key:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 20
+                                      line: 3
+                                      character: 1
+                                    end_position:
+                                      bytes: 21
+                                      line: 3
+                                      character: 2
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\t"
+                                token:
+                                  start_position:
+                                    bytes: 21
+                                    line: 3
+                                    character: 2
+                                  end_position:
+                                    bytes: 22
+                                    line: 3
+                                    character: 3
+                                  token_type:
+                                    type: Identifier
+                                    identifier: b
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 22
+                                      line: 3
+                                      character: 3
+                                    end_position:
+                                      bytes: 23
+                                      line: 3
+                                      character: 4
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 23
+                                    line: 3
+                                    character: 4
+                                  end_position:
+                                    bytes: 24
+                                    line: 3
+                                    character: 5
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 24
+                                      line: 3
+                                      character: 5
+                                    end_position:
+                                      bytes: 25
+                                      line: 3
+                                      character: 6
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Number:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 25
+                                      line: 3
+                                      character: 6
+                                    end_position:
+                                      bytes: 26
+                                      line: 3
+                                      character: 7
+                                    token_type:
+                                      type: Number
+                                      text: "2"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 26
+                                line: 3
+                                character: 7
+                              end_position:
+                                bytes: 27
+                                line: 3
+                                character: 8
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 27
+                                  line: 3
+                                  character: 8
+                                end_position:
+                                  bytes: 28
+                                  line: 3
+                                  character: 8
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                      - End:
+                          NameKey:
+                            key:
+                              leading_trivia:
+                                - start_position:
+                                    bytes: 28
+                                    line: 4
+                                    character: 1
+                                  end_position:
+                                    bytes: 29
+                                    line: 4
+                                    character: 2
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\t"
+                              token:
+                                start_position:
+                                  bytes: 29
+                                  line: 4
+                                  character: 2
+                                end_position:
+                                  bytes: 30
+                                  line: 4
+                                  character: 3
+                                token_type:
+                                  type: Identifier
+                                  identifier: c
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 30
+                                    line: 4
+                                    character: 3
+                                  end_position:
+                                    bytes: 31
+                                    line: 4
+                                    character: 4
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            equal:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 31
+                                  line: 4
+                                  character: 4
+                                end_position:
+                                  bytes: 32
+                                  line: 4
+                                  character: 5
+                                token_type:
+                                  type: Symbol
+                                  symbol: "="
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 32
+                                    line: 4
+                                    character: 5
+                                  end_position:
+                                    bytes: 33
+                                    line: 4
+                                    character: 6
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            value:
+                              Number:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 33
+                                    line: 4
+                                    character: 6
+                                  end_position:
+                                    bytes: 34
+                                    line: 4
+                                    character: 7
+                                  token_type:
+                                    type: Number
+                                    text: "3"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 34
+                                      line: 4
+                                      character: 7
+                                    end_position:
+                                      bytes: 35
+                                      line: 4
+                                      character: 7
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 37
+                line: 6
+                character: 1
+              end_position:
+                bytes: 38
+                line: 6
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 38
+              line: 7
+              character: 1
+            end_position:
+              bytes: 43
+              line: 7
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 43
+                line: 7
+                character: 6
+              end_position:
+                bytes: 44
+                line: 7
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 44
+                    line: 7
+                    character: 7
+                  end_position:
+                    bytes: 45
+                    line: 7
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: y
+                trailing_trivia:
+                  - start_position:
+                      bytes: 45
+                      line: 7
+                      character: 8
+                    end_position:
+                      bytes: 46
+                      line: 7
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 46
+              line: 7
+              character: 9
+            end_position:
+              bytes: 47
+              line: 7
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 47
+                line: 7
+                character: 10
+              end_position:
+                bytes: 48
+                line: 7
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 48
+                            line: 7
+                            character: 11
+                          end_position:
+                            bytes: 49
+                            line: 7
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 49
+                              line: 7
+                              character: 12
+                            end_position:
+                              bytes: 50
+                              line: 7
+                              character: 12
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 74
+                            line: 11
+                            character: 1
+                          end_position:
+                            bytes: 75
+                            line: 11
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs:
+                      - Punctuated:
+                          - NameKey:
+                              key:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 50
+                                      line: 8
+                                      character: 1
+                                    end_position:
+                                      bytes: 51
+                                      line: 8
+                                      character: 2
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\t"
+                                token:
+                                  start_position:
+                                    bytes: 51
+                                    line: 8
+                                    character: 2
+                                  end_position:
+                                    bytes: 52
+                                    line: 8
+                                    character: 3
+                                  token_type:
+                                    type: Identifier
+                                    identifier: a
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 52
+                                      line: 8
+                                      character: 3
+                                    end_position:
+                                      bytes: 53
+                                      line: 8
+                                      character: 4
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 53
+                                    line: 8
+                                    character: 4
+                                  end_position:
+                                    bytes: 54
+                                    line: 8
+                                    character: 5
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 54
+                                      line: 8
+                                      character: 5
+                                    end_position:
+                                      bytes: 55
+                                      line: 8
+                                      character: 6
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Number:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 55
+                                      line: 8
+                                      character: 6
+                                    end_position:
+                                      bytes: 56
+                                      line: 8
+                                      character: 7
+                                    token_type:
+                                      type: Number
+                                      text: "1"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 56
+                                line: 8
+                                character: 7
+                              end_position:
+                                bytes: 57
+                                line: 8
+                                character: 8
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 57
+                                  line: 8
+                                  character: 8
+                                end_position:
+                                  bytes: 58
+                                  line: 8
+                                  character: 8
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                      - Punctuated:
+                          - NameKey:
+                              key:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 58
+                                      line: 9
+                                      character: 1
+                                    end_position:
+                                      bytes: 59
+                                      line: 9
+                                      character: 2
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\t"
+                                token:
+                                  start_position:
+                                    bytes: 59
+                                    line: 9
+                                    character: 2
+                                  end_position:
+                                    bytes: 60
+                                    line: 9
+                                    character: 3
+                                  token_type:
+                                    type: Identifier
+                                    identifier: b
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 60
+                                      line: 9
+                                      character: 3
+                                    end_position:
+                                      bytes: 61
+                                      line: 9
+                                      character: 4
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 61
+                                    line: 9
+                                    character: 4
+                                  end_position:
+                                    bytes: 62
+                                    line: 9
+                                    character: 5
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 62
+                                      line: 9
+                                      character: 5
+                                    end_position:
+                                      bytes: 63
+                                      line: 9
+                                      character: 6
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Number:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 63
+                                      line: 9
+                                      character: 6
+                                    end_position:
+                                      bytes: 64
+                                      line: 9
+                                      character: 7
+                                    token_type:
+                                      type: Number
+                                      text: "2"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 64
+                                line: 9
+                                character: 7
+                              end_position:
+                                bytes: 65
+                                line: 9
+                                character: 8
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 65
+                                  line: 9
+                                  character: 8
+                                end_position:
+                                  bytes: 66
+                                  line: 9
+                                  character: 8
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                      - Punctuated:
+                          - NameKey:
+                              key:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 66
+                                      line: 10
+                                      character: 1
+                                    end_position:
+                                      bytes: 67
+                                      line: 10
+                                      character: 2
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\t"
+                                token:
+                                  start_position:
+                                    bytes: 67
+                                    line: 10
+                                    character: 2
+                                  end_position:
+                                    bytes: 68
+                                    line: 10
+                                    character: 3
+                                  token_type:
+                                    type: Identifier
+                                    identifier: c
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 68
+                                      line: 10
+                                      character: 3
+                                    end_position:
+                                      bytes: 69
+                                      line: 10
+                                      character: 4
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 69
+                                    line: 10
+                                    character: 4
+                                  end_position:
+                                    bytes: 70
+                                    line: 10
+                                    character: 5
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 70
+                                      line: 10
+                                      character: 5
+                                    end_position:
+                                      bytes: 71
+                                      line: 10
+                                      character: 6
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Number:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 71
+                                      line: 10
+                                      character: 6
+                                    end_position:
+                                      bytes: 72
+                                      line: 10
+                                      character: 7
+                                    token_type:
+                                      type: Number
+                                      text: "3"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 72
+                                line: 10
+                                character: 7
+                              end_position:
+                                bytes: 73
+                                line: 10
+                                character: 8
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 73
+                                  line: 10
+                                  character: 8
+                                end_position:
+                                  bytes: 74
+                                  line: 10
+                                  character: 8
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/source.lua
new file mode 100644
index 00000000..17788fde
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/source.lua
@@ -0,0 +1,11 @@
+local x = {
+	a = 1,
+	b = 2,
+	c = 3
+}
+
+local y = {
+	a = 1,
+	b = 2,
+	c = 3,
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/tokens.snap
new file mode 100644
index 00000000..761cd2d2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-3/tokens.snap
@@ -0,0 +1,754 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/table-constructor-3
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 13
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 2
+  end_position:
+    bytes: 14
+    line: 2
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 14
+    line: 2
+    character: 3
+  end_position:
+    bytes: 15
+    line: 2
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 2
+    character: 4
+  end_position:
+    bytes: 16
+    line: 2
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 16
+    line: 2
+    character: 5
+  end_position:
+    bytes: 17
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 2
+    character: 6
+  end_position:
+    bytes: 18
+    line: 2
+    character: 7
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 18
+    line: 2
+    character: 7
+  end_position:
+    bytes: 19
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 19
+    line: 2
+    character: 8
+  end_position:
+    bytes: 20
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 20
+    line: 3
+    character: 1
+  end_position:
+    bytes: 21
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 21
+    line: 3
+    character: 2
+  end_position:
+    bytes: 22
+    line: 3
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 22
+    line: 3
+    character: 3
+  end_position:
+    bytes: 23
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 23
+    line: 3
+    character: 4
+  end_position:
+    bytes: 24
+    line: 3
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 24
+    line: 3
+    character: 5
+  end_position:
+    bytes: 25
+    line: 3
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 25
+    line: 3
+    character: 6
+  end_position:
+    bytes: 26
+    line: 3
+    character: 7
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 26
+    line: 3
+    character: 7
+  end_position:
+    bytes: 27
+    line: 3
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 27
+    line: 3
+    character: 8
+  end_position:
+    bytes: 28
+    line: 3
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 28
+    line: 4
+    character: 1
+  end_position:
+    bytes: 29
+    line: 4
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 29
+    line: 4
+    character: 2
+  end_position:
+    bytes: 30
+    line: 4
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 30
+    line: 4
+    character: 3
+  end_position:
+    bytes: 31
+    line: 4
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 31
+    line: 4
+    character: 4
+  end_position:
+    bytes: 32
+    line: 4
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 32
+    line: 4
+    character: 5
+  end_position:
+    bytes: 33
+    line: 4
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 33
+    line: 4
+    character: 6
+  end_position:
+    bytes: 34
+    line: 4
+    character: 7
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 34
+    line: 4
+    character: 7
+  end_position:
+    bytes: 35
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 35
+    line: 5
+    character: 1
+  end_position:
+    bytes: 36
+    line: 5
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 36
+    line: 5
+    character: 2
+  end_position:
+    bytes: 37
+    line: 5
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 37
+    line: 6
+    character: 1
+  end_position:
+    bytes: 38
+    line: 6
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 38
+    line: 7
+    character: 1
+  end_position:
+    bytes: 43
+    line: 7
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 43
+    line: 7
+    character: 6
+  end_position:
+    bytes: 44
+    line: 7
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 44
+    line: 7
+    character: 7
+  end_position:
+    bytes: 45
+    line: 7
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 45
+    line: 7
+    character: 8
+  end_position:
+    bytes: 46
+    line: 7
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 46
+    line: 7
+    character: 9
+  end_position:
+    bytes: 47
+    line: 7
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 47
+    line: 7
+    character: 10
+  end_position:
+    bytes: 48
+    line: 7
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 48
+    line: 7
+    character: 11
+  end_position:
+    bytes: 49
+    line: 7
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 49
+    line: 7
+    character: 12
+  end_position:
+    bytes: 50
+    line: 7
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 50
+    line: 8
+    character: 1
+  end_position:
+    bytes: 51
+    line: 8
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 51
+    line: 8
+    character: 2
+  end_position:
+    bytes: 52
+    line: 8
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 52
+    line: 8
+    character: 3
+  end_position:
+    bytes: 53
+    line: 8
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 53
+    line: 8
+    character: 4
+  end_position:
+    bytes: 54
+    line: 8
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 54
+    line: 8
+    character: 5
+  end_position:
+    bytes: 55
+    line: 8
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 55
+    line: 8
+    character: 6
+  end_position:
+    bytes: 56
+    line: 8
+    character: 7
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 56
+    line: 8
+    character: 7
+  end_position:
+    bytes: 57
+    line: 8
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 57
+    line: 8
+    character: 8
+  end_position:
+    bytes: 58
+    line: 8
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 58
+    line: 9
+    character: 1
+  end_position:
+    bytes: 59
+    line: 9
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 59
+    line: 9
+    character: 2
+  end_position:
+    bytes: 60
+    line: 9
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 60
+    line: 9
+    character: 3
+  end_position:
+    bytes: 61
+    line: 9
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 61
+    line: 9
+    character: 4
+  end_position:
+    bytes: 62
+    line: 9
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 62
+    line: 9
+    character: 5
+  end_position:
+    bytes: 63
+    line: 9
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 63
+    line: 9
+    character: 6
+  end_position:
+    bytes: 64
+    line: 9
+    character: 7
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 64
+    line: 9
+    character: 7
+  end_position:
+    bytes: 65
+    line: 9
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 65
+    line: 9
+    character: 8
+  end_position:
+    bytes: 66
+    line: 9
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 66
+    line: 10
+    character: 1
+  end_position:
+    bytes: 67
+    line: 10
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 67
+    line: 10
+    character: 2
+  end_position:
+    bytes: 68
+    line: 10
+    character: 3
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 68
+    line: 10
+    character: 3
+  end_position:
+    bytes: 69
+    line: 10
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 69
+    line: 10
+    character: 4
+  end_position:
+    bytes: 70
+    line: 10
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 70
+    line: 10
+    character: 5
+  end_position:
+    bytes: 71
+    line: 10
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 71
+    line: 10
+    character: 6
+  end_position:
+    bytes: 72
+    line: 10
+    character: 7
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 72
+    line: 10
+    character: 7
+  end_position:
+    bytes: 73
+    line: 10
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 73
+    line: 10
+    character: 8
+  end_position:
+    bytes: 74
+    line: 10
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 74
+    line: 11
+    character: 1
+  end_position:
+    bytes: 75
+    line: 11
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 75
+    line: 11
+    character: 2
+  end_position:
+    bytes: 75
+    line: 11
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/ast.snap
new file mode 100644
index 00000000..2a0f13bf
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/ast.snap
@@ -0,0 +1,312 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/table-constructor-4
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          end_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 11
+                              line: 1
+                              character: 12
+                            end_position:
+                              bytes: 12
+                              line: 1
+                              character: 12
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 27
+                            line: 3
+                            character: 1
+                          end_position:
+                            bytes: 28
+                            line: 3
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs:
+                      - Punctuated:
+                          - ExpressionKey:
+                              brackets:
+                                tokens:
+                                  - leading_trivia:
+                                      - start_position:
+                                          bytes: 12
+                                          line: 2
+                                          character: 1
+                                        end_position:
+                                          bytes: 13
+                                          line: 2
+                                          character: 2
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\t"
+                                    token:
+                                      start_position:
+                                        bytes: 13
+                                        line: 2
+                                        character: 2
+                                      end_position:
+                                        bytes: 14
+                                        line: 2
+                                        character: 3
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "["
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 20
+                                        line: 2
+                                        character: 9
+                                      end_position:
+                                        bytes: 21
+                                        line: 2
+                                        character: 10
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "]"
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 21
+                                          line: 2
+                                          character: 10
+                                        end_position:
+                                          bytes: 22
+                                          line: 2
+                                          character: 11
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                              key:
+                                FunctionCall:
+                                  prefix:
+                                    Name:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 14
+                                          line: 2
+                                          character: 3
+                                        end_position:
+                                          bytes: 18
+                                          line: 2
+                                          character: 7
+                                        token_type:
+                                          type: Identifier
+                                          identifier: call
+                                      trailing_trivia: []
+                                  suffixes:
+                                    - Call:
+                                        AnonymousCall:
+                                          Parentheses:
+                                            parentheses:
+                                              tokens:
+                                                - leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 18
+                                                      line: 2
+                                                      character: 7
+                                                    end_position:
+                                                      bytes: 19
+                                                      line: 2
+                                                      character: 8
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: (
+                                                  trailing_trivia: []
+                                                - leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 19
+                                                      line: 2
+                                                      character: 8
+                                                    end_position:
+                                                      bytes: 20
+                                                      line: 2
+                                                      character: 9
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: )
+                                                  trailing_trivia: []
+                                            arguments:
+                                              pairs: []
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 22
+                                    line: 2
+                                    character: 11
+                                  end_position:
+                                    bytes: 23
+                                    line: 2
+                                    character: 12
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 23
+                                      line: 2
+                                      character: 12
+                                    end_position:
+                                      bytes: 24
+                                      line: 2
+                                      character: 13
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Number:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 24
+                                      line: 2
+                                      character: 13
+                                    end_position:
+                                      bytes: 25
+                                      line: 2
+                                      character: 14
+                                    token_type:
+                                      type: Number
+                                      text: "1"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 25
+                                line: 2
+                                character: 14
+                              end_position:
+                                bytes: 26
+                                line: 2
+                                character: 15
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 26
+                                  line: 2
+                                  character: 15
+                                end_position:
+                                  bytes: 27
+                                  line: 2
+                                  character: 15
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/source.lua
new file mode 100644
index 00000000..5870b430
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/source.lua
@@ -0,0 +1,3 @@
+local x = {
+	[call()] = 1,
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/tokens.snap
new file mode 100644
index 00000000..4e46a8ac
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-4/tokens.snap
@@ -0,0 +1,248 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/table-constructor-4
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 13
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 2
+  end_position:
+    bytes: 14
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 14
+    line: 2
+    character: 3
+  end_position:
+    bytes: 18
+    line: 2
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 18
+    line: 2
+    character: 7
+  end_position:
+    bytes: 19
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 2
+    character: 8
+  end_position:
+    bytes: 20
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 20
+    line: 2
+    character: 9
+  end_position:
+    bytes: 21
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 21
+    line: 2
+    character: 10
+  end_position:
+    bytes: 22
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 11
+  end_position:
+    bytes: 23
+    line: 2
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 23
+    line: 2
+    character: 12
+  end_position:
+    bytes: 24
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 2
+    character: 13
+  end_position:
+    bytes: 25
+    line: 2
+    character: 14
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 25
+    line: 2
+    character: 14
+  end_position:
+    bytes: 26
+    line: 2
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 26
+    line: 2
+    character: 15
+  end_position:
+    bytes: 27
+    line: 2
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 27
+    line: 3
+    character: 1
+  end_position:
+    bytes: 28
+    line: 3
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 28
+    line: 3
+    character: 2
+  end_position:
+    bytes: 28
+    line: 3
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/ast.snap
new file mode 100644
index 00000000..7f0856df
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/ast.snap
@@ -0,0 +1,365 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/table-constructor-5
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 10
+                            line: 1
+                            character: 11
+                          end_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 11
+                              line: 1
+                              character: 12
+                            end_position:
+                              bytes: 12
+                              line: 1
+                              character: 12
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 31
+                            line: 4
+                            character: 1
+                          end_position:
+                            bytes: 32
+                            line: 4
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs:
+                      - Punctuated:
+                          - ExpressionKey:
+                              brackets:
+                                tokens:
+                                  - leading_trivia:
+                                      - start_position:
+                                          bytes: 12
+                                          line: 2
+                                          character: 1
+                                        end_position:
+                                          bytes: 13
+                                          line: 2
+                                          character: 2
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\t"
+                                    token:
+                                      start_position:
+                                        bytes: 13
+                                        line: 2
+                                        character: 2
+                                      end_position:
+                                        bytes: 14
+                                        line: 2
+                                        character: 3
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "["
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 20
+                                        line: 2
+                                        character: 9
+                                      end_position:
+                                        bytes: 21
+                                        line: 2
+                                        character: 10
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "]"
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 21
+                                          line: 2
+                                          character: 10
+                                        end_position:
+                                          bytes: 22
+                                          line: 2
+                                          character: 11
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                              key:
+                                FunctionCall:
+                                  prefix:
+                                    Name:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 14
+                                          line: 2
+                                          character: 3
+                                        end_position:
+                                          bytes: 18
+                                          line: 2
+                                          character: 7
+                                        token_type:
+                                          type: Identifier
+                                          identifier: call
+                                      trailing_trivia: []
+                                  suffixes:
+                                    - Call:
+                                        AnonymousCall:
+                                          Parentheses:
+                                            parentheses:
+                                              tokens:
+                                                - leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 18
+                                                      line: 2
+                                                      character: 7
+                                                    end_position:
+                                                      bytes: 19
+                                                      line: 2
+                                                      character: 8
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: (
+                                                  trailing_trivia: []
+                                                - leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 19
+                                                      line: 2
+                                                      character: 8
+                                                    end_position:
+                                                      bytes: 20
+                                                      line: 2
+                                                      character: 9
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: )
+                                                  trailing_trivia: []
+                                            arguments:
+                                              pairs: []
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 22
+                                    line: 2
+                                    character: 11
+                                  end_position:
+                                    bytes: 23
+                                    line: 2
+                                    character: 12
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 23
+                                      line: 2
+                                      character: 12
+                                    end_position:
+                                      bytes: 24
+                                      line: 2
+                                      character: 13
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Number:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 24
+                                      line: 2
+                                      character: 13
+                                    end_position:
+                                      bytes: 25
+                                      line: 2
+                                      character: 14
+                                    token_type:
+                                      type: Number
+                                      text: "1"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 25
+                                line: 2
+                                character: 14
+                              end_position:
+                                bytes: 26
+                                line: 2
+                                character: 15
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 26
+                                  line: 2
+                                  character: 15
+                                end_position:
+                                  bytes: 27
+                                  line: 2
+                                  character: 15
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                      - Punctuated:
+                          - NoKey:
+                              Number:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 27
+                                      line: 3
+                                      character: 1
+                                    end_position:
+                                      bytes: 28
+                                      line: 3
+                                      character: 2
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\t"
+                                token:
+                                  start_position:
+                                    bytes: 28
+                                    line: 3
+                                    character: 2
+                                  end_position:
+                                    bytes: 29
+                                    line: 3
+                                    character: 3
+                                  token_type:
+                                    type: Number
+                                    text: "2"
+                                trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 29
+                                line: 3
+                                character: 3
+                              end_position:
+                                bytes: 30
+                                line: 3
+                                character: 4
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 30
+                                  line: 3
+                                  character: 4
+                                end_position:
+                                  bytes: 31
+                                  line: 3
+                                  character: 4
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/source.lua
new file mode 100644
index 00000000..afeca1f3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/source.lua
@@ -0,0 +1,4 @@
+local x = {
+	[call()] = 1,
+	2,
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/tokens.snap
new file mode 100644
index 00000000..9afbf2ab
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-5/tokens.snap
@@ -0,0 +1,292 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/table-constructor-5
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 13
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 2
+  end_position:
+    bytes: 14
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 14
+    line: 2
+    character: 3
+  end_position:
+    bytes: 18
+    line: 2
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 18
+    line: 2
+    character: 7
+  end_position:
+    bytes: 19
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 19
+    line: 2
+    character: 8
+  end_position:
+    bytes: 20
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 20
+    line: 2
+    character: 9
+  end_position:
+    bytes: 21
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 21
+    line: 2
+    character: 10
+  end_position:
+    bytes: 22
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 11
+  end_position:
+    bytes: 23
+    line: 2
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 23
+    line: 2
+    character: 12
+  end_position:
+    bytes: 24
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 2
+    character: 13
+  end_position:
+    bytes: 25
+    line: 2
+    character: 14
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 25
+    line: 2
+    character: 14
+  end_position:
+    bytes: 26
+    line: 2
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 26
+    line: 2
+    character: 15
+  end_position:
+    bytes: 27
+    line: 2
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 27
+    line: 3
+    character: 1
+  end_position:
+    bytes: 28
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 28
+    line: 3
+    character: 2
+  end_position:
+    bytes: 29
+    line: 3
+    character: 3
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 29
+    line: 3
+    character: 3
+  end_position:
+    bytes: 30
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 30
+    line: 3
+    character: 4
+  end_position:
+    bytes: 31
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 31
+    line: 4
+    character: 1
+  end_position:
+    bytes: 32
+    line: 4
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 32
+    line: 4
+    character: 2
+  end_position:
+    bytes: 32
+    line: 4
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/ast.snap
new file mode 100644
index 00000000..88671507
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/ast.snap
@@ -0,0 +1,166 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/table-constructor-6
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: foo
+                trailing_trivia:
+                  - start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 10
+              line: 1
+              character: 11
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 12
+                            line: 1
+                            character: 13
+                          end_position:
+                            bytes: 13
+                            line: 1
+                            character: 14
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 13
+                              line: 1
+                              character: 14
+                            end_position:
+                              bytes: 14
+                              line: 1
+                              character: 15
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 18
+                            line: 1
+                            character: 19
+                          end_position:
+                            bytes: 19
+                            line: 1
+                            character: 20
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs:
+                      - End:
+                          NoKey:
+                            Var:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 14
+                                    line: 1
+                                    character: 15
+                                  end_position:
+                                    bytes: 17
+                                    line: 1
+                                    character: 18
+                                  token_type:
+                                    type: Identifier
+                                    identifier: bar
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 17
+                                      line: 1
+                                      character: 18
+                                    end_position:
+                                      bytes: 18
+                                      line: 1
+                                      character: 19
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/source.lua
new file mode 100644
index 00000000..c5bde7d5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/source.lua
@@ -0,0 +1 @@
+local foo = { bar }
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/tokens.snap
new file mode 100644
index 00000000..e3466688
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructor-6/tokens.snap
@@ -0,0 +1,138 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/table-constructor-6
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/ast.snap
new file mode 100644
index 00000000..37b8b508
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/ast.snap
@@ -0,0 +1,551 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/table-constructors-7
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 15
+                    line: 1
+                    character: 16
+                  token_type:
+                    type: Identifier
+                    identifier: blacklist
+                trailing_trivia:
+                  - start_position:
+                      bytes: 15
+                      line: 1
+                      character: 16
+                    end_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 16
+              line: 1
+              character: 17
+            end_position:
+              bytes: 17
+              line: 1
+              character: 18
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 17
+                line: 1
+                character: 18
+              end_position:
+                bytes: 18
+                line: 1
+                character: 19
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TableConstructor:
+                  braces:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 18
+                            line: 1
+                            character: 19
+                          end_position:
+                            bytes: 19
+                            line: 1
+                            character: 20
+                          token_type:
+                            type: Symbol
+                            symbol: "{"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 19
+                              line: 1
+                              character: 20
+                            end_position:
+                              bytes: 20
+                              line: 1
+                              character: 20
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 215
+                            line: 5
+                            character: 1
+                          end_position:
+                            bytes: 216
+                            line: 5
+                            character: 2
+                          token_type:
+                            type: Symbol
+                            symbol: "}"
+                        trailing_trivia: []
+                  fields:
+                    pairs:
+                      - Punctuated:
+                          - ExpressionKey:
+                              brackets:
+                                tokens:
+                                  - leading_trivia:
+                                      - start_position:
+                                          bytes: 20
+                                          line: 2
+                                          character: 1
+                                        end_position:
+                                          bytes: 21
+                                          line: 2
+                                          character: 2
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\t"
+                                    token:
+                                      start_position:
+                                        bytes: 21
+                                        line: 2
+                                        character: 2
+                                      end_position:
+                                        bytes: 22
+                                        line: 2
+                                        character: 3
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "["
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 55
+                                        line: 2
+                                        character: 36
+                                      end_position:
+                                        bytes: 56
+                                        line: 2
+                                        character: 37
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "]"
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 56
+                                          line: 2
+                                          character: 37
+                                        end_position:
+                                          bytes: 57
+                                          line: 2
+                                          character: 38
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                              key:
+                                String:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 22
+                                      line: 2
+                                      character: 3
+                                    end_position:
+                                      bytes: 55
+                                      line: 2
+                                      character: 36
+                                    token_type:
+                                      type: StringLiteral
+                                      literal: Audio file failed to load (18).
+                                      quote_type: Double
+                                  trailing_trivia: []
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 57
+                                    line: 2
+                                    character: 38
+                                  end_position:
+                                    bytes: 58
+                                    line: 2
+                                    character: 39
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 58
+                                      line: 2
+                                      character: 39
+                                    end_position:
+                                      bytes: 59
+                                      line: 2
+                                      character: 40
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Symbol:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 59
+                                      line: 2
+                                      character: 40
+                                    end_position:
+                                      bytes: 63
+                                      line: 2
+                                      character: 44
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "true"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 63
+                                line: 2
+                                character: 44
+                              end_position:
+                                bytes: 64
+                                line: 2
+                                character: 45
+                              token_type:
+                                type: Symbol
+                                symbol: ;
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 64
+                                  line: 2
+                                  character: 45
+                                end_position:
+                                  bytes: 65
+                                  line: 2
+                                  character: 45
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                      - Punctuated:
+                          - ExpressionKey:
+                              brackets:
+                                tokens:
+                                  - leading_trivia:
+                                      - start_position:
+                                          bytes: 65
+                                          line: 3
+                                          character: 1
+                                        end_position:
+                                          bytes: 66
+                                          line: 3
+                                          character: 2
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\t"
+                                    token:
+                                      start_position:
+                                        bytes: 66
+                                        line: 3
+                                        character: 2
+                                      end_position:
+                                        bytes: 67
+                                        line: 3
+                                        character: 3
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "["
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 131
+                                        line: 3
+                                        character: 67
+                                      end_position:
+                                        bytes: 132
+                                        line: 3
+                                        character: 68
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "]"
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 132
+                                          line: 3
+                                          character: 68
+                                        end_position:
+                                          bytes: 133
+                                          line: 3
+                                          character: 69
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                              key:
+                                String:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 67
+                                      line: 3
+                                      character: 3
+                                    end_position:
+                                      bytes: 131
+                                      line: 3
+                                      character: 67
+                                    token_type:
+                                      type: StringLiteral
+                                      literal: HTTP 0 (HTTP 429 (HTTP/1.1 429 ProvisionedThroughputExceeded))
+                                      quote_type: Double
+                                  trailing_trivia: []
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 133
+                                    line: 3
+                                    character: 69
+                                  end_position:
+                                    bytes: 134
+                                    line: 3
+                                    character: 70
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 134
+                                      line: 3
+                                      character: 70
+                                    end_position:
+                                      bytes: 135
+                                      line: 3
+                                      character: 71
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Symbol:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 135
+                                      line: 3
+                                      character: 71
+                                    end_position:
+                                      bytes: 139
+                                      line: 3
+                                      character: 75
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "true"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 139
+                                line: 3
+                                character: 75
+                              end_position:
+                                bytes: 140
+                                line: 3
+                                character: 76
+                              token_type:
+                                type: Symbol
+                                symbol: ;
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 140
+                                  line: 3
+                                  character: 76
+                                end_position:
+                                  bytes: 141
+                                  line: 3
+                                  character: 76
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                      - Punctuated:
+                          - ExpressionKey:
+                              brackets:
+                                tokens:
+                                  - leading_trivia:
+                                      - start_position:
+                                          bytes: 141
+                                          line: 4
+                                          character: 1
+                                        end_position:
+                                          bytes: 142
+                                          line: 4
+                                          character: 2
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\t"
+                                    token:
+                                      start_position:
+                                        bytes: 142
+                                        line: 4
+                                        character: 2
+                                      end_position:
+                                        bytes: 143
+                                        line: 4
+                                        character: 3
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "["
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 205
+                                        line: 4
+                                        character: 65
+                                      end_position:
+                                        bytes: 206
+                                        line: 4
+                                        character: 66
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "]"
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 206
+                                          line: 4
+                                          character: 66
+                                        end_position:
+                                          bytes: 207
+                                          line: 4
+                                          character: 67
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                              key:
+                                String:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 143
+                                      line: 4
+                                      character: 3
+                                    end_position:
+                                      bytes: 205
+                                      line: 4
+                                      character: 65
+                                    token_type:
+                                      type: StringLiteral
+                                      literal: LoadCharacter can only be called when Player is in the world
+                                      quote_type: Double
+                                  trailing_trivia: []
+                              equal:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 207
+                                    line: 4
+                                    character: 67
+                                  end_position:
+                                    bytes: 208
+                                    line: 4
+                                    character: 68
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "="
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 208
+                                      line: 4
+                                      character: 68
+                                    end_position:
+                                      bytes: 209
+                                      line: 4
+                                      character: 69
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              value:
+                                Symbol:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 209
+                                      line: 4
+                                      character: 69
+                                    end_position:
+                                      bytes: 213
+                                      line: 4
+                                      character: 73
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "true"
+                                  trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 213
+                                line: 4
+                                character: 73
+                              end_position:
+                                bytes: 214
+                                line: 4
+                                character: 74
+                              token_type:
+                                type: Symbol
+                                symbol: ;
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 214
+                                  line: 4
+                                  character: 74
+                                end_position:
+                                  bytes: 215
+                                  line: 4
+                                  character: 74
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/source.lua
new file mode 100644
index 00000000..5688c7fc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/source.lua
@@ -0,0 +1,5 @@
+local blacklist = {
+	["Audio file failed to load (18)."] = true;
+	["HTTP 0 (HTTP 429 (HTTP/1.1 429 ProvisionedThroughputExceeded))"] = true;
+	["LoadCharacter can only be called when Player is in the world"] = true;
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/tokens.snap
new file mode 100644
index 00000000..fb2a7b02
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-7/tokens.snap
@@ -0,0 +1,449 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/table-constructors-7
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: blacklist
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 20
+    line: 2
+    character: 1
+  end_position:
+    bytes: 21
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 21
+    line: 2
+    character: 2
+  end_position:
+    bytes: 22
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 22
+    line: 2
+    character: 3
+  end_position:
+    bytes: 55
+    line: 2
+    character: 36
+  token_type:
+    type: StringLiteral
+    literal: Audio file failed to load (18).
+    quote_type: Double
+- start_position:
+    bytes: 55
+    line: 2
+    character: 36
+  end_position:
+    bytes: 56
+    line: 2
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 56
+    line: 2
+    character: 37
+  end_position:
+    bytes: 57
+    line: 2
+    character: 38
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 57
+    line: 2
+    character: 38
+  end_position:
+    bytes: 58
+    line: 2
+    character: 39
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 58
+    line: 2
+    character: 39
+  end_position:
+    bytes: 59
+    line: 2
+    character: 40
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 59
+    line: 2
+    character: 40
+  end_position:
+    bytes: 63
+    line: 2
+    character: 44
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 63
+    line: 2
+    character: 44
+  end_position:
+    bytes: 64
+    line: 2
+    character: 45
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 64
+    line: 2
+    character: 45
+  end_position:
+    bytes: 65
+    line: 2
+    character: 45
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 65
+    line: 3
+    character: 1
+  end_position:
+    bytes: 66
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 66
+    line: 3
+    character: 2
+  end_position:
+    bytes: 67
+    line: 3
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 67
+    line: 3
+    character: 3
+  end_position:
+    bytes: 131
+    line: 3
+    character: 67
+  token_type:
+    type: StringLiteral
+    literal: HTTP 0 (HTTP 429 (HTTP/1.1 429 ProvisionedThroughputExceeded))
+    quote_type: Double
+- start_position:
+    bytes: 131
+    line: 3
+    character: 67
+  end_position:
+    bytes: 132
+    line: 3
+    character: 68
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 132
+    line: 3
+    character: 68
+  end_position:
+    bytes: 133
+    line: 3
+    character: 69
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 133
+    line: 3
+    character: 69
+  end_position:
+    bytes: 134
+    line: 3
+    character: 70
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 134
+    line: 3
+    character: 70
+  end_position:
+    bytes: 135
+    line: 3
+    character: 71
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 135
+    line: 3
+    character: 71
+  end_position:
+    bytes: 139
+    line: 3
+    character: 75
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 139
+    line: 3
+    character: 75
+  end_position:
+    bytes: 140
+    line: 3
+    character: 76
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 140
+    line: 3
+    character: 76
+  end_position:
+    bytes: 141
+    line: 3
+    character: 76
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 141
+    line: 4
+    character: 1
+  end_position:
+    bytes: 142
+    line: 4
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 142
+    line: 4
+    character: 2
+  end_position:
+    bytes: 143
+    line: 4
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 143
+    line: 4
+    character: 3
+  end_position:
+    bytes: 205
+    line: 4
+    character: 65
+  token_type:
+    type: StringLiteral
+    literal: LoadCharacter can only be called when Player is in the world
+    quote_type: Double
+- start_position:
+    bytes: 205
+    line: 4
+    character: 65
+  end_position:
+    bytes: 206
+    line: 4
+    character: 66
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 206
+    line: 4
+    character: 66
+  end_position:
+    bytes: 207
+    line: 4
+    character: 67
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 207
+    line: 4
+    character: 67
+  end_position:
+    bytes: 208
+    line: 4
+    character: 68
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 208
+    line: 4
+    character: 68
+  end_position:
+    bytes: 209
+    line: 4
+    character: 69
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 209
+    line: 4
+    character: 69
+  end_position:
+    bytes: 213
+    line: 4
+    character: 73
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 213
+    line: 4
+    character: 73
+  end_position:
+    bytes: 214
+    line: 4
+    character: 74
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 214
+    line: 4
+    character: 74
+  end_position:
+    bytes: 215
+    line: 4
+    character: 74
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 215
+    line: 5
+    character: 1
+  end_position:
+    bytes: 216
+    line: 5
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 216
+    line: 5
+    character: 2
+  end_position:
+    bytes: 216
+    line: 5
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/ast.snap
new file mode 100644
index 00000000..3cdcdf5c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/ast.snap
@@ -0,0 +1,373 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/table-constructors-8
+---
+stmts: []
+last_stmt:
+  - Return:
+      token:
+        leading_trivia: []
+        token:
+          start_position:
+            bytes: 0
+            line: 1
+            character: 1
+          end_position:
+            bytes: 6
+            line: 1
+            character: 7
+          token_type:
+            type: Symbol
+            symbol: return
+        trailing_trivia:
+          - start_position:
+              bytes: 6
+              line: 1
+              character: 7
+            end_position:
+              bytes: 7
+              line: 1
+              character: 8
+            token_type:
+              type: Whitespace
+              characters: " "
+      returns:
+        pairs:
+          - End:
+              TableConstructor:
+                braces:
+                  tokens:
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 7
+                          line: 1
+                          character: 8
+                        end_position:
+                          bytes: 8
+                          line: 1
+                          character: 9
+                        token_type:
+                          type: Symbol
+                          symbol: "{"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 8
+                            line: 1
+                            character: 9
+                          end_position:
+                            bytes: 9
+                            line: 1
+                            character: 9
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 129
+                          line: 4
+                          character: 1
+                        end_position:
+                          bytes: 130
+                          line: 4
+                          character: 2
+                        token_type:
+                          type: Symbol
+                          symbol: "}"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 130
+                            line: 4
+                            character: 2
+                          end_position:
+                            bytes: 131
+                            line: 4
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                fields:
+                  pairs:
+                    - Punctuated:
+                        - ExpressionKey:
+                            brackets:
+                              tokens:
+                                - leading_trivia:
+                                    - start_position:
+                                        bytes: 9
+                                        line: 2
+                                        character: 1
+                                      end_position:
+                                        bytes: 10
+                                        line: 2
+                                        character: 2
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\t"
+                                  token:
+                                    start_position:
+                                      bytes: 10
+                                      line: 2
+                                      character: 2
+                                    end_position:
+                                      bytes: 11
+                                      line: 2
+                                      character: 3
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "["
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 36
+                                      line: 2
+                                      character: 28
+                                    end_position:
+                                      bytes: 37
+                                      line: 2
+                                      character: 29
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "]"
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 37
+                                        line: 2
+                                        character: 29
+                                      end_position:
+                                        bytes: 38
+                                        line: 2
+                                        character: 30
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                            key:
+                              String:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 11
+                                    line: 2
+                                    character: 3
+                                  end_position:
+                                    bytes: 36
+                                    line: 2
+                                    character: 28
+                                  token_type:
+                                    type: StringLiteral
+                                    literal: "Noob Attack: Periastron"
+                                    quote_type: Double
+                                trailing_trivia: []
+                            equal:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 38
+                                  line: 2
+                                  character: 30
+                                end_position:
+                                  bytes: 39
+                                  line: 2
+                                  character: 31
+                                token_type:
+                                  type: Symbol
+                                  symbol: "="
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 39
+                                    line: 2
+                                    character: 31
+                                  end_position:
+                                    bytes: 40
+                                    line: 2
+                                    character: 32
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            value:
+                              String:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 40
+                                    line: 2
+                                    character: 32
+                                  end_position:
+                                    bytes: 66
+                                    line: 2
+                                    character: 58
+                                  token_type:
+                                    type: StringLiteral
+                                    literal: Noob Attack - Periastron
+                                    quote_type: Double
+                                trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 66
+                              line: 2
+                              character: 58
+                            end_position:
+                              bytes: 67
+                              line: 2
+                              character: 59
+                            token_type:
+                              type: Symbol
+                              symbol: ;
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 67
+                                line: 2
+                                character: 59
+                              end_position:
+                                bytes: 68
+                                line: 2
+                                character: 59
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    - Punctuated:
+                        - ExpressionKey:
+                            brackets:
+                              tokens:
+                                - leading_trivia:
+                                    - start_position:
+                                        bytes: 68
+                                        line: 3
+                                        character: 1
+                                      end_position:
+                                        bytes: 69
+                                        line: 3
+                                        character: 2
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\t"
+                                  token:
+                                    start_position:
+                                      bytes: 69
+                                      line: 3
+                                      character: 2
+                                    end_position:
+                                      bytes: 70
+                                      line: 3
+                                      character: 3
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "["
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 97
+                                      line: 3
+                                      character: 28
+                                    end_position:
+                                      bytes: 98
+                                      line: 3
+                                      character: 29
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "]"
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 98
+                                        line: 3
+                                        character: 29
+                                      end_position:
+                                        bytes: 99
+                                        line: 3
+                                        character: 30
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                            key:
+                              String:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 70
+                                    line: 3
+                                    character: 3
+                                  end_position:
+                                    bytes: 97
+                                    line: 3
+                                    character: 28
+                                  token_type:
+                                    type: StringLiteral
+                                    literal: Noob Attack꞉ Periastron
+                                    quote_type: Double
+                                trailing_trivia: []
+                            equal:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 99
+                                  line: 3
+                                  character: 30
+                                end_position:
+                                  bytes: 100
+                                  line: 3
+                                  character: 31
+                                token_type:
+                                  type: Symbol
+                                  symbol: "="
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 100
+                                    line: 3
+                                    character: 31
+                                  end_position:
+                                    bytes: 101
+                                    line: 3
+                                    character: 32
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            value:
+                              String:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 101
+                                    line: 3
+                                    character: 32
+                                  end_position:
+                                    bytes: 127
+                                    line: 3
+                                    character: 58
+                                  token_type:
+                                    type: StringLiteral
+                                    literal: Noob Attack - Periastron
+                                    quote_type: Double
+                                trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 127
+                              line: 3
+                              character: 58
+                            end_position:
+                              bytes: 128
+                              line: 3
+                              character: 59
+                            token_type:
+                              type: Symbol
+                              symbol: ;
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 128
+                                line: 3
+                                character: 59
+                              end_position:
+                                bytes: 129
+                                line: 3
+                                character: 59
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+  - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/source.lua
new file mode 100644
index 00000000..ed28eaa4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/source.lua
@@ -0,0 +1,4 @@
+return {
+	["Noob Attack: Periastron"] = "Noob Attack - Periastron";
+	["Noob Attack꞉ Periastron"] = "Noob Attack - Periastron";
+}
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/tokens.snap
new file mode 100644
index 00000000..d6eda340
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/table-constructors-8/tokens.snap
@@ -0,0 +1,307 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/table-constructors-8
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 10
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 2
+  end_position:
+    bytes: 11
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 11
+    line: 2
+    character: 3
+  end_position:
+    bytes: 36
+    line: 2
+    character: 28
+  token_type:
+    type: StringLiteral
+    literal: "Noob Attack: Periastron"
+    quote_type: Double
+- start_position:
+    bytes: 36
+    line: 2
+    character: 28
+  end_position:
+    bytes: 37
+    line: 2
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 37
+    line: 2
+    character: 29
+  end_position:
+    bytes: 38
+    line: 2
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 38
+    line: 2
+    character: 30
+  end_position:
+    bytes: 39
+    line: 2
+    character: 31
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 39
+    line: 2
+    character: 31
+  end_position:
+    bytes: 40
+    line: 2
+    character: 32
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 40
+    line: 2
+    character: 32
+  end_position:
+    bytes: 66
+    line: 2
+    character: 58
+  token_type:
+    type: StringLiteral
+    literal: Noob Attack - Periastron
+    quote_type: Double
+- start_position:
+    bytes: 66
+    line: 2
+    character: 58
+  end_position:
+    bytes: 67
+    line: 2
+    character: 59
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 67
+    line: 2
+    character: 59
+  end_position:
+    bytes: 68
+    line: 2
+    character: 59
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 68
+    line: 3
+    character: 1
+  end_position:
+    bytes: 69
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 69
+    line: 3
+    character: 2
+  end_position:
+    bytes: 70
+    line: 3
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 70
+    line: 3
+    character: 3
+  end_position:
+    bytes: 97
+    line: 3
+    character: 28
+  token_type:
+    type: StringLiteral
+    literal: Noob Attack꞉ Periastron
+    quote_type: Double
+- start_position:
+    bytes: 97
+    line: 3
+    character: 28
+  end_position:
+    bytes: 98
+    line: 3
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 98
+    line: 3
+    character: 29
+  end_position:
+    bytes: 99
+    line: 3
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 99
+    line: 3
+    character: 30
+  end_position:
+    bytes: 100
+    line: 3
+    character: 31
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 100
+    line: 3
+    character: 31
+  end_position:
+    bytes: 101
+    line: 3
+    character: 32
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 101
+    line: 3
+    character: 32
+  end_position:
+    bytes: 127
+    line: 3
+    character: 58
+  token_type:
+    type: StringLiteral
+    literal: Noob Attack - Periastron
+    quote_type: Double
+- start_position:
+    bytes: 127
+    line: 3
+    character: 58
+  end_position:
+    bytes: 128
+    line: 3
+    character: 59
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 128
+    line: 3
+    character: 59
+  end_position:
+    bytes: 129
+    line: 3
+    character: 59
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 129
+    line: 4
+    character: 1
+  end_position:
+    bytes: 130
+    line: 4
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 130
+    line: 4
+    character: 2
+  end_position:
+    bytes: 131
+    line: 4
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 131
+    line: 5
+    character: 1
+  end_position:
+    bytes: 131
+    line: 5
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/ast.snap
new file mode 100644
index 00000000..7164014c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/ast.snap
@@ -0,0 +1,734 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/trivia-parsing
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: foo
+                trailing_trivia:
+                  - start_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 10
+              line: 1
+              character: 11
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      end_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      token_type:
+                        type: Identifier
+                        identifier: bar
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 15
+                          line: 1
+                          character: 16
+                        end_position:
+                          bytes: 16
+                          line: 1
+                          character: 17
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                      - start_position:
+                          bytes: 16
+                          line: 1
+                          character: 17
+                        end_position:
+                          bytes: 35
+                          line: 1
+                          character: 36
+                        token_type:
+                          type: SingleLineComment
+                          comment: " trailing comment"
+                      - start_position:
+                          bytes: 35
+                          line: 1
+                          character: 36
+                        end_position:
+                          bytes: 36
+                          line: 1
+                          character: 36
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 36
+                line: 2
+                character: 1
+              end_position:
+                bytes: 37
+                line: 2
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+            - start_position:
+                bytes: 37
+                line: 3
+                character: 1
+              end_position:
+                bytes: 55
+                line: 3
+                character: 19
+              token_type:
+                type: SingleLineComment
+                comment: " leading comment"
+            - start_position:
+                bytes: 55
+                line: 3
+                character: 19
+              end_position:
+                bytes: 56
+                line: 3
+                character: 19
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 56
+              line: 4
+              character: 1
+            end_position:
+              bytes: 61
+              line: 4
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 61
+                line: 4
+                character: 6
+              end_position:
+                bytes: 62
+                line: 4
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 62
+                    line: 4
+                    character: 7
+                  end_position:
+                    bytes: 65
+                    line: 4
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: bar
+                trailing_trivia:
+                  - start_position:
+                      bytes: 65
+                      line: 4
+                      character: 10
+                    end_position:
+                      bytes: 66
+                      line: 4
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 66
+              line: 4
+              character: 11
+            end_position:
+              bytes: 67
+              line: 4
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 67
+                line: 4
+                character: 12
+              end_position:
+                bytes: 68
+                line: 4
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 68
+                        line: 4
+                        character: 13
+                      end_position:
+                        bytes: 71
+                        line: 4
+                        character: 16
+                      token_type:
+                        type: Identifier
+                        identifier: baz
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 71
+                          line: 4
+                          character: 16
+                        end_position:
+                          bytes: 72
+                          line: 4
+                          character: 16
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 72
+              line: 5
+              character: 1
+            end_position:
+              bytes: 77
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 77
+                line: 5
+                character: 6
+              end_position:
+                bytes: 78
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 78
+                    line: 5
+                    character: 7
+                  end_position:
+                    bytes: 81
+                    line: 5
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: baz
+                trailing_trivia:
+                  - start_position:
+                      bytes: 81
+                      line: 5
+                      character: 10
+                    end_position:
+                      bytes: 82
+                      line: 5
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 82
+              line: 5
+              character: 11
+            end_position:
+              bytes: 83
+              line: 5
+              character: 12
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 83
+                line: 5
+                character: 12
+              end_position:
+                bytes: 84
+                line: 5
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Var:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 84
+                        line: 5
+                        character: 13
+                      end_position:
+                        bytes: 87
+                        line: 5
+                        character: 16
+                      token_type:
+                        type: Identifier
+                        identifier: foo
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 87
+                          line: 5
+                          character: 16
+                        end_position:
+                          bytes: 88
+                          line: 5
+                          character: 16
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+    - ~
+  - - Do:
+        do_token:
+          leading_trivia:
+            - start_position:
+                bytes: 88
+                line: 6
+                character: 1
+              end_position:
+                bytes: 89
+                line: 6
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 89
+              line: 7
+              character: 1
+            end_position:
+              bytes: 91
+              line: 7
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 91
+                line: 7
+                character: 3
+              end_position:
+                bytes: 92
+                line: 7
+                character: 3
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - LocalAssignment:
+                  local_token:
+                    leading_trivia:
+                      - start_position:
+                          bytes: 92
+                          line: 8
+                          character: 1
+                        end_position:
+                          bytes: 93
+                          line: 8
+                          character: 2
+                        token_type:
+                          type: Whitespace
+                          characters: "\t"
+                    token:
+                      start_position:
+                        bytes: 93
+                        line: 8
+                        character: 2
+                      end_position:
+                        bytes: 98
+                        line: 8
+                        character: 7
+                      token_type:
+                        type: Symbol
+                        symbol: local
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 98
+                          line: 8
+                          character: 7
+                        end_position:
+                          bytes: 99
+                          line: 8
+                          character: 8
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  name_list:
+                    pairs:
+                      - End:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 99
+                              line: 8
+                              character: 8
+                            end_position:
+                              bytes: 102
+                              line: 8
+                              character: 11
+                            token_type:
+                              type: Identifier
+                              identifier: foo
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 102
+                                line: 8
+                                character: 11
+                              end_position:
+                                bytes: 103
+                                line: 8
+                                character: 12
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                  equal_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 103
+                        line: 8
+                        character: 12
+                      end_position:
+                        bytes: 104
+                        line: 8
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: "="
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 104
+                          line: 8
+                          character: 13
+                        end_position:
+                          bytes: 105
+                          line: 8
+                          character: 14
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  expr_list:
+                    pairs:
+                      - End:
+                          Var:
+                            Name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 105
+                                  line: 8
+                                  character: 14
+                                end_position:
+                                  bytes: 108
+                                  line: 8
+                                  character: 17
+                                token_type:
+                                  type: Identifier
+                                  identifier: bar
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 108
+                                    line: 8
+                                    character: 17
+                                  end_position:
+                                    bytes: 109
+                                    line: 8
+                                    character: 17
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+              - ~
+            - - LocalAssignment:
+                  local_token:
+                    leading_trivia:
+                      - start_position:
+                          bytes: 109
+                          line: 9
+                          character: 1
+                        end_position:
+                          bytes: 110
+                          line: 9
+                          character: 2
+                        token_type:
+                          type: Whitespace
+                          characters: "\t"
+                      - start_position:
+                          bytes: 110
+                          line: 9
+                          character: 2
+                        end_position:
+                          bytes: 120
+                          line: 9
+                          character: 12
+                        token_type:
+                          type: SingleLineComment
+                          comment: " comment"
+                      - start_position:
+                          bytes: 120
+                          line: 9
+                          character: 12
+                        end_position:
+                          bytes: 121
+                          line: 9
+                          character: 12
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+                      - start_position:
+                          bytes: 121
+                          line: 10
+                          character: 1
+                        end_position:
+                          bytes: 122
+                          line: 10
+                          character: 2
+                        token_type:
+                          type: Whitespace
+                          characters: "\t"
+                    token:
+                      start_position:
+                        bytes: 122
+                        line: 10
+                        character: 2
+                      end_position:
+                        bytes: 127
+                        line: 10
+                        character: 7
+                      token_type:
+                        type: Symbol
+                        symbol: local
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 127
+                          line: 10
+                          character: 7
+                        end_position:
+                          bytes: 128
+                          line: 10
+                          character: 8
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  name_list:
+                    pairs:
+                      - End:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 128
+                              line: 10
+                              character: 8
+                            end_position:
+                              bytes: 131
+                              line: 10
+                              character: 11
+                            token_type:
+                              type: Identifier
+                              identifier: bar
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 131
+                                line: 10
+                                character: 11
+                              end_position:
+                                bytes: 132
+                                line: 10
+                                character: 12
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                  equal_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 132
+                        line: 10
+                        character: 12
+                      end_position:
+                        bytes: 133
+                        line: 10
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: "="
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 133
+                          line: 10
+                          character: 13
+                        end_position:
+                          bytes: 134
+                          line: 10
+                          character: 14
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  expr_list:
+                    pairs:
+                      - End:
+                          Var:
+                            Name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 134
+                                  line: 10
+                                  character: 14
+                                end_position:
+                                  bytes: 137
+                                  line: 10
+                                  character: 17
+                                token_type:
+                                  type: Identifier
+                                  identifier: baz
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 137
+                                    line: 10
+                                    character: 17
+                                  end_position:
+                                    bytes: 138
+                                    line: 10
+                                    character: 17
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 138
+              line: 11
+              character: 1
+            end_position:
+              bytes: 141
+              line: 11
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/source.lua
new file mode 100644
index 00000000..702108cc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/source.lua
@@ -0,0 +1,11 @@
+local foo = bar -- trailing comment
+
+-- leading comment
+local bar = baz
+local baz = foo
+
+do
+	local foo = bar
+	-- comment
+	local bar = baz
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/tokens.snap
new file mode 100644
index 00000000..9d60f033
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/trivia-parsing/tokens.snap
@@ -0,0 +1,611 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/trivia-parsing
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 35
+    line: 1
+    character: 36
+  token_type:
+    type: SingleLineComment
+    comment: " trailing comment"
+- start_position:
+    bytes: 35
+    line: 1
+    character: 36
+  end_position:
+    bytes: 36
+    line: 1
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 36
+    line: 2
+    character: 1
+  end_position:
+    bytes: 37
+    line: 2
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 37
+    line: 3
+    character: 1
+  end_position:
+    bytes: 55
+    line: 3
+    character: 19
+  token_type:
+    type: SingleLineComment
+    comment: " leading comment"
+- start_position:
+    bytes: 55
+    line: 3
+    character: 19
+  end_position:
+    bytes: 56
+    line: 3
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 56
+    line: 4
+    character: 1
+  end_position:
+    bytes: 61
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 61
+    line: 4
+    character: 6
+  end_position:
+    bytes: 62
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 62
+    line: 4
+    character: 7
+  end_position:
+    bytes: 65
+    line: 4
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 65
+    line: 4
+    character: 10
+  end_position:
+    bytes: 66
+    line: 4
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 66
+    line: 4
+    character: 11
+  end_position:
+    bytes: 67
+    line: 4
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 67
+    line: 4
+    character: 12
+  end_position:
+    bytes: 68
+    line: 4
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 68
+    line: 4
+    character: 13
+  end_position:
+    bytes: 71
+    line: 4
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 71
+    line: 4
+    character: 16
+  end_position:
+    bytes: 72
+    line: 4
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 72
+    line: 5
+    character: 1
+  end_position:
+    bytes: 77
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 77
+    line: 5
+    character: 6
+  end_position:
+    bytes: 78
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 78
+    line: 5
+    character: 7
+  end_position:
+    bytes: 81
+    line: 5
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 81
+    line: 5
+    character: 10
+  end_position:
+    bytes: 82
+    line: 5
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 82
+    line: 5
+    character: 11
+  end_position:
+    bytes: 83
+    line: 5
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 83
+    line: 5
+    character: 12
+  end_position:
+    bytes: 84
+    line: 5
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 84
+    line: 5
+    character: 13
+  end_position:
+    bytes: 87
+    line: 5
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 87
+    line: 5
+    character: 16
+  end_position:
+    bytes: 88
+    line: 5
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 88
+    line: 6
+    character: 1
+  end_position:
+    bytes: 89
+    line: 6
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 89
+    line: 7
+    character: 1
+  end_position:
+    bytes: 91
+    line: 7
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 91
+    line: 7
+    character: 3
+  end_position:
+    bytes: 92
+    line: 7
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 92
+    line: 8
+    character: 1
+  end_position:
+    bytes: 93
+    line: 8
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 93
+    line: 8
+    character: 2
+  end_position:
+    bytes: 98
+    line: 8
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 98
+    line: 8
+    character: 7
+  end_position:
+    bytes: 99
+    line: 8
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 99
+    line: 8
+    character: 8
+  end_position:
+    bytes: 102
+    line: 8
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 102
+    line: 8
+    character: 11
+  end_position:
+    bytes: 103
+    line: 8
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 103
+    line: 8
+    character: 12
+  end_position:
+    bytes: 104
+    line: 8
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 104
+    line: 8
+    character: 13
+  end_position:
+    bytes: 105
+    line: 8
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 105
+    line: 8
+    character: 14
+  end_position:
+    bytes: 108
+    line: 8
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 108
+    line: 8
+    character: 17
+  end_position:
+    bytes: 109
+    line: 8
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 109
+    line: 9
+    character: 1
+  end_position:
+    bytes: 110
+    line: 9
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 110
+    line: 9
+    character: 2
+  end_position:
+    bytes: 120
+    line: 9
+    character: 12
+  token_type:
+    type: SingleLineComment
+    comment: " comment"
+- start_position:
+    bytes: 120
+    line: 9
+    character: 12
+  end_position:
+    bytes: 121
+    line: 9
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 121
+    line: 10
+    character: 1
+  end_position:
+    bytes: 122
+    line: 10
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 122
+    line: 10
+    character: 2
+  end_position:
+    bytes: 127
+    line: 10
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 127
+    line: 10
+    character: 7
+  end_position:
+    bytes: 128
+    line: 10
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 128
+    line: 10
+    character: 8
+  end_position:
+    bytes: 131
+    line: 10
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 131
+    line: 10
+    character: 11
+  end_position:
+    bytes: 132
+    line: 10
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 132
+    line: 10
+    character: 12
+  end_position:
+    bytes: 133
+    line: 10
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 133
+    line: 10
+    character: 13
+  end_position:
+    bytes: 134
+    line: 10
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 134
+    line: 10
+    character: 14
+  end_position:
+    bytes: 137
+    line: 10
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 137
+    line: 10
+    character: 17
+  end_position:
+    bytes: 138
+    line: 10
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 138
+    line: 11
+    character: 1
+  end_position:
+    bytes: 141
+    line: 11
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 141
+    line: 11
+    character: 4
+  end_position:
+    bytes: 141
+    line: 11
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/unops/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/unops/ast.snap
new file mode 100644
index 00000000..da0e7760
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/unops/ast.snap
@@ -0,0 +1,667 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/unops
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 21
+                    line: 1
+                    character: 22
+                  token_type:
+                    type: Identifier
+                    identifier: negativeLiteral
+                trailing_trivia:
+                  - start_position:
+                      bytes: 21
+                      line: 1
+                      character: 22
+                    end_position:
+                      bytes: 22
+                      line: 1
+                      character: 23
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 22
+              line: 1
+              character: 23
+            end_position:
+              bytes: 23
+              line: 1
+              character: 24
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 23
+                line: 1
+                character: 24
+              end_position:
+                bytes: 24
+                line: 1
+                character: 25
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                UnaryOperator:
+                  unop:
+                    Minus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 24
+                          line: 1
+                          character: 25
+                        end_position:
+                          bytes: 25
+                          line: 1
+                          character: 26
+                        token_type:
+                          type: Symbol
+                          symbol: "-"
+                      trailing_trivia: []
+                  expression:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 25
+                          line: 1
+                          character: 26
+                        end_position:
+                          bytes: 26
+                          line: 1
+                          character: 27
+                        token_type:
+                          type: Number
+                          text: "3"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 26
+                            line: 1
+                            character: 27
+                          end_position:
+                            bytes: 27
+                            line: 1
+                            character: 27
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 27
+              line: 2
+              character: 1
+            end_position:
+              bytes: 32
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 32
+                line: 2
+                character: 6
+              end_position:
+                bytes: 33
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 33
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 49
+                    line: 2
+                    character: 23
+                  token_type:
+                    type: Identifier
+                    identifier: negativeVariable
+                trailing_trivia:
+                  - start_position:
+                      bytes: 49
+                      line: 2
+                      character: 23
+                    end_position:
+                      bytes: 50
+                      line: 2
+                      character: 24
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 50
+              line: 2
+              character: 24
+            end_position:
+              bytes: 51
+              line: 2
+              character: 25
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 51
+                line: 2
+                character: 25
+              end_position:
+                bytes: 52
+                line: 2
+                character: 26
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                UnaryOperator:
+                  unop:
+                    Minus:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 52
+                          line: 2
+                          character: 26
+                        end_position:
+                          bytes: 53
+                          line: 2
+                          character: 27
+                        token_type:
+                          type: Symbol
+                          symbol: "-"
+                      trailing_trivia: []
+                  expression:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 53
+                            line: 2
+                            character: 27
+                          end_position:
+                            bytes: 54
+                            line: 2
+                            character: 28
+                          token_type:
+                            type: Identifier
+                            identifier: x
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 54
+                              line: 2
+                              character: 28
+                            end_position:
+                              bytes: 55
+                              line: 2
+                              character: 28
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 55
+              line: 3
+              character: 1
+            end_position:
+              bytes: 60
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 60
+                line: 3
+                character: 6
+              end_position:
+                bytes: 61
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 61
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 71
+                    line: 3
+                    character: 17
+                  token_type:
+                    type: Identifier
+                    identifier: notLiteral
+                trailing_trivia:
+                  - start_position:
+                      bytes: 71
+                      line: 3
+                      character: 17
+                    end_position:
+                      bytes: 72
+                      line: 3
+                      character: 18
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 72
+              line: 3
+              character: 18
+            end_position:
+              bytes: 73
+              line: 3
+              character: 19
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 73
+                line: 3
+                character: 19
+              end_position:
+                bytes: 74
+                line: 3
+                character: 20
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                UnaryOperator:
+                  unop:
+                    Not:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 74
+                          line: 3
+                          character: 20
+                        end_position:
+                          bytes: 77
+                          line: 3
+                          character: 23
+                        token_type:
+                          type: Symbol
+                          symbol: not
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 77
+                            line: 3
+                            character: 23
+                          end_position:
+                            bytes: 78
+                            line: 3
+                            character: 24
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  expression:
+                    Symbol:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 78
+                          line: 3
+                          character: 24
+                        end_position:
+                          bytes: 82
+                          line: 3
+                          character: 28
+                        token_type:
+                          type: Symbol
+                          symbol: "true"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 82
+                            line: 3
+                            character: 28
+                          end_position:
+                            bytes: 83
+                            line: 3
+                            character: 28
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 83
+              line: 4
+              character: 1
+            end_position:
+              bytes: 88
+              line: 4
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 88
+                line: 4
+                character: 6
+              end_position:
+                bytes: 89
+                line: 4
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 89
+                    line: 4
+                    character: 7
+                  end_position:
+                    bytes: 100
+                    line: 4
+                    character: 18
+                  token_type:
+                    type: Identifier
+                    identifier: notVariable
+                trailing_trivia:
+                  - start_position:
+                      bytes: 100
+                      line: 4
+                      character: 18
+                    end_position:
+                      bytes: 101
+                      line: 4
+                      character: 19
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 101
+              line: 4
+              character: 19
+            end_position:
+              bytes: 102
+              line: 4
+              character: 20
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 102
+                line: 4
+                character: 20
+              end_position:
+                bytes: 103
+                line: 4
+                character: 21
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                UnaryOperator:
+                  unop:
+                    Not:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 103
+                          line: 4
+                          character: 21
+                        end_position:
+                          bytes: 106
+                          line: 4
+                          character: 24
+                        token_type:
+                          type: Symbol
+                          symbol: not
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 106
+                            line: 4
+                            character: 24
+                          end_position:
+                            bytes: 107
+                            line: 4
+                            character: 25
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  expression:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 107
+                            line: 4
+                            character: 25
+                          end_position:
+                            bytes: 108
+                            line: 4
+                            character: 26
+                          token_type:
+                            type: Identifier
+                            identifier: x
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 108
+                              line: 4
+                              character: 26
+                            end_position:
+                              bytes: 109
+                              line: 4
+                              character: 26
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 109
+              line: 5
+              character: 1
+            end_position:
+              bytes: 114
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 114
+                line: 5
+                character: 6
+              end_position:
+                bytes: 115
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 115
+                    line: 5
+                    character: 7
+                  end_position:
+                    bytes: 121
+                    line: 5
+                    character: 13
+                  token_type:
+                    type: Identifier
+                    identifier: length
+                trailing_trivia:
+                  - start_position:
+                      bytes: 121
+                      line: 5
+                      character: 13
+                    end_position:
+                      bytes: 122
+                      line: 5
+                      character: 14
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 122
+              line: 5
+              character: 14
+            end_position:
+              bytes: 123
+              line: 5
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 123
+                line: 5
+                character: 15
+              end_position:
+                bytes: 124
+                line: 5
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                UnaryOperator:
+                  unop:
+                    Hash:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 124
+                          line: 5
+                          character: 16
+                        end_position:
+                          bytes: 125
+                          line: 5
+                          character: 17
+                        token_type:
+                          type: Symbol
+                          symbol: "#"
+                      trailing_trivia: []
+                  expression:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 125
+                            line: 5
+                            character: 17
+                          end_position:
+                            bytes: 126
+                            line: 5
+                            character: 18
+                          token_type:
+                            type: Identifier
+                            identifier: x
+                        trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/unops/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/unops/source.lua
new file mode 100644
index 00000000..47d8330d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/unops/source.lua
@@ -0,0 +1,5 @@
+local negativeLiteral = -3
+local negativeVariable = -x
+local notLiteral = not true
+local notVariable = not x
+local length = #x
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/unops/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/unops/tokens.snap
new file mode 100644
index 00000000..5101a9d9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/unops/tokens.snap
@@ -0,0 +1,523 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/unops
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: negativeLiteral
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 27
+    line: 1
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 27
+    line: 2
+    character: 1
+  end_position:
+    bytes: 32
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 32
+    line: 2
+    character: 6
+  end_position:
+    bytes: 33
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 33
+    line: 2
+    character: 7
+  end_position:
+    bytes: 49
+    line: 2
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: negativeVariable
+- start_position:
+    bytes: 49
+    line: 2
+    character: 23
+  end_position:
+    bytes: 50
+    line: 2
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 50
+    line: 2
+    character: 24
+  end_position:
+    bytes: 51
+    line: 2
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 51
+    line: 2
+    character: 25
+  end_position:
+    bytes: 52
+    line: 2
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 52
+    line: 2
+    character: 26
+  end_position:
+    bytes: 53
+    line: 2
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 53
+    line: 2
+    character: 27
+  end_position:
+    bytes: 54
+    line: 2
+    character: 28
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 54
+    line: 2
+    character: 28
+  end_position:
+    bytes: 55
+    line: 2
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 55
+    line: 3
+    character: 1
+  end_position:
+    bytes: 60
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 60
+    line: 3
+    character: 6
+  end_position:
+    bytes: 61
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 61
+    line: 3
+    character: 7
+  end_position:
+    bytes: 71
+    line: 3
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: notLiteral
+- start_position:
+    bytes: 71
+    line: 3
+    character: 17
+  end_position:
+    bytes: 72
+    line: 3
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 72
+    line: 3
+    character: 18
+  end_position:
+    bytes: 73
+    line: 3
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 73
+    line: 3
+    character: 19
+  end_position:
+    bytes: 74
+    line: 3
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 74
+    line: 3
+    character: 20
+  end_position:
+    bytes: 77
+    line: 3
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: not
+- start_position:
+    bytes: 77
+    line: 3
+    character: 23
+  end_position:
+    bytes: 78
+    line: 3
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 78
+    line: 3
+    character: 24
+  end_position:
+    bytes: 82
+    line: 3
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 82
+    line: 3
+    character: 28
+  end_position:
+    bytes: 83
+    line: 3
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 83
+    line: 4
+    character: 1
+  end_position:
+    bytes: 88
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 88
+    line: 4
+    character: 6
+  end_position:
+    bytes: 89
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 89
+    line: 4
+    character: 7
+  end_position:
+    bytes: 100
+    line: 4
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: notVariable
+- start_position:
+    bytes: 100
+    line: 4
+    character: 18
+  end_position:
+    bytes: 101
+    line: 4
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 101
+    line: 4
+    character: 19
+  end_position:
+    bytes: 102
+    line: 4
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 102
+    line: 4
+    character: 20
+  end_position:
+    bytes: 103
+    line: 4
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 103
+    line: 4
+    character: 21
+  end_position:
+    bytes: 106
+    line: 4
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: not
+- start_position:
+    bytes: 106
+    line: 4
+    character: 24
+  end_position:
+    bytes: 107
+    line: 4
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 107
+    line: 4
+    character: 25
+  end_position:
+    bytes: 108
+    line: 4
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 108
+    line: 4
+    character: 26
+  end_position:
+    bytes: 109
+    line: 4
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 109
+    line: 5
+    character: 1
+  end_position:
+    bytes: 114
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 114
+    line: 5
+    character: 6
+  end_position:
+    bytes: 115
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 115
+    line: 5
+    character: 7
+  end_position:
+    bytes: 121
+    line: 5
+    character: 13
+  token_type:
+    type: Identifier
+    identifier: length
+- start_position:
+    bytes: 121
+    line: 5
+    character: 13
+  end_position:
+    bytes: 122
+    line: 5
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 122
+    line: 5
+    character: 14
+  end_position:
+    bytes: 123
+    line: 5
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 123
+    line: 5
+    character: 15
+  end_position:
+    bytes: 124
+    line: 5
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 124
+    line: 5
+    character: 16
+  end_position:
+    bytes: 125
+    line: 5
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "#"
+- start_position:
+    bytes: 125
+    line: 5
+    character: 17
+  end_position:
+    bytes: 126
+    line: 5
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 126
+    line: 5
+    character: 18
+  end_position:
+    bytes: 126
+    line: 5
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/ast.snap
new file mode 100644
index 00000000..cc9212d6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/ast.snap
@@ -0,0 +1,136 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/utf-8
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: print
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          end_position:
+                            bytes: 6
+                            line: 1
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 24
+                            line: 1
+                            character: 22
+                          end_position:
+                            bytes: 25
+                            line: 1
+                            character: 23
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          BinaryOperator:
+                            lhs:
+                              String:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 6
+                                    line: 1
+                                    character: 7
+                                  end_position:
+                                    bytes: 13
+                                    line: 1
+                                    character: 11
+                                  token_type:
+                                    type: StringLiteral
+                                    literal: "👚 "
+                                    quote_type: Double
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 13
+                                      line: 1
+                                      character: 11
+                                    end_position:
+                                      bytes: 14
+                                      line: 1
+                                      character: 12
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            binop:
+                              TwoDots:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 14
+                                    line: 1
+                                    character: 12
+                                  end_position:
+                                    bytes: 16
+                                    line: 1
+                                    character: 14
+                                  token_type:
+                                    type: Symbol
+                                    symbol: ".."
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 16
+                                      line: 1
+                                      character: 14
+                                    end_position:
+                                      bytes: 17
+                                      line: 1
+                                      character: 15
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                            rhs:
+                              Var:
+                                Name:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 17
+                                      line: 1
+                                      character: 15
+                                    end_position:
+                                      bytes: 24
+                                      line: 1
+                                      character: 22
+                                    token_type:
+                                      type: Identifier
+                                      identifier: message
+                                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/source.lua
new file mode 100644
index 00000000..2f69a435
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/source.lua
@@ -0,0 +1 @@
+print("👚 " .. message)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/tokens.snap
new file mode 100644
index 00000000..9f6d50f1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/utf-8/tokens.snap
@@ -0,0 +1,106 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/utf-8
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 13
+    line: 1
+    character: 11
+  token_type:
+    type: StringLiteral
+    literal: "👚 "
+    quote_type: Double
+- start_position:
+    bytes: 13
+    line: 1
+    character: 11
+  end_position:
+    bytes: 14
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 12
+  end_position:
+    bytes: 16
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ".."
+- start_position:
+    bytes: 16
+    line: 1
+    character: 14
+  end_position:
+    bytes: 17
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 15
+  end_position:
+    bytes: 24
+    line: 1
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: message
+- start_position:
+    bytes: 24
+    line: 1
+    character: 22
+  end_position:
+    bytes: 25
+    line: 1
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 25
+    line: 1
+    character: 23
+  end_position:
+    bytes: 25
+    line: 1
+    character: 23
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/while/ast.snap b/src/Rust/vvs_parser/src/tests/cases/pass/while/ast.snap
new file mode 100644
index 00000000..081c5300
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/while/ast.snap
@@ -0,0 +1,222 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/cases/pass/while
+---
+stmts:
+  - - While:
+        while_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: while
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        condition:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                end_position:
+                  bytes: 15
+                  line: 1
+                  character: 16
+                token_type:
+                  type: Identifier
+                  identifier: condition
+              trailing_trivia:
+                - start_position:
+                    bytes: 15
+                    line: 1
+                    character: 16
+                  end_position:
+                    bytes: 16
+                    line: 1
+                    character: 17
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 16
+              line: 1
+              character: 17
+            end_position:
+              bytes: 18
+              line: 1
+              character: 19
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 18
+                line: 1
+                character: 19
+              end_position:
+                bytes: 19
+                line: 1
+                character: 19
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 19
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 20
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 20
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 24
+                          line: 2
+                          character: 6
+                        token_type:
+                          type: Identifier
+                          identifier: call
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 24
+                                      line: 2
+                                      character: 6
+                                    end_position:
+                                      bytes: 25
+                                      line: 2
+                                      character: 7
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 25
+                                      line: 2
+                                      character: 7
+                                    end_position:
+                                      bytes: 26
+                                      line: 2
+                                      character: 8
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 26
+                                        line: 2
+                                        character: 8
+                                      end_position:
+                                        bytes: 27
+                                        line: 2
+                                        character: 8
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs: []
+              - ~
+          last_stmt:
+            - Break:
+                leading_trivia:
+                  - start_position:
+                      bytes: 27
+                      line: 3
+                      character: 1
+                    end_position:
+                      bytes: 28
+                      line: 3
+                      character: 2
+                    token_type:
+                      type: Whitespace
+                      characters: "\t"
+                token:
+                  start_position:
+                    bytes: 28
+                    line: 3
+                    character: 2
+                  end_position:
+                    bytes: 33
+                    line: 3
+                    character: 7
+                  token_type:
+                    type: Symbol
+                    symbol: break
+                trailing_trivia:
+                  - start_position:
+                      bytes: 33
+                      line: 3
+                      character: 7
+                    end_position:
+                      bytes: 34
+                      line: 3
+                      character: 7
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+            - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 34
+              line: 4
+              character: 1
+            end_position:
+              bytes: 37
+              line: 4
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/while/source.lua b/src/Rust/vvs_parser/src/tests/cases/pass/while/source.lua
new file mode 100644
index 00000000..0fe6ecf3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/while/source.lua
@@ -0,0 +1,4 @@
+while condition do
+	call()
+	break
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/cases/pass/while/tokens.snap b/src/Rust/vvs_parser/src/tests/cases/pass/while/tokens.snap
new file mode 100644
index 00000000..7d618d48
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/cases/pass/while/tokens.snap
@@ -0,0 +1,182 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/cases/pass/while
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: while
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: condition
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 2
+    character: 1
+  end_position:
+    bytes: 20
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 20
+    line: 2
+    character: 2
+  end_position:
+    bytes: 24
+    line: 2
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: call
+- start_position:
+    bytes: 24
+    line: 2
+    character: 6
+  end_position:
+    bytes: 25
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 25
+    line: 2
+    character: 7
+  end_position:
+    bytes: 26
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 26
+    line: 2
+    character: 8
+  end_position:
+    bytes: 27
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 27
+    line: 3
+    character: 1
+  end_position:
+    bytes: 28
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 28
+    line: 3
+    character: 2
+  end_position:
+    bytes: 33
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: break
+- start_position:
+    bytes: 33
+    line: 3
+    character: 7
+  end_position:
+    bytes: 34
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 34
+    line: 4
+    character: 1
+  end_position:
+    bytes: 37
+    line: 4
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 37
+    line: 4
+    character: 4
+  end_position:
+    bytes: 37
+    line: 4
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/comments_around_functions.rs b/src/Rust/vvs_parser/src/tests/comments_around_functions.rs
new file mode 100644
index 00000000..dfa19780
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/comments_around_functions.rs
@@ -0,0 +1,52 @@
+// This is code from a real life usage of full-moon
+
+use crate::{ast::*, node::Node, tokenizer::TokenKind, visitors::Visitor};
+
+const CODE: &str = r#"
+
+local Module = {}
+Module.__index = Module
+
+--[[
+    Creates a new instance of Module.
+
+    ```lua
+        Module.new()
+    ```
+
+    @static
+    @param name string - This is the name for this Module.
+    @returns Module - Returns the new Module!
+]]
+function Module.new(name)
+
+end
+
+"#;
+
+struct MemberVisitor {
+    comments: Vec<String>,
+}
+
+impl Visitor for MemberVisitor {
+    fn visit_function_declaration(&mut self, function: &FunctionDeclaration) {
+        let (tokens, _) = function.surrounding_trivia();
+        let mut tokens = tokens;
+        tokens.retain(|t| t.token_kind() == TokenKind::MultiLineComment);
+        self.comments
+            .extend(tokens.into_iter().map(|t| t.to_string()).collect::<Vec<String>>())
+    }
+}
+
+fn generate() -> Result<(), Vec<crate::Error>> {
+    let ast = crate::prelude::parser::parse_lua_tree(CODE)?;
+    let mut visitor = MemberVisitor { comments: Vec::new() };
+    visitor.visit_ast(&ast);
+    println!("{:?}", visitor.comments);
+    Ok(())
+}
+
+#[test]
+fn test() {
+    generate().expect("Oh");
+}
diff --git a/src/Rust/vvs_parser/src/tests/common.rs b/src/Rust/vvs_parser/src/tests/common.rs
new file mode 100644
index 00000000..c484fa2f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/common.rs
@@ -0,0 +1,19 @@
+use std::fs;
+use std::path::Path;
+
+fn with_insta_settings(path: &Path, f: impl FnOnce()) {
+    let mut settings = insta::Settings::clone_current();
+    settings.set_prepend_module_to_snapshot(false);
+    settings.set_snapshot_path(path);
+    settings.set_input_file(path);
+    settings.bind(f)
+}
+
+pub fn run_test_folder<P: AsRef<Path>>(folder: P, test_fn: impl Fn(&Path)) {
+    for entry in fs::read_dir(folder).expect("couldn't read directory") {
+        let entry = entry.unwrap();
+        let path = entry.path().canonicalize().unwrap();
+        dbg!(entry.path().to_string_lossy());
+        with_insta_settings(&path, || test_fn(&path))
+    }
+}
diff --git a/src/Rust/vvs_parser/src/tests/derive_node.rs b/src/Rust/vvs_parser/src/tests/derive_node.rs
new file mode 100644
index 00000000..ef4e837f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/derive_node.rs
@@ -0,0 +1,32 @@
+use crate::{ast, node::Node, prelude::parser::parse_lua_tree as parse, visitors::Visitor};
+
+const MIN_MAX_CODE: &str = "local x = { 1, 2, 3 }";
+
+#[test]
+fn test_position_min_max() {
+    struct TestVisitor(bool);
+
+    impl Visitor for TestVisitor {
+        fn visit_table_constructor(&mut self, constructor: &ast::TableConstructor) {
+            self.0 = true;
+            assert_eq!(
+                MIN_MAX_CODE
+                    .as_bytes()
+                    .get(constructor.start_position().unwrap().bytes()),
+                Some(&b'{')
+            );
+            assert_eq!(
+                MIN_MAX_CODE
+                    .as_bytes()
+                    .get(constructor.end_position().unwrap().bytes() - 1),
+                Some(&b'}')
+            );
+        }
+    }
+
+    let ast = parse(MIN_MAX_CODE).unwrap();
+
+    let mut visitor = TestVisitor(false);
+    visitor.visit_ast(&ast);
+    assert!(visitor.0, "TableConstructor was never found");
+}
diff --git a/src/Rust/vvs_parser/src/tests/fail_cases.rs b/src/Rust/vvs_parser/src/tests/fail_cases.rs
new file mode 100644
index 00000000..a8461cd7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/fail_cases.rs
@@ -0,0 +1,94 @@
+use crate::{ast::AstResult, tests::common::run_test_folder, tokenizer};
+use codespan_reporting::{
+    diagnostic::{Diagnostic, Label},
+    files::SimpleFiles,
+};
+use insta::{assert_snapshot, assert_yaml_snapshot};
+use std::fs;
+
+fn process_codespan_display(source_name: &str, source: &str, errors: &[crate::Error]) {
+    let mut files = SimpleFiles::new();
+    let file_id = files.add(source_name, source);
+    let config = codespan_reporting::term::Config::default();
+    let mut output = termcolor::NoColor::new(Vec::new());
+
+    for error in errors {
+        let range = error.range();
+        let diagnostic = Diagnostic::error()
+            .with_message(error.error_message())
+            .with_code(match error {
+                crate::Error::AstError(_) => "ast",
+                crate::Error::TokenizerError(_) => "tokenizer",
+            })
+            .with_labels(vec![Label::primary(file_id, (range.0.bytes())..(range.1.bytes()))]);
+        codespan_reporting::term::emit(&mut output, &config, &files, &diagnostic).unwrap();
+    }
+
+    assert_snapshot!("error_display", String::from_utf8(output.into_inner()).unwrap());
+}
+
+fn run_parser_fail_cases(folder: &str) {
+    run_test_folder(folder, |path| {
+        let source = fs::read_to_string(path.join("source.lua")).expect("couldn't read source.lua");
+        let tokens = tokenizer::Lexer::new(&source).collect().unwrap();
+        assert_yaml_snapshot!("tokens", tokens);
+
+        let result = AstResult::parse_fallible(&source);
+
+        if result.errors().is_empty() {
+            panic!("fail case passed for {path:?}");
+        }
+
+        assert_yaml_snapshot!("errors", result.errors());
+        assert_yaml_snapshot!("ast", result.ast());
+
+        process_codespan_display("source.lua", &source, result.errors());
+
+        let ast = result.into_ast().update_positions();
+        assert_yaml_snapshot!("ast_to_string", format!("{ast}"));
+    });
+}
+
+#[test]
+fn test_roblox_parser_fail_cases() {
+    run_parser_fail_cases("./src/tests/roblox_cases/fail/parser");
+}
+
+#[test]
+fn test_lua52_parser_fail_cases() {
+    run_parser_fail_cases("./src/tests/lua52_cases/fail/parser");
+}
+
+#[test]
+fn test_lua53_parser_fail_cases() {
+    run_parser_fail_cases("./src/tests/lua53_cases/fail/parser");
+}
+
+#[test]
+fn test_lua54_parser_fail_cases() {
+    run_parser_fail_cases("./src/tests/lua54_cases/fail/parser");
+}
+
+#[test]
+fn test_vivy_parser_fail_cases() {
+    run_parser_fail_cases("./src/tests/vivy_cases/fail/parser");
+}
+
+#[test]
+fn test_option_parser_fail_cases() {
+    run_test_folder("./src/tests/option_cases/fail/parser", |path| {
+        let source = fs::read_to_string(path.join("source.ini")).expect("couldn't read source.ini");
+        let tokens = tokenizer::Lexer::new(&source).collect().unwrap();
+        assert_yaml_snapshot!("tokens", tokens);
+
+        let result = crate::ast::OptionTableResult::parse_fallible(&source);
+        if result.errors().is_empty() {
+            panic!("fail case passed for {path:?}");
+        }
+
+        assert_yaml_snapshot!("errors", result.errors());
+        assert_yaml_snapshot!("option_table", result.option_table());
+
+        process_codespan_display("source.ini", &source, result.errors());
+    });
+}
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/ast.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/ast.snap
new file mode 100644
index 00000000..b43eda27
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 23
+expression: result.ast
+input_file: full-moon/tests/lua52_cases/fail/parser/goto-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 4
+      line: 1
+      character: 5
+    end_position:
+      bytes: 4
+      line: 1
+      character: 5
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/ast_to_string.snap
new file mode 100644
index 00000000..3ae24382
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 28
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/lua52_cases/fail/parser/goto-1
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/error_display.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/error_display.snap
new file mode 100644
index 00000000..59b9a701
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/error_display.snap
@@ -0,0 +1,11 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 53
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/lua52_cases/fail/parser/goto-1
+---
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:5
+  │
+1 │ goto
+  │     ^
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/errors.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/errors.snap
new file mode 100644
index 00000000..892b3f6c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 22
+expression: result.errors()
+input_file: vvs_parser/tests/lua52_cases/fail/parser/goto-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 4
+        line: 1
+        character: 5
+      end_position:
+        bytes: 4
+        line: 1
+        character: 5
+      token_type:
+        type: Eof
+    additional: unexpected expression when looking for a statement
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/source.lua b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/source.lua
new file mode 100644
index 00000000..cce75b69
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/source.lua
@@ -0,0 +1 @@
+goto
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/tokens.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/tokens.snap
new file mode 100644
index 00000000..7ae0d193
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/goto-1/tokens.snap
@@ -0,0 +1,27 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 60
+expression: tokens
+input_file: vvs_parser/tests/lua52_cases/fail/parser/goto-1
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: goto
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/ast.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/ast.snap
new file mode 100644
index 00000000..ddf9510e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/ast.snap
@@ -0,0 +1,22 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 23
+expression: result.ast()
+input_file: vvs_parser/tests/lua52_cases/fail/parser/label-1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 7
+      line: 1
+      character: 8
+    end_position:
+      bytes: 7
+      line: 1
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/ast_to_string.snap
new file mode 100644
index 00000000..b3b47b03
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/ast_to_string.snap
@@ -0,0 +1,7 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 28
+expression: "vvs_parser::print(&ast)"
+input_file: vvs_parser/tests/lua52_cases/fail/parser/label-1
+---
+""
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/error_display.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/error_display.snap
new file mode 100644
index 00000000..d102ab01
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/error_display.snap
@@ -0,0 +1,17 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 53
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/lua52_cases/fail/parser/label-1
+---
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:1
+  │
+1 │ ::label
+  │ ^^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:8
+  │
+1 │ ::label
+  │        ^
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/errors.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/errors.snap
new file mode 100644
index 00000000..105e410b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/errors.snap
@@ -0,0 +1,33 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 22
+expression: result.errors()
+input_file: vvs_parser/tests/lua52_cases/fail/parser/label-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 2
+        line: 1
+        character: 3
+      token_type:
+        type: Symbol
+        symbol: "::"
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 7
+        line: 1
+        character: 8
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Eof
+    additional: unexpected expression when looking for a statement
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/source.lua b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/source.lua
new file mode 100644
index 00000000..4ef49c49
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/source.lua
@@ -0,0 +1 @@
+::label
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/tokens.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/tokens.snap
new file mode 100644
index 00000000..897e3879
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-1/tokens.snap
@@ -0,0 +1,39 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/lua52_cases/fail/parser/label-1
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 2
+    line: 1
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: "::"
+- start_position:
+    bytes: 2
+    line: 1
+    character: 3
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: label
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/ast.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/ast.snap
new file mode 100644
index 00000000..978cd6d9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/ast.snap
@@ -0,0 +1,23 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 23
+expression: result.ast
+input_file: full-moon/tests/lua52_cases/fail/parser/label-2
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 7
+      line: 1
+      character: 8
+    end_position:
+      bytes: 7
+      line: 1
+      character: 8
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/ast_to_string.snap
new file mode 100644
index 00000000..ff6f7222
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 28
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/lua52_cases/fail/parser/label-2
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/error_display.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/error_display.snap
new file mode 100644
index 00000000..c93bc34f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/error_display.snap
@@ -0,0 +1,17 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 53
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/lua52_cases/fail/parser/label-2
+---
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:6
+  │
+1 │ label::
+  │      ^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:6
+  │
+1 │ label::
+  │      ^^
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/errors.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/errors.snap
new file mode 100644
index 00000000..14bd5089
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/errors.snap
@@ -0,0 +1,34 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+assertion_line: 22
+expression: result.errors()
+input_file: vvs_parser/tests/lua52_cases/fail/parser/label-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 5
+        line: 1
+        character: 6
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: "::"
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 5
+        line: 1
+        character: 6
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: "::"
+    additional: "unexpected token, this needs to be a statement"
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/source.lua b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/source.lua
new file mode 100644
index 00000000..6a8a2de7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/source.lua
@@ -0,0 +1 @@
+label::
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/tokens.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/tokens.snap
new file mode 100644
index 00000000..6a18496e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/fail/parser/label-2/tokens.snap
@@ -0,0 +1,39 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+input_file: full-moon/tests/lua52_cases/fail/parser/label-2
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: label
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "::"
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/ast.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/ast.snap
new file mode 100644
index 00000000..f087bb32
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/ast.snap
@@ -0,0 +1,79 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/lua52_cases/pass/not-z-escape-string
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: print
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          end_position:
+                            bytes: 6
+                            line: 1
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 28
+                            line: 2
+                            character: 12
+                          end_position:
+                            bytes: 29
+                            line: 2
+                            character: 13
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 6
+                                line: 1
+                                character: 7
+                              end_position:
+                                bytes: 28
+                                line: 2
+                                character: 12
+                              token_type:
+                                type: StringLiteral
+                                literal: "testing \\\n\t   twelve"
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/source.lua b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/source.lua
new file mode 100644
index 00000000..05b5128a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/source.lua
@@ -0,0 +1,2 @@
+print("testing \
+	   twelve")
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/tokens.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/tokens.snap
new file mode 100644
index 00000000..b07bc057
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/not-z-escape-string/tokens.snap
@@ -0,0 +1,60 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 28
+    line: 2
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: "testing \\\n\t   twelve"
+    quote_type: Double
+- start_position:
+    bytes: 28
+    line: 2
+    character: 12
+  end_position:
+    bytes: 29
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 29
+    line: 2
+    character: 13
+  end_position:
+    bytes: 29
+    line: 2
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/ast.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/ast.snap
new file mode 100644
index 00000000..59fb072d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/ast.snap
@@ -0,0 +1,429 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 47
+expression: ast.nodes()
+input_file: full-moon/tests/lua52_cases/pass/numbers
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 25
+                line: 1
+                character: 26
+              token_type:
+                type: SingleLineComment
+                comment: " fractional hexadecimal"
+            - start_position:
+                bytes: 25
+                line: 1
+                character: 26
+              end_position:
+                bytes: 26
+                line: 1
+                character: 26
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 26
+              line: 2
+              character: 1
+            end_position:
+              bytes: 31
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 31
+                line: 2
+                character: 6
+              end_position:
+                bytes: 32
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 32
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 33
+                    line: 2
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: a
+                trailing_trivia:
+                  - start_position:
+                      bytes: 33
+                      line: 2
+                      character: 8
+                    end_position:
+                      bytes: 34
+                      line: 2
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 34
+              line: 2
+              character: 9
+            end_position:
+              bytes: 35
+              line: 2
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 35
+                line: 2
+                character: 10
+              end_position:
+                bytes: 36
+                line: 2
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 36
+                      line: 2
+                      character: 11
+                    end_position:
+                      bytes: 42
+                      line: 2
+                      character: 17
+                    token_type:
+                      type: Number
+                      text: "0x0.1E"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 42
+                        line: 2
+                        character: 17
+                      end_position:
+                        bytes: 43
+                        line: 2
+                        character: 17
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 43
+                line: 3
+                character: 1
+              end_position:
+                bytes: 44
+                line: 3
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+            - start_position:
+                bytes: 44
+                line: 4
+                character: 1
+              end_position:
+                bytes: 77
+                line: 4
+                character: 34
+              token_type:
+                type: SingleLineComment
+                comment: " binary exponent in hexadecimal"
+            - start_position:
+                bytes: 77
+                line: 4
+                character: 34
+              end_position:
+                bytes: 78
+                line: 4
+                character: 34
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 78
+              line: 5
+              character: 1
+            end_position:
+              bytes: 83
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 83
+                line: 5
+                character: 6
+              end_position:
+                bytes: 84
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 84
+                    line: 5
+                    character: 7
+                  end_position:
+                    bytes: 85
+                    line: 5
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: b
+                trailing_trivia:
+                  - start_position:
+                      bytes: 85
+                      line: 5
+                      character: 8
+                    end_position:
+                      bytes: 86
+                      line: 5
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 86
+              line: 5
+              character: 9
+            end_position:
+              bytes: 87
+              line: 5
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 87
+                line: 5
+                character: 10
+              end_position:
+                bytes: 88
+                line: 5
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 88
+                      line: 5
+                      character: 11
+                    end_position:
+                      bytes: 96
+                      line: 5
+                      character: 19
+                    token_type:
+                      type: Number
+                      text: "0xA23p-4"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 96
+                        line: 5
+                        character: 19
+                      end_position:
+                        bytes: 97
+                        line: 5
+                        character: 19
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 97
+                line: 6
+                character: 1
+              end_position:
+                bytes: 98
+                line: 6
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+            - start_position:
+                bytes: 98
+                line: 7
+                character: 1
+              end_position:
+                bytes: 118
+                line: 7
+                character: 21
+              token_type:
+                type: SingleLineComment
+                comment: " a mixture of both"
+            - start_position:
+                bytes: 118
+                line: 7
+                character: 21
+              end_position:
+                bytes: 119
+                line: 7
+                character: 21
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 119
+              line: 8
+              character: 1
+            end_position:
+              bytes: 124
+              line: 8
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 124
+                line: 8
+                character: 6
+              end_position:
+                bytes: 125
+                line: 8
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 125
+                    line: 8
+                    character: 7
+                  end_position:
+                    bytes: 126
+                    line: 8
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: c
+                trailing_trivia:
+                  - start_position:
+                      bytes: 126
+                      line: 8
+                      character: 8
+                    end_position:
+                      bytes: 127
+                      line: 8
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 127
+              line: 8
+              character: 9
+            end_position:
+              bytes: 128
+              line: 8
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 128
+                line: 8
+                character: 10
+              end_position:
+                bytes: 129
+                line: 8
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 129
+                      line: 8
+                      character: 11
+                    end_position:
+                      bytes: 149
+                      line: 8
+                      character: 31
+                    token_type:
+                      type: Number
+                      text: 0X1.921FB54442D18P+1
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 149
+                        line: 8
+                        character: 31
+                      end_position:
+                        bytes: 150
+                        line: 8
+                        character: 31
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/source.lua b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/source.lua
new file mode 100644
index 00000000..ef1430c4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/source.lua
@@ -0,0 +1,15 @@
+-- fractional hexadecimal
+local a = 0x0.1E
+
+-- binary exponent in hexadecimal
+local b = 0xA23p-4
+
+-- a mixture of both
+local c = 0X1.921FB54442D18P+1
+
+-- LuaJIT numbers (ULL/LL ending for both decimal and hexidecimal, or imaginary)
+-- This is in Lua 5.2 tests for simplicity
+-- rewrite todo: add this back, but in a separate luajit pass folder
+-- local d = 42LL
+-- local e = 0x2aLL
+-- local f = 12.5i
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/tokens.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/tokens.snap
new file mode 100644
index 00000000..f8b26543
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/numbers/tokens.snap
@@ -0,0 +1,512 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 40
+expression: tokens
+input_file: full-moon/tests/lua52_cases/pass/numbers
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: SingleLineComment
+    comment: " fractional hexadecimal"
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 26
+    line: 2
+    character: 1
+  end_position:
+    bytes: 31
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 31
+    line: 2
+    character: 6
+  end_position:
+    bytes: 32
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 32
+    line: 2
+    character: 7
+  end_position:
+    bytes: 33
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 33
+    line: 2
+    character: 8
+  end_position:
+    bytes: 34
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 34
+    line: 2
+    character: 9
+  end_position:
+    bytes: 35
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 35
+    line: 2
+    character: 10
+  end_position:
+    bytes: 36
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 36
+    line: 2
+    character: 11
+  end_position:
+    bytes: 42
+    line: 2
+    character: 17
+  token_type:
+    type: Number
+    text: "0x0.1E"
+- start_position:
+    bytes: 42
+    line: 2
+    character: 17
+  end_position:
+    bytes: 43
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 43
+    line: 3
+    character: 1
+  end_position:
+    bytes: 44
+    line: 3
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 44
+    line: 4
+    character: 1
+  end_position:
+    bytes: 77
+    line: 4
+    character: 34
+  token_type:
+    type: SingleLineComment
+    comment: " binary exponent in hexadecimal"
+- start_position:
+    bytes: 77
+    line: 4
+    character: 34
+  end_position:
+    bytes: 78
+    line: 4
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 78
+    line: 5
+    character: 1
+  end_position:
+    bytes: 83
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 83
+    line: 5
+    character: 6
+  end_position:
+    bytes: 84
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 84
+    line: 5
+    character: 7
+  end_position:
+    bytes: 85
+    line: 5
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 85
+    line: 5
+    character: 8
+  end_position:
+    bytes: 86
+    line: 5
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 86
+    line: 5
+    character: 9
+  end_position:
+    bytes: 87
+    line: 5
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 87
+    line: 5
+    character: 10
+  end_position:
+    bytes: 88
+    line: 5
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 88
+    line: 5
+    character: 11
+  end_position:
+    bytes: 96
+    line: 5
+    character: 19
+  token_type:
+    type: Number
+    text: "0xA23p-4"
+- start_position:
+    bytes: 96
+    line: 5
+    character: 19
+  end_position:
+    bytes: 97
+    line: 5
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 97
+    line: 6
+    character: 1
+  end_position:
+    bytes: 98
+    line: 6
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 98
+    line: 7
+    character: 1
+  end_position:
+    bytes: 118
+    line: 7
+    character: 21
+  token_type:
+    type: SingleLineComment
+    comment: " a mixture of both"
+- start_position:
+    bytes: 118
+    line: 7
+    character: 21
+  end_position:
+    bytes: 119
+    line: 7
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 119
+    line: 8
+    character: 1
+  end_position:
+    bytes: 124
+    line: 8
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 124
+    line: 8
+    character: 6
+  end_position:
+    bytes: 125
+    line: 8
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 125
+    line: 8
+    character: 7
+  end_position:
+    bytes: 126
+    line: 8
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 126
+    line: 8
+    character: 8
+  end_position:
+    bytes: 127
+    line: 8
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 127
+    line: 8
+    character: 9
+  end_position:
+    bytes: 128
+    line: 8
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 128
+    line: 8
+    character: 10
+  end_position:
+    bytes: 129
+    line: 8
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 129
+    line: 8
+    character: 11
+  end_position:
+    bytes: 149
+    line: 8
+    character: 31
+  token_type:
+    type: Number
+    text: 0X1.921FB54442D18P+1
+- start_position:
+    bytes: 149
+    line: 8
+    character: 31
+  end_position:
+    bytes: 150
+    line: 8
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 150
+    line: 9
+    character: 1
+  end_position:
+    bytes: 151
+    line: 9
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 151
+    line: 10
+    character: 1
+  end_position:
+    bytes: 231
+    line: 10
+    character: 81
+  token_type:
+    type: SingleLineComment
+    comment: " LuaJIT numbers (ULL/LL ending for both decimal and hexidecimal, or imaginary)"
+- start_position:
+    bytes: 231
+    line: 10
+    character: 81
+  end_position:
+    bytes: 232
+    line: 10
+    character: 81
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 232
+    line: 11
+    character: 1
+  end_position:
+    bytes: 274
+    line: 11
+    character: 43
+  token_type:
+    type: SingleLineComment
+    comment: " This is in Lua 5.2 tests for simplicity"
+- start_position:
+    bytes: 274
+    line: 11
+    character: 43
+  end_position:
+    bytes: 275
+    line: 11
+    character: 43
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 275
+    line: 12
+    character: 1
+  end_position:
+    bytes: 343
+    line: 12
+    character: 69
+  token_type:
+    type: SingleLineComment
+    comment: " rewrite todo: add this back, but in a separate luajit pass folder"
+- start_position:
+    bytes: 343
+    line: 12
+    character: 69
+  end_position:
+    bytes: 344
+    line: 12
+    character: 69
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 344
+    line: 13
+    character: 1
+  end_position:
+    bytes: 361
+    line: 13
+    character: 18
+  token_type:
+    type: SingleLineComment
+    comment: " local d = 42LL"
+- start_position:
+    bytes: 361
+    line: 13
+    character: 18
+  end_position:
+    bytes: 362
+    line: 13
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 362
+    line: 14
+    character: 1
+  end_position:
+    bytes: 381
+    line: 14
+    character: 20
+  token_type:
+    type: SingleLineComment
+    comment: " local e = 0x2aLL"
+- start_position:
+    bytes: 381
+    line: 14
+    character: 20
+  end_position:
+    bytes: 382
+    line: 14
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 382
+    line: 15
+    character: 1
+  end_position:
+    bytes: 400
+    line: 15
+    character: 19
+  token_type:
+    type: SingleLineComment
+    comment: " local f = 12.5i"
+- start_position:
+    bytes: 400
+    line: 15
+    character: 19
+  end_position:
+    bytes: 401
+    line: 15
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 401
+    line: 16
+    character: 1
+  end_position:
+    bytes: 401
+    line: 16
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/ast.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/ast.snap
new file mode 100644
index 00000000..8a117177
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/ast.snap
@@ -0,0 +1,79 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/lua52_cases/pass/z-escape-string
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: print
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          end_position:
+                            bytes: 6
+                            line: 1
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 29
+                            line: 2
+                            character: 12
+                          end_position:
+                            bytes: 30
+                            line: 2
+                            character: 13
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia: []
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 6
+                                line: 1
+                                character: 7
+                              end_position:
+                                bytes: 29
+                                line: 2
+                                character: 12
+                              token_type:
+                                type: StringLiteral
+                                literal: "testing \\z\n\t   twelve"
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/source.lua b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/source.lua
new file mode 100644
index 00000000..230a2b44
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/source.lua
@@ -0,0 +1,2 @@
+print("testing \z
+	   twelve")
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/tokens.snap b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/tokens.snap
new file mode 100644
index 00000000..3193aac1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua52_cases/pass/z-escape-string/tokens.snap
@@ -0,0 +1,60 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 29
+    line: 2
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: "testing \\z\n\t   twelve"
+    quote_type: Double
+- start_position:
+    bytes: 29
+    line: 2
+    character: 12
+  end_position:
+    bytes: 30
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 30
+    line: 2
+    character: 13
+  end_position:
+    bytes: 30
+    line: 2
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/ast.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/ast.snap
new file mode 100644
index 00000000..c7c48185
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/ast.snap
@@ -0,0 +1,156 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 23
+expression: result.ast
+input_file: full-moon/tests/lua53_cases/fail/parser/double-greater-than-binop
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 0
+                  line: 1
+                  character: 1
+                end_position:
+                  bytes: 64
+                  line: 1
+                  character: 65
+                token_type:
+                  type: SingleLineComment
+                  comment: " We shouldn't parse this as >> since it has a space in between"
+              - start_position:
+                  bytes: 64
+                  line: 1
+                  character: 65
+                end_position:
+                  bytes: 65
+                  line: 1
+                  character: 65
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 65
+                line: 2
+                character: 1
+              end_position:
+                bytes: 70
+                line: 2
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 70
+                  line: 2
+                  character: 6
+                end_position:
+                  bytes: 71
+                  line: 2
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 71
+                      line: 2
+                      character: 7
+                    end_position:
+                      bytes: 72
+                      line: 2
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 72
+                        line: 2
+                        character: 8
+                      end_position:
+                        bytes: 73
+                        line: 2
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 73
+                line: 2
+                character: 9
+              end_position:
+                bytes: 74
+                line: 2
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 74
+                  line: 2
+                  character: 10
+                end_position:
+                  bytes: 75
+                  line: 2
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 75
+                        line: 2
+                        character: 11
+                      end_position:
+                        bytes: 76
+                        line: 2
+                        character: 12
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 76
+                          line: 2
+                          character: 12
+                        end_position:
+                          bytes: 77
+                          line: 2
+                          character: 13
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 82
+      line: 2
+      character: 18
+    end_position:
+      bytes: 82
+      line: 2
+      character: 18
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/ast_to_string.snap
new file mode 100644
index 00000000..4d317ff1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/ast_to_string.snap
@@ -0,0 +1,8 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 28
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/lua53_cases/fail/parser/double-greater-than-binop
+---
+"-- We shouldn't parse this as >> since it has a space in between\nlocal x = 1 "
+
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/error.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/error.snap
new file mode 100644
index 00000000..6a22b372
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/error.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: error
+---
+UnexpectedToken:
+  token:
+    start_position:
+      bytes: 75
+      line: 2
+      character: 11
+    end_position:
+      bytes: 76
+      line: 2
+      character: 12
+    token_type:
+      type: Number
+      text: "1"
+  additional: expected expression
+
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/error_display.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/error_display.snap
new file mode 100644
index 00000000..afad8718
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/error_display.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 56
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/lua53_cases/fail/parser/double-greater-than-binop
+---
+error[ast]: expected expression after binary operator
+  ┌─ source.lua:2:13
+  │
+2 │ local x = 1 > > 2
+  │             ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:2:15
+  │
+2 │ local x = 1 > > 2
+  │               ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/errors.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/errors.snap
new file mode 100644
index 00000000..dc4ec410
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/errors.snap
@@ -0,0 +1,34 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/lua53_cases/fail/parser/double-greater-than-binop
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 77
+        line: 2
+        character: 13
+      end_position:
+        bytes: 78
+        line: 2
+        character: 14
+      token_type:
+        type: Symbol
+        symbol: ">"
+    additional: expected expression after binary operator
+- AstError:
+    token:
+      start_position:
+        bytes: 79
+        line: 2
+        character: 15
+      end_position:
+        bytes: 80
+        line: 2
+        character: 16
+      token_type:
+        type: Symbol
+        symbol: ">"
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/source.lua b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/source.lua
new file mode 100644
index 00000000..350ffca6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/source.lua
@@ -0,0 +1,2 @@
+-- We shouldn't parse this as >> since it has a space in between
+local x = 1 > > 2
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/tokens.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/tokens.snap
new file mode 100644
index 00000000..81737b53
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/fail/parser/double-greater-than-binop/tokens.snap
@@ -0,0 +1,180 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 64
+    line: 1
+    character: 65
+  token_type:
+    type: SingleLineComment
+    comment: " We shouldn't parse this as >> since it has a space in between"
+- start_position:
+    bytes: 64
+    line: 1
+    character: 65
+  end_position:
+    bytes: 65
+    line: 1
+    character: 65
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 65
+    line: 2
+    character: 1
+  end_position:
+    bytes: 70
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 70
+    line: 2
+    character: 6
+  end_position:
+    bytes: 71
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 71
+    line: 2
+    character: 7
+  end_position:
+    bytes: 72
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 72
+    line: 2
+    character: 8
+  end_position:
+    bytes: 73
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 73
+    line: 2
+    character: 9
+  end_position:
+    bytes: 74
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 74
+    line: 2
+    character: 10
+  end_position:
+    bytes: 75
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 75
+    line: 2
+    character: 11
+  end_position:
+    bytes: 76
+    line: 2
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 76
+    line: 2
+    character: 12
+  end_position:
+    bytes: 77
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 77
+    line: 2
+    character: 13
+  end_position:
+    bytes: 78
+    line: 2
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 78
+    line: 2
+    character: 14
+  end_position:
+    bytes: 79
+    line: 2
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 79
+    line: 2
+    character: 15
+  end_position:
+    bytes: 80
+    line: 2
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 80
+    line: 2
+    character: 16
+  end_position:
+    bytes: 81
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 81
+    line: 2
+    character: 17
+  end_position:
+    bytes: 82
+    line: 2
+    character: 18
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 82
+    line: 2
+    character: 18
+  end_position:
+    bytes: 82
+    line: 2
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/ast.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/ast.snap
new file mode 100644
index 00000000..51a84e9b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/ast.snap
@@ -0,0 +1,1009 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 44
+expression: ast.nodes()
+input_file: full-moon/tests/lua53_cases/pass/binary-operators
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: a
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 10
+                          line: 1
+                          character: 11
+                        end_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          end_position:
+                            bytes: 12
+                            line: 1
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    Ampersand:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 12
+                          line: 1
+                          character: 13
+                        end_position:
+                          bytes: 13
+                          line: 1
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: "&"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 13
+                            line: 1
+                            character: 14
+                          end_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 14
+                          line: 1
+                          character: 15
+                        end_position:
+                          bytes: 15
+                          line: 1
+                          character: 16
+                        token_type:
+                          type: Number
+                          text: "2"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 15
+                            line: 1
+                            character: 16
+                          end_position:
+                            bytes: 16
+                            line: 1
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 16
+              line: 2
+              character: 1
+            end_position:
+              bytes: 21
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 21
+                line: 2
+                character: 6
+              end_position:
+                bytes: 22
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 22
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 23
+                    line: 2
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: b
+                trailing_trivia:
+                  - start_position:
+                      bytes: 23
+                      line: 2
+                      character: 8
+                    end_position:
+                      bytes: 24
+                      line: 2
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 24
+              line: 2
+              character: 9
+            end_position:
+              bytes: 25
+              line: 2
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 25
+                line: 2
+                character: 10
+              end_position:
+                bytes: 26
+                line: 2
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 26
+                          line: 2
+                          character: 11
+                        end_position:
+                          bytes: 27
+                          line: 2
+                          character: 12
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 27
+                            line: 2
+                            character: 12
+                          end_position:
+                            bytes: 28
+                            line: 2
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    Pipe:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 28
+                          line: 2
+                          character: 13
+                        end_position:
+                          bytes: 29
+                          line: 2
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: "|"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 29
+                            line: 2
+                            character: 14
+                          end_position:
+                            bytes: 30
+                            line: 2
+                            character: 15
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 30
+                          line: 2
+                          character: 15
+                        end_position:
+                          bytes: 31
+                          line: 2
+                          character: 16
+                        token_type:
+                          type: Number
+                          text: "2"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 31
+                            line: 2
+                            character: 16
+                          end_position:
+                            bytes: 32
+                            line: 2
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 32
+              line: 3
+              character: 1
+            end_position:
+              bytes: 37
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 37
+                line: 3
+                character: 6
+              end_position:
+                bytes: 38
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 38
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 39
+                    line: 3
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: c
+                trailing_trivia:
+                  - start_position:
+                      bytes: 39
+                      line: 3
+                      character: 8
+                    end_position:
+                      bytes: 40
+                      line: 3
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 40
+              line: 3
+              character: 9
+            end_position:
+              bytes: 41
+              line: 3
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 41
+                line: 3
+                character: 10
+              end_position:
+                bytes: 42
+                line: 3
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 42
+                          line: 3
+                          character: 11
+                        end_position:
+                          bytes: 43
+                          line: 3
+                          character: 12
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 43
+                            line: 3
+                            character: 12
+                          end_position:
+                            bytes: 44
+                            line: 3
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    DoubleLesserThan:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 44
+                          line: 3
+                          character: 13
+                        end_position:
+                          bytes: 46
+                          line: 3
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: "<~"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 46
+                            line: 3
+                            character: 15
+                          end_position:
+                            bytes: 47
+                            line: 3
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 47
+                          line: 3
+                          character: 16
+                        end_position:
+                          bytes: 48
+                          line: 3
+                          character: 17
+                        token_type:
+                          type: Number
+                          text: "2"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 48
+                            line: 3
+                            character: 17
+                          end_position:
+                            bytes: 49
+                            line: 3
+                            character: 17
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 49
+              line: 4
+              character: 1
+            end_position:
+              bytes: 54
+              line: 4
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 54
+                line: 4
+                character: 6
+              end_position:
+                bytes: 55
+                line: 4
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 55
+                    line: 4
+                    character: 7
+                  end_position:
+                    bytes: 56
+                    line: 4
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: d
+                trailing_trivia:
+                  - start_position:
+                      bytes: 56
+                      line: 4
+                      character: 8
+                    end_position:
+                      bytes: 57
+                      line: 4
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 57
+              line: 4
+              character: 9
+            end_position:
+              bytes: 58
+              line: 4
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 58
+                line: 4
+                character: 10
+              end_position:
+                bytes: 59
+                line: 4
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 59
+                          line: 4
+                          character: 11
+                        end_position:
+                          bytes: 60
+                          line: 4
+                          character: 12
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 60
+                            line: 4
+                            character: 12
+                          end_position:
+                            bytes: 61
+                            line: 4
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    DoubleGreaterThan:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 61
+                          line: 4
+                          character: 13
+                        end_position:
+                          bytes: 63
+                          line: 4
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: ~>
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 63
+                            line: 4
+                            character: 15
+                          end_position:
+                            bytes: 64
+                            line: 4
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 64
+                          line: 4
+                          character: 16
+                        end_position:
+                          bytes: 65
+                          line: 4
+                          character: 17
+                        token_type:
+                          type: Number
+                          text: "2"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 65
+                            line: 4
+                            character: 17
+                          end_position:
+                            bytes: 66
+                            line: 4
+                            character: 17
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 66
+              line: 5
+              character: 1
+            end_position:
+              bytes: 71
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 71
+                line: 5
+                character: 6
+              end_position:
+                bytes: 72
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 72
+                    line: 5
+                    character: 7
+                  end_position:
+                    bytes: 73
+                    line: 5
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: e
+                trailing_trivia:
+                  - start_position:
+                      bytes: 73
+                      line: 5
+                      character: 8
+                    end_position:
+                      bytes: 74
+                      line: 5
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 74
+              line: 5
+              character: 9
+            end_position:
+              bytes: 75
+              line: 5
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 75
+                line: 5
+                character: 10
+              end_position:
+                bytes: 76
+                line: 5
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 76
+                          line: 5
+                          character: 11
+                        end_position:
+                          bytes: 77
+                          line: 5
+                          character: 12
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 77
+                            line: 5
+                            character: 12
+                          end_position:
+                            bytes: 78
+                            line: 5
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    Tilde:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 78
+                          line: 5
+                          character: 13
+                        end_position:
+                          bytes: 79
+                          line: 5
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: "~"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 79
+                            line: 5
+                            character: 14
+                          end_position:
+                            bytes: 80
+                            line: 5
+                            character: 15
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 80
+                          line: 5
+                          character: 15
+                        end_position:
+                          bytes: 81
+                          line: 5
+                          character: 16
+                        token_type:
+                          type: Number
+                          text: "2"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 81
+                            line: 5
+                            character: 16
+                          end_position:
+                            bytes: 82
+                            line: 5
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 82
+              line: 6
+              character: 1
+            end_position:
+              bytes: 87
+              line: 6
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 87
+                line: 6
+                character: 6
+              end_position:
+                bytes: 88
+                line: 6
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 88
+                    line: 6
+                    character: 7
+                  end_position:
+                    bytes: 89
+                    line: 6
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: f
+                trailing_trivia:
+                  - start_position:
+                      bytes: 89
+                      line: 6
+                      character: 8
+                    end_position:
+                      bytes: 90
+                      line: 6
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 90
+              line: 6
+              character: 9
+            end_position:
+              bytes: 91
+              line: 6
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 91
+                line: 6
+                character: 10
+              end_position:
+                bytes: 92
+                line: 6
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 92
+                          line: 6
+                          character: 11
+                        end_position:
+                          bytes: 93
+                          line: 6
+                          character: 12
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 93
+                            line: 6
+                            character: 12
+                          end_position:
+                            bytes: 94
+                            line: 6
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    DoubleSlash:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 94
+                          line: 6
+                          character: 13
+                        end_position:
+                          bytes: 96
+                          line: 6
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: //
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 96
+                            line: 6
+                            character: 15
+                          end_position:
+                            bytes: 97
+                            line: 6
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 97
+                          line: 6
+                          character: 16
+                        end_position:
+                          bytes: 98
+                          line: 6
+                          character: 17
+                        token_type:
+                          type: Number
+                          text: "2"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 98
+                            line: 6
+                            character: 17
+                          end_position:
+                            bytes: 99
+                            line: 6
+                            character: 17
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/source.lua b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/source.lua
new file mode 100644
index 00000000..4d5c6fb9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/source.lua
@@ -0,0 +1,6 @@
+local a = 1 & 2
+local b = 1 | 2
+local c = 1 <~ 2
+local d = 1 ~> 2
+local e = 1 ~ 2
+local f = 1 // 2
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/tokens.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/tokens.snap
new file mode 100644
index 00000000..e998ca31
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/binary-operators/tokens.snap
@@ -0,0 +1,808 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 36
+expression: tokens
+input_file: full-moon/tests/lua53_cases/pass/binary-operators
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "&"
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 1
+  end_position:
+    bytes: 21
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 21
+    line: 2
+    character: 6
+  end_position:
+    bytes: 22
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 7
+  end_position:
+    bytes: 23
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 23
+    line: 2
+    character: 8
+  end_position:
+    bytes: 24
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 2
+    character: 9
+  end_position:
+    bytes: 25
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 25
+    line: 2
+    character: 10
+  end_position:
+    bytes: 26
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 2
+    character: 11
+  end_position:
+    bytes: 27
+    line: 2
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 27
+    line: 2
+    character: 12
+  end_position:
+    bytes: 28
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 28
+    line: 2
+    character: 13
+  end_position:
+    bytes: 29
+    line: 2
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "|"
+- start_position:
+    bytes: 29
+    line: 2
+    character: 14
+  end_position:
+    bytes: 30
+    line: 2
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 30
+    line: 2
+    character: 15
+  end_position:
+    bytes: 31
+    line: 2
+    character: 16
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 31
+    line: 2
+    character: 16
+  end_position:
+    bytes: 32
+    line: 2
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 32
+    line: 3
+    character: 1
+  end_position:
+    bytes: 37
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 37
+    line: 3
+    character: 6
+  end_position:
+    bytes: 38
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 38
+    line: 3
+    character: 7
+  end_position:
+    bytes: 39
+    line: 3
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 39
+    line: 3
+    character: 8
+  end_position:
+    bytes: 40
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 40
+    line: 3
+    character: 9
+  end_position:
+    bytes: 41
+    line: 3
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 41
+    line: 3
+    character: 10
+  end_position:
+    bytes: 42
+    line: 3
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 42
+    line: 3
+    character: 11
+  end_position:
+    bytes: 43
+    line: 3
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 43
+    line: 3
+    character: 12
+  end_position:
+    bytes: 44
+    line: 3
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 44
+    line: 3
+    character: 13
+  end_position:
+    bytes: 46
+    line: 3
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "<~"
+- start_position:
+    bytes: 46
+    line: 3
+    character: 15
+  end_position:
+    bytes: 47
+    line: 3
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 47
+    line: 3
+    character: 16
+  end_position:
+    bytes: 48
+    line: 3
+    character: 17
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 48
+    line: 3
+    character: 17
+  end_position:
+    bytes: 49
+    line: 3
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 49
+    line: 4
+    character: 1
+  end_position:
+    bytes: 54
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 54
+    line: 4
+    character: 6
+  end_position:
+    bytes: 55
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 55
+    line: 4
+    character: 7
+  end_position:
+    bytes: 56
+    line: 4
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: d
+- start_position:
+    bytes: 56
+    line: 4
+    character: 8
+  end_position:
+    bytes: 57
+    line: 4
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 57
+    line: 4
+    character: 9
+  end_position:
+    bytes: 58
+    line: 4
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 58
+    line: 4
+    character: 10
+  end_position:
+    bytes: 59
+    line: 4
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 59
+    line: 4
+    character: 11
+  end_position:
+    bytes: 60
+    line: 4
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 60
+    line: 4
+    character: 12
+  end_position:
+    bytes: 61
+    line: 4
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 61
+    line: 4
+    character: 13
+  end_position:
+    bytes: 63
+    line: 4
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: ~>
+- start_position:
+    bytes: 63
+    line: 4
+    character: 15
+  end_position:
+    bytes: 64
+    line: 4
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 64
+    line: 4
+    character: 16
+  end_position:
+    bytes: 65
+    line: 4
+    character: 17
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 65
+    line: 4
+    character: 17
+  end_position:
+    bytes: 66
+    line: 4
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 66
+    line: 5
+    character: 1
+  end_position:
+    bytes: 71
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 71
+    line: 5
+    character: 6
+  end_position:
+    bytes: 72
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 72
+    line: 5
+    character: 7
+  end_position:
+    bytes: 73
+    line: 5
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: e
+- start_position:
+    bytes: 73
+    line: 5
+    character: 8
+  end_position:
+    bytes: 74
+    line: 5
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 74
+    line: 5
+    character: 9
+  end_position:
+    bytes: 75
+    line: 5
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 75
+    line: 5
+    character: 10
+  end_position:
+    bytes: 76
+    line: 5
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 76
+    line: 5
+    character: 11
+  end_position:
+    bytes: 77
+    line: 5
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 77
+    line: 5
+    character: 12
+  end_position:
+    bytes: 78
+    line: 5
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 78
+    line: 5
+    character: 13
+  end_position:
+    bytes: 79
+    line: 5
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "~"
+- start_position:
+    bytes: 79
+    line: 5
+    character: 14
+  end_position:
+    bytes: 80
+    line: 5
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 80
+    line: 5
+    character: 15
+  end_position:
+    bytes: 81
+    line: 5
+    character: 16
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 81
+    line: 5
+    character: 16
+  end_position:
+    bytes: 82
+    line: 5
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 82
+    line: 6
+    character: 1
+  end_position:
+    bytes: 87
+    line: 6
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 87
+    line: 6
+    character: 6
+  end_position:
+    bytes: 88
+    line: 6
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 88
+    line: 6
+    character: 7
+  end_position:
+    bytes: 89
+    line: 6
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: f
+- start_position:
+    bytes: 89
+    line: 6
+    character: 8
+  end_position:
+    bytes: 90
+    line: 6
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 90
+    line: 6
+    character: 9
+  end_position:
+    bytes: 91
+    line: 6
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 91
+    line: 6
+    character: 10
+  end_position:
+    bytes: 92
+    line: 6
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 92
+    line: 6
+    character: 11
+  end_position:
+    bytes: 93
+    line: 6
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 93
+    line: 6
+    character: 12
+  end_position:
+    bytes: 94
+    line: 6
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 94
+    line: 6
+    character: 13
+  end_position:
+    bytes: 96
+    line: 6
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: //
+- start_position:
+    bytes: 96
+    line: 6
+    character: 15
+  end_position:
+    bytes: 97
+    line: 6
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 97
+    line: 6
+    character: 16
+  end_position:
+    bytes: 98
+    line: 6
+    character: 17
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 98
+    line: 6
+    character: 17
+  end_position:
+    bytes: 99
+    line: 6
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 99
+    line: 7
+    character: 1
+  end_position:
+    bytes: 99
+    line: 7
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/ast.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/ast.snap
new file mode 100644
index 00000000..bffea940
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/ast.snap
@@ -0,0 +1,126 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/lua53_cases/pass/unary-operators
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                UnaryOperator:
+                  unop:
+                    Tilde:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 10
+                          line: 1
+                          character: 11
+                        end_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        token_type:
+                          type: Symbol
+                          symbol: "~"
+                      trailing_trivia: []
+                  expression:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        end_position:
+                          bytes: 12
+                          line: 1
+                          character: 13
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/source.lua b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/source.lua
new file mode 100644
index 00000000..55c2a6c3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/source.lua
@@ -0,0 +1 @@
+local x = ~1
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/tokens.snap b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/tokens.snap
new file mode 100644
index 00000000..cc697e6e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua53_cases/pass/unary-operators/tokens.snap
@@ -0,0 +1,103 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "~"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/ast.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/ast.snap
new file mode 100644
index 00000000..2b426b0b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/ast.snap
@@ -0,0 +1,127 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.ast
+input_file: full-moon/tests/lua54_cases/fail/parser/unclosed-attribute-1
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Identifier
+                      identifier: name
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          attributes:
+            - brackets:
+                tokens:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: "<"
+                    trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 0
+                        line: 1
+                        character: 1
+                      end_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      token_type:
+                        type: Symbol
+                        symbol: ">"
+                    trailing_trivia: []
+              name:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 12
+                    line: 1
+                    character: 13
+                  end_position:
+                    bytes: 17
+                    line: 1
+                    character: 18
+                  token_type:
+                    type: Identifier
+                    identifier: const
+                trailing_trivia: []
+          equal_token: ~
+          expr_list:
+            pairs: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 17
+      line: 1
+      character: 18
+    end_position:
+      bytes: 17
+      line: 1
+      character: 18
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/ast_to_string.snap
new file mode 100644
index 00000000..6dada6e1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/ast_to_string.snap
@@ -0,0 +1,7 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/lua54_cases/fail/parser/unclosed-attribute-1
+---
+local name <const>
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/error.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/error.snap
new file mode 100644
index 00000000..afe5c2f9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/error.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 100
+expression: error
+---
+UnexpectedToken:
+  token:
+    start_position:
+      bytes: 17
+      line: 1
+      character: 18
+    end_position:
+      bytes: 17
+      line: 1
+      character: 18
+    token_type:
+      type: Eof
+  additional: "expected `>`"
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/error_display.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/error_display.snap
new file mode 100644
index 00000000..59128ce5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/error_display.snap
@@ -0,0 +1,12 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/lua54_cases/fail/parser/unclosed-attribute-1
+---
+error[ast]: expected `>` to close attribute
+  ┌─ source.lua:1:18
+  │
+1 │ local name <const
+  │                  ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/errors.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/errors.snap
new file mode 100644
index 00000000..439a596a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/lua54_cases/fail/parser/unclosed-attribute-1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 17
+        line: 1
+        character: 18
+      end_position:
+        bytes: 17
+        line: 1
+        character: 18
+      token_type:
+        type: Eof
+    additional: "expected `>` to close attribute"
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/source.lua b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/source.lua
new file mode 100644
index 00000000..fe2df6e9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/source.lua
@@ -0,0 +1 @@
+local name <const
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/tokens.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/tokens.snap
new file mode 100644
index 00000000..82429fb3
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-1/tokens.snap
@@ -0,0 +1,82 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 94
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: const
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/ast.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/ast.snap
new file mode 100644
index 00000000..bc5e7f75
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/ast.snap
@@ -0,0 +1,179 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.ast
+input_file: full-moon/tests/lua54_cases/fail/parser/unclosed-attribute-2
+---
+nodes:
+  stmts:
+    - - LocalAssignment:
+          local_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                end_position:
+                  bytes: 6
+                  line: 1
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Identifier
+                      identifier: name
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          attributes:
+            - brackets:
+                tokens:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: "<"
+                    trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 0
+                        line: 1
+                        character: 1
+                      end_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      token_type:
+                        type: Symbol
+                        symbol: ">"
+                    trailing_trivia: []
+              name:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 12
+                    line: 1
+                    character: 13
+                  end_position:
+                    bytes: 17
+                    line: 1
+                    character: 18
+                  token_type:
+                    type: Identifier
+                    identifier: const
+                trailing_trivia:
+                  - start_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    end_position:
+                      bytes: 18
+                      line: 1
+                      character: 19
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 18
+                line: 1
+                character: 19
+              end_position:
+                bytes: 19
+                line: 1
+                character: 20
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 19
+                  line: 1
+                  character: 20
+                end_position:
+                  bytes: 20
+                  line: 1
+                  character: 21
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 20
+                        line: 1
+                        character: 21
+                      end_position:
+                        bytes: 22
+                        line: 1
+                        character: 23
+                      token_type:
+                        type: Number
+                        text: "10"
+                    trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 22
+      line: 1
+      character: 23
+    end_position:
+      bytes: 22
+      line: 1
+      character: 23
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/ast_to_string.snap
new file mode 100644
index 00000000..d9442822
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/ast_to_string.snap
@@ -0,0 +1,7 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+input_file: full-moon/tests/lua54_cases/fail/parser/unclosed-attribute-2
+---
+local name <const >= 10
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/error.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/error.snap
new file mode 100644
index 00000000..ce13d547
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/error.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 100
+expression: error
+---
+UnexpectedToken:
+  token:
+    start_position:
+      bytes: 18
+      line: 1
+      character: 19
+    end_position:
+      bytes: 19
+      line: 1
+      character: 20
+    token_type:
+      type: Symbol
+      symbol: "="
+  additional: "expected `>`"
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/error_display.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/error_display.snap
new file mode 100644
index 00000000..b93f53ce
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/error_display.snap
@@ -0,0 +1,12 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: full-moon/tests/lua54_cases/fail/parser/unclosed-attribute-2
+---
+error[ast]: expected `>` to close attribute
+  ┌─ source.lua:1:19
+  │
+1 │ local name <const = 10
+  │                   ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/errors.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/errors.snap
new file mode 100644
index 00000000..da498cb7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/errors.snap
@@ -0,0 +1,20 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+input_file: full-moon/tests/lua54_cases/fail/parser/unclosed-attribute-2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 18
+        line: 1
+        character: 19
+      end_position:
+        bytes: 19
+        line: 1
+        character: 20
+      token_type:
+        type: Symbol
+        symbol: "="
+    additional: "expected `>` to close attribute"
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/source.lua b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/source.lua
new file mode 100644
index 00000000..3213aace
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/source.lua
@@ -0,0 +1 @@
+local name <const = 10
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/tokens.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/tokens.snap
new file mode 100644
index 00000000..e5477525
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/fail/parser/unclosed-attribute-2/tokens.snap
@@ -0,0 +1,126 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 94
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: const
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Number
+    text: "10"
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/ast.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/ast.snap
new file mode 100644
index 00000000..76f53463
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/ast.snap
@@ -0,0 +1,1051 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/lua54_cases/pass/attributes
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: a
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        attributes:
+          - brackets:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    end_position:
+                      bytes: 9
+                      line: 1
+                      character: 10
+                    token_type:
+                      type: Symbol
+                      symbol: "<"
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    end_position:
+                      bytes: 15
+                      line: 1
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: ">"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 17
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                end_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                token_type:
+                  type: Identifier
+                  identifier: const
+              trailing_trivia: []
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 16
+              line: 1
+              character: 17
+            end_position:
+              bytes: 17
+              line: 1
+              character: 18
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 17
+                line: 1
+                character: 18
+              end_position:
+                bytes: 18
+                line: 1
+                character: 19
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 18
+                      line: 1
+                      character: 19
+                    end_position:
+                      bytes: 19
+                      line: 1
+                      character: 20
+                    token_type:
+                      type: Number
+                      text: "5"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 19
+                        line: 1
+                        character: 20
+                      end_position:
+                        bytes: 20
+                        line: 1
+                        character: 20
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 20
+              line: 2
+              character: 1
+            end_position:
+              bytes: 25
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 25
+                line: 2
+                character: 6
+              end_position:
+                bytes: 26
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 26
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 27
+                    line: 2
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: d
+                trailing_trivia:
+                  - start_position:
+                      bytes: 27
+                      line: 2
+                      character: 8
+                    end_position:
+                      bytes: 28
+                      line: 2
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        attributes:
+          - brackets:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 28
+                      line: 2
+                      character: 9
+                    end_position:
+                      bytes: 29
+                      line: 2
+                      character: 10
+                    token_type:
+                      type: Symbol
+                      symbol: "<"
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 34
+                      line: 2
+                      character: 15
+                    end_position:
+                      bytes: 35
+                      line: 2
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: ">"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 35
+                        line: 2
+                        character: 16
+                      end_position:
+                        bytes: 36
+                        line: 2
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 29
+                  line: 2
+                  character: 10
+                end_position:
+                  bytes: 34
+                  line: 2
+                  character: 15
+                token_type:
+                  type: Identifier
+                  identifier: close
+              trailing_trivia: []
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 36
+              line: 3
+              character: 1
+            end_position:
+              bytes: 41
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 41
+                line: 3
+                character: 6
+              end_position:
+                bytes: 42
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 42
+                      line: 3
+                      character: 7
+                    end_position:
+                      bytes: 43
+                      line: 3
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: e
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 43
+                        line: 3
+                        character: 8
+                      end_position:
+                        bytes: 44
+                        line: 3
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 51
+                      line: 3
+                      character: 16
+                    end_position:
+                      bytes: 52
+                      line: 3
+                      character: 17
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 52
+                        line: 3
+                        character: 17
+                      end_position:
+                        bytes: 53
+                        line: 3
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 53
+                    line: 3
+                    character: 18
+                  end_position:
+                    bytes: 54
+                    line: 3
+                    character: 19
+                  token_type:
+                    type: Identifier
+                    identifier: f
+                trailing_trivia:
+                  - start_position:
+                      bytes: 54
+                      line: 3
+                      character: 19
+                    end_position:
+                      bytes: 55
+                      line: 3
+                      character: 20
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        attributes:
+          - brackets:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 44
+                      line: 3
+                      character: 9
+                    end_position:
+                      bytes: 45
+                      line: 3
+                      character: 10
+                    token_type:
+                      type: Symbol
+                      symbol: "<"
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 50
+                      line: 3
+                      character: 15
+                    end_position:
+                      bytes: 51
+                      line: 3
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: ">"
+                  trailing_trivia: []
+            name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 45
+                  line: 3
+                  character: 10
+                end_position:
+                  bytes: 50
+                  line: 3
+                  character: 15
+                token_type:
+                  type: Identifier
+                  identifier: const
+              trailing_trivia: []
+          - brackets:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 55
+                      line: 3
+                      character: 20
+                    end_position:
+                      bytes: 56
+                      line: 3
+                      character: 21
+                    token_type:
+                      type: Symbol
+                      symbol: "<"
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 61
+                      line: 3
+                      character: 26
+                    end_position:
+                      bytes: 62
+                      line: 3
+                      character: 27
+                    token_type:
+                      type: Symbol
+                      symbol: ">"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 62
+                        line: 3
+                        character: 27
+                      end_position:
+                        bytes: 63
+                        line: 3
+                        character: 28
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 56
+                  line: 3
+                  character: 21
+                end_position:
+                  bytes: 61
+                  line: 3
+                  character: 26
+                token_type:
+                  type: Identifier
+                  identifier: close
+              trailing_trivia: []
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 63
+              line: 3
+              character: 28
+            end_position:
+              bytes: 64
+              line: 3
+              character: 29
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 64
+                line: 3
+                character: 29
+              end_position:
+                bytes: 65
+                line: 3
+                character: 30
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - Punctuated:
+                - Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 65
+                        line: 3
+                        character: 30
+                      end_position:
+                        bytes: 66
+                        line: 3
+                        character: 31
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 66
+                      line: 3
+                      character: 31
+                    end_position:
+                      bytes: 67
+                      line: 3
+                      character: 32
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 67
+                        line: 3
+                        character: 32
+                      end_position:
+                        bytes: 68
+                        line: 3
+                        character: 33
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 68
+                      line: 3
+                      character: 33
+                    end_position:
+                      bytes: 69
+                      line: 3
+                      character: 34
+                    token_type:
+                      type: Number
+                      text: "2"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 69
+                        line: 3
+                        character: 34
+                      end_position:
+                        bytes: 70
+                        line: 3
+                        character: 34
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 70
+              line: 4
+              character: 1
+            end_position:
+              bytes: 75
+              line: 4
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 75
+                line: 4
+                character: 6
+              end_position:
+                bytes: 76
+                line: 4
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 76
+                      line: 4
+                      character: 7
+                    end_position:
+                      bytes: 77
+                      line: 4
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: g
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 77
+                        line: 4
+                        character: 8
+                      end_position:
+                        bytes: 78
+                        line: 4
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 85
+                      line: 4
+                      character: 16
+                    end_position:
+                      bytes: 86
+                      line: 4
+                      character: 17
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 86
+                        line: 4
+                        character: 17
+                      end_position:
+                        bytes: 87
+                        line: 4
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 87
+                    line: 4
+                    character: 18
+                  end_position:
+                    bytes: 88
+                    line: 4
+                    character: 19
+                  token_type:
+                    type: Identifier
+                    identifier: h
+                trailing_trivia:
+                  - start_position:
+                      bytes: 88
+                      line: 4
+                      character: 19
+                    end_position:
+                      bytes: 89
+                      line: 4
+                      character: 20
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        attributes:
+          - brackets:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 78
+                      line: 4
+                      character: 9
+                    end_position:
+                      bytes: 79
+                      line: 4
+                      character: 10
+                    token_type:
+                      type: Symbol
+                      symbol: "<"
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 84
+                      line: 4
+                      character: 15
+                    end_position:
+                      bytes: 85
+                      line: 4
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: ">"
+                  trailing_trivia: []
+            name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 79
+                  line: 4
+                  character: 10
+                end_position:
+                  bytes: 84
+                  line: 4
+                  character: 15
+                token_type:
+                  type: Identifier
+                  identifier: const
+              trailing_trivia: []
+          - brackets:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 89
+                      line: 4
+                      character: 20
+                    end_position:
+                      bytes: 90
+                      line: 4
+                      character: 21
+                    token_type:
+                      type: Symbol
+                      symbol: "<"
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 95
+                      line: 4
+                      character: 26
+                    end_position:
+                      bytes: 96
+                      line: 4
+                      character: 27
+                    token_type:
+                      type: Symbol
+                      symbol: ">"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 96
+                        line: 4
+                        character: 27
+                      end_position:
+                        bytes: 97
+                        line: 4
+                        character: 27
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 90
+                  line: 4
+                  character: 21
+                end_position:
+                  bytes: 95
+                  line: 4
+                  character: 26
+                token_type:
+                  type: Identifier
+                  identifier: close
+              trailing_trivia: []
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 97
+              line: 5
+              character: 1
+            end_position:
+              bytes: 102
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 102
+                line: 5
+                character: 6
+              end_position:
+                bytes: 103
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 103
+                      line: 5
+                      character: 7
+                    end_position:
+                      bytes: 104
+                      line: 5
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: i
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 104
+                        line: 5
+                        character: 8
+                      end_position:
+                        bytes: 105
+                        line: 5
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 112
+                      line: 5
+                      character: 16
+                    end_position:
+                      bytes: 113
+                      line: 5
+                      character: 17
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 113
+                        line: 5
+                        character: 17
+                      end_position:
+                        bytes: 114
+                        line: 5
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 114
+                      line: 5
+                      character: 18
+                    end_position:
+                      bytes: 115
+                      line: 5
+                      character: 19
+                    token_type:
+                      type: Identifier
+                      identifier: j
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 115
+                      line: 5
+                      character: 19
+                    end_position:
+                      bytes: 116
+                      line: 5
+                      character: 20
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 116
+                        line: 5
+                        character: 20
+                      end_position:
+                        bytes: 117
+                        line: 5
+                        character: 21
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 117
+                    line: 5
+                    character: 21
+                  end_position:
+                    bytes: 118
+                    line: 5
+                    character: 22
+                  token_type:
+                    type: Identifier
+                    identifier: k
+                trailing_trivia:
+                  - start_position:
+                      bytes: 118
+                      line: 5
+                      character: 22
+                    end_position:
+                      bytes: 119
+                      line: 5
+                      character: 23
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        attributes:
+          - brackets:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 105
+                      line: 5
+                      character: 9
+                    end_position:
+                      bytes: 106
+                      line: 5
+                      character: 10
+                    token_type:
+                      type: Symbol
+                      symbol: "<"
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 111
+                      line: 5
+                      character: 15
+                    end_position:
+                      bytes: 112
+                      line: 5
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: ">"
+                  trailing_trivia: []
+            name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 106
+                  line: 5
+                  character: 10
+                end_position:
+                  bytes: 111
+                  line: 5
+                  character: 15
+                token_type:
+                  type: Identifier
+                  identifier: const
+              trailing_trivia: []
+          - ~
+          - brackets:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 119
+                      line: 5
+                      character: 23
+                    end_position:
+                      bytes: 120
+                      line: 5
+                      character: 24
+                    token_type:
+                      type: Symbol
+                      symbol: "<"
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 125
+                      line: 5
+                      character: 29
+                    end_position:
+                      bytes: 126
+                      line: 5
+                      character: 30
+                    token_type:
+                      type: Symbol
+                      symbol: ">"
+                  trailing_trivia: []
+            name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 120
+                  line: 5
+                  character: 24
+                end_position:
+                  bytes: 125
+                  line: 5
+                  character: 29
+                token_type:
+                  type: Identifier
+                  identifier: close
+              trailing_trivia: []
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/source.lua b/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/source.lua
new file mode 100644
index 00000000..4e1044f9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/source.lua
@@ -0,0 +1,5 @@
+local a <const> = 5
+local d <close>
+local e <const>, f <close> = 1, 2
+local g <const>, h <close>
+local i <const>, j, k <close>
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/tokens.snap b/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/tokens.snap
new file mode 100644
index 00000000..8acf2fa7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/lua54_cases/pass/attributes/tokens.snap
@@ -0,0 +1,829 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: const
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 20
+    line: 2
+    character: 1
+  end_position:
+    bytes: 25
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 25
+    line: 2
+    character: 6
+  end_position:
+    bytes: 26
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 2
+    character: 7
+  end_position:
+    bytes: 27
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: d
+- start_position:
+    bytes: 27
+    line: 2
+    character: 8
+  end_position:
+    bytes: 28
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 28
+    line: 2
+    character: 9
+  end_position:
+    bytes: 29
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 29
+    line: 2
+    character: 10
+  end_position:
+    bytes: 34
+    line: 2
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: close
+- start_position:
+    bytes: 34
+    line: 2
+    character: 15
+  end_position:
+    bytes: 35
+    line: 2
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 35
+    line: 2
+    character: 16
+  end_position:
+    bytes: 36
+    line: 2
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 36
+    line: 3
+    character: 1
+  end_position:
+    bytes: 41
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 41
+    line: 3
+    character: 6
+  end_position:
+    bytes: 42
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 42
+    line: 3
+    character: 7
+  end_position:
+    bytes: 43
+    line: 3
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: e
+- start_position:
+    bytes: 43
+    line: 3
+    character: 8
+  end_position:
+    bytes: 44
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 44
+    line: 3
+    character: 9
+  end_position:
+    bytes: 45
+    line: 3
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 45
+    line: 3
+    character: 10
+  end_position:
+    bytes: 50
+    line: 3
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: const
+- start_position:
+    bytes: 50
+    line: 3
+    character: 15
+  end_position:
+    bytes: 51
+    line: 3
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 51
+    line: 3
+    character: 16
+  end_position:
+    bytes: 52
+    line: 3
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 52
+    line: 3
+    character: 17
+  end_position:
+    bytes: 53
+    line: 3
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 53
+    line: 3
+    character: 18
+  end_position:
+    bytes: 54
+    line: 3
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: f
+- start_position:
+    bytes: 54
+    line: 3
+    character: 19
+  end_position:
+    bytes: 55
+    line: 3
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 55
+    line: 3
+    character: 20
+  end_position:
+    bytes: 56
+    line: 3
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 56
+    line: 3
+    character: 21
+  end_position:
+    bytes: 61
+    line: 3
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: close
+- start_position:
+    bytes: 61
+    line: 3
+    character: 26
+  end_position:
+    bytes: 62
+    line: 3
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 62
+    line: 3
+    character: 27
+  end_position:
+    bytes: 63
+    line: 3
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 63
+    line: 3
+    character: 28
+  end_position:
+    bytes: 64
+    line: 3
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 64
+    line: 3
+    character: 29
+  end_position:
+    bytes: 65
+    line: 3
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 65
+    line: 3
+    character: 30
+  end_position:
+    bytes: 66
+    line: 3
+    character: 31
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 66
+    line: 3
+    character: 31
+  end_position:
+    bytes: 67
+    line: 3
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 67
+    line: 3
+    character: 32
+  end_position:
+    bytes: 68
+    line: 3
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 68
+    line: 3
+    character: 33
+  end_position:
+    bytes: 69
+    line: 3
+    character: 34
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 69
+    line: 3
+    character: 34
+  end_position:
+    bytes: 70
+    line: 3
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 70
+    line: 4
+    character: 1
+  end_position:
+    bytes: 75
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 75
+    line: 4
+    character: 6
+  end_position:
+    bytes: 76
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 76
+    line: 4
+    character: 7
+  end_position:
+    bytes: 77
+    line: 4
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: g
+- start_position:
+    bytes: 77
+    line: 4
+    character: 8
+  end_position:
+    bytes: 78
+    line: 4
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 78
+    line: 4
+    character: 9
+  end_position:
+    bytes: 79
+    line: 4
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 79
+    line: 4
+    character: 10
+  end_position:
+    bytes: 84
+    line: 4
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: const
+- start_position:
+    bytes: 84
+    line: 4
+    character: 15
+  end_position:
+    bytes: 85
+    line: 4
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 85
+    line: 4
+    character: 16
+  end_position:
+    bytes: 86
+    line: 4
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 86
+    line: 4
+    character: 17
+  end_position:
+    bytes: 87
+    line: 4
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 87
+    line: 4
+    character: 18
+  end_position:
+    bytes: 88
+    line: 4
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: h
+- start_position:
+    bytes: 88
+    line: 4
+    character: 19
+  end_position:
+    bytes: 89
+    line: 4
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 89
+    line: 4
+    character: 20
+  end_position:
+    bytes: 90
+    line: 4
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 90
+    line: 4
+    character: 21
+  end_position:
+    bytes: 95
+    line: 4
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: close
+- start_position:
+    bytes: 95
+    line: 4
+    character: 26
+  end_position:
+    bytes: 96
+    line: 4
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 96
+    line: 4
+    character: 27
+  end_position:
+    bytes: 97
+    line: 4
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 97
+    line: 5
+    character: 1
+  end_position:
+    bytes: 102
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 102
+    line: 5
+    character: 6
+  end_position:
+    bytes: 103
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 103
+    line: 5
+    character: 7
+  end_position:
+    bytes: 104
+    line: 5
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: i
+- start_position:
+    bytes: 104
+    line: 5
+    character: 8
+  end_position:
+    bytes: 105
+    line: 5
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 105
+    line: 5
+    character: 9
+  end_position:
+    bytes: 106
+    line: 5
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 106
+    line: 5
+    character: 10
+  end_position:
+    bytes: 111
+    line: 5
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: const
+- start_position:
+    bytes: 111
+    line: 5
+    character: 15
+  end_position:
+    bytes: 112
+    line: 5
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 112
+    line: 5
+    character: 16
+  end_position:
+    bytes: 113
+    line: 5
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 113
+    line: 5
+    character: 17
+  end_position:
+    bytes: 114
+    line: 5
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 114
+    line: 5
+    character: 18
+  end_position:
+    bytes: 115
+    line: 5
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: j
+- start_position:
+    bytes: 115
+    line: 5
+    character: 19
+  end_position:
+    bytes: 116
+    line: 5
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 116
+    line: 5
+    character: 20
+  end_position:
+    bytes: 117
+    line: 5
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 117
+    line: 5
+    character: 21
+  end_position:
+    bytes: 118
+    line: 5
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: k
+- start_position:
+    bytes: 118
+    line: 5
+    character: 22
+  end_position:
+    bytes: 119
+    line: 5
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 119
+    line: 5
+    character: 23
+  end_position:
+    bytes: 120
+    line: 5
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 120
+    line: 5
+    character: 24
+  end_position:
+    bytes: 125
+    line: 5
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: close
+- start_position:
+    bytes: 125
+    line: 5
+    character: 29
+  end_position:
+    bytes: 126
+    line: 5
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 126
+    line: 5
+    character: 30
+  end_position:
+    bytes: 126
+    line: 5
+    character: 30
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/mod.rs b/src/Rust/vvs_parser/src/tests/mod.rs
new file mode 100644
index 00000000..2a2f35e8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/mod.rs
@@ -0,0 +1,8 @@
+mod comments_around_functions;
+mod common;
+mod derive_node;
+mod fail_cases;
+mod node;
+mod one_line_range;
+mod pass_cases;
+mod visitors;
diff --git a/src/Rust/vvs_parser/src/tests/node.rs b/src/Rust/vvs_parser/src/tests/node.rs
new file mode 100644
index 00000000..35651ccc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/node.rs
@@ -0,0 +1,38 @@
+use crate::{node::Node, prelude::parser::parse_lua_tree as parse};
+
+#[test]
+fn surrounding_trivia() {
+    let ast = parse(include_str!("cases/pass/local-assignment-5/source.lua")).unwrap();
+    let stmt = ast.nodes().stmts().nth(1);
+
+    let (prev, _) = stmt.surrounding_trivia();
+
+    let mut prev = prev.into_iter();
+    assert_eq!(prev.next().unwrap().to_string(), "-- Then a comment");
+    assert_eq!(prev.next().unwrap().to_string(), "\n");
+    assert_eq!(prev.next(), None);
+}
+
+#[test]
+fn test_similar() {
+    let ast = parse("local x = 1; --[[ uh oh, filler ]] local x = 1; local x = 2;").unwrap();
+    let stmts = ast.nodes().stmts().collect::<Vec<_>>();
+
+    assert!(stmts[0].similar(stmts[1]));
+    assert!(stmts[1].similar(stmts[0]));
+    assert!(!stmts[0].similar(stmts[2]));
+}
+
+#[test]
+fn test_tokens_collect() {
+    let source = parse("local abcd = 1").unwrap();
+    let tokens = source.nodes().tokens();
+    assert_eq!(tokens.count(), 4);
+}
+
+#[test]
+fn test_tokens_back() {
+    let source = parse("local abcd = 1").unwrap();
+    let mut tokens = source.nodes().tokens();
+    assert_eq!(tokens.next_back().unwrap().to_string(), "1");
+}
diff --git a/src/Rust/vvs_parser/src/tests/one_line_range.rs b/src/Rust/vvs_parser/src/tests/one_line_range.rs
new file mode 100644
index 00000000..55342289
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/one_line_range.rs
@@ -0,0 +1,26 @@
+use crate::{node::Node, prelude::parser::parse_lua_tree as parse};
+
+#[test]
+fn test_one_line_range() {
+    let ast = parse(
+        r#"
+
+	local x = 1
+
+	local y = 1
+
+	local function x() print(1) end
+
+	function x() print(1) end
+
+	for index, value in pairs(list) do print(index, value) end
+
+	"#,
+    )
+    .unwrap();
+
+    for stmt in ast.nodes().stmts() {
+        let (start, end) = stmt.range().unwrap();
+        assert_eq!(end.line() - start.line(), 0, "node {stmt:?} does not have a range on the same line");
+    }
+}
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/error_display.snap b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/error_display.snap
new file mode 100644
index 00000000..a1f2e073
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/error_display.snap
@@ -0,0 +1,10 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/option_cases/fail/parser/keyword1
+---
+error[ast]: expected the name of an option
+  ┌─ source.ini:2:1
+  │
+2 │ option = 1
+  │ ^^^^^^
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/errors.snap b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/errors.snap
new file mode 100644
index 00000000..3d699fbc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/errors.snap
@@ -0,0 +1,19 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.errors()
+input_file: vvs_parser/tests/option_cases/fail/parser/keyword1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 2
+        character: 1
+      end_position:
+        bytes: 15
+        line: 2
+        character: 7
+      token_type:
+        type: Symbol
+        symbol: option
+    additional: expected the name of an option
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/option_table.snap b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/option_table.snap
new file mode 100644
index 00000000..32091d52
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/option_table.snap
@@ -0,0 +1,6 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.option_table()
+input_file: vvs_parser/tests/option_cases/fail/parser/keyword1
+---
+modules: []
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/source.ini b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/source.ini
new file mode 100644
index 00000000..c0348e2f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/source.ini
@@ -0,0 +1,2 @@
+[module]
+option = 1
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/tokens.snap b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/tokens.snap
new file mode 100644
index 00000000..2098a535
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword1/tokens.snap
@@ -0,0 +1,125 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/option_cases/fail/parser/keyword1
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: module
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 15
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: option
+- start_position:
+    bytes: 15
+    line: 2
+    character: 7
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 2
+    character: 8
+  end_position:
+    bytes: 17
+    line: 2
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 17
+    line: 2
+    character: 9
+  end_position:
+    bytes: 18
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 2
+    character: 10
+  end_position:
+    bytes: 19
+    line: 2
+    character: 11
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 19
+    line: 2
+    character: 11
+  end_position:
+    bytes: 20
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 20
+    line: 3
+    character: 1
+  end_position:
+    bytes: 20
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/error_display.snap b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/error_display.snap
new file mode 100644
index 00000000..5dcc37a4
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/error_display.snap
@@ -0,0 +1,16 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/option_cases/fail/parser/keyword2
+---
+error[ast]: expected an identifier
+  ┌─ source.ini:1:2
+  │
+1 │ [option]
+  │  ^^^^^^
+
+error[ast]: expected an identifier as the option section name
+  ┌─ source.ini:1:1
+  │
+1 │ [option]
+  │ ^
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/errors.snap b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/errors.snap
new file mode 100644
index 00000000..c45dd138
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/errors.snap
@@ -0,0 +1,33 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.errors()
+input_file: vvs_parser/tests/option_cases/fail/parser/keyword2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 1
+        line: 1
+        character: 2
+      end_position:
+        bytes: 7
+        line: 1
+        character: 8
+      token_type:
+        type: Symbol
+        symbol: option
+    additional: expected an identifier
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 1
+        line: 1
+        character: 2
+      token_type:
+        type: Symbol
+        symbol: "["
+    additional: expected an identifier as the option section name
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/option_table.snap b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/option_table.snap
new file mode 100644
index 00000000..14a4c768
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/option_table.snap
@@ -0,0 +1,6 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.option_table()
+input_file: vvs_parser/tests/option_cases/fail/parser/keyword2
+---
+modules: []
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/source.ini b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/source.ini
new file mode 100644
index 00000000..dec450e7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/source.ini
@@ -0,0 +1,2 @@
+[option]
+opt1 = 1
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/tokens.snap b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/tokens.snap
new file mode 100644
index 00000000..c553ebbb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/fail/parser/keyword2/tokens.snap
@@ -0,0 +1,125 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/option_cases/fail/parser/keyword2
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: option
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 13
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: opt1
+- start_position:
+    bytes: 13
+    line: 2
+    character: 5
+  end_position:
+    bytes: 14
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 2
+    character: 6
+  end_position:
+    bytes: 15
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 15
+    line: 2
+    character: 7
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 2
+    character: 8
+  end_position:
+    bytes: 17
+    line: 2
+    character: 9
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 17
+    line: 2
+    character: 9
+  end_position:
+    bytes: 18
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 18
+    line: 3
+    character: 1
+  end_position:
+    bytes: 18
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/options.snap b/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/options.snap
new file mode 100644
index 00000000..ddd63fa8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/options.snap
@@ -0,0 +1,90 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: options
+input_file: vvs_parser/tests/option_cases/pass/complex
+---
+modules:
+  - - module
+    - - - option1
+        - BinaryOperator:
+            lhs:
+              Number:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 19
+                    line: 2
+                    character: 11
+                  end_position:
+                    bytes: 20
+                    line: 2
+                    character: 12
+                  token_type:
+                    type: Number
+                    text: "1"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 20
+                      line: 2
+                      character: 12
+                    end_position:
+                      bytes: 21
+                      line: 2
+                      character: 13
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+            binop:
+              Plus:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 21
+                    line: 2
+                    character: 13
+                  end_position:
+                    bytes: 22
+                    line: 2
+                    character: 14
+                  token_type:
+                    type: Symbol
+                    symbol: +
+                trailing_trivia:
+                  - start_position:
+                      bytes: 22
+                      line: 2
+                      character: 14
+                    end_position:
+                      bytes: 23
+                      line: 2
+                      character: 15
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+            rhs:
+              Number:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 23
+                    line: 2
+                    character: 15
+                  end_position:
+                    bytes: 24
+                    line: 2
+                    character: 16
+                  token_type:
+                    type: Number
+                    text: "1"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 24
+                      line: 2
+                      character: 16
+                    end_position:
+                      bytes: 25
+                      line: 2
+                      character: 16
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/source.ini b/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/source.ini
new file mode 100644
index 00000000..188259f9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/source.ini
@@ -0,0 +1,2 @@
+[module]
+option1 = 1 + 1
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/tokens.snap b/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/tokens.snap
new file mode 100644
index 00000000..85e179ff
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/pass/complex/tokens.snap
@@ -0,0 +1,169 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/option_cases/pass/complex
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: module
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 16
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: option1
+- start_position:
+    bytes: 16
+    line: 2
+    character: 8
+  end_position:
+    bytes: 17
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 2
+    character: 9
+  end_position:
+    bytes: 18
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 18
+    line: 2
+    character: 10
+  end_position:
+    bytes: 19
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 11
+  end_position:
+    bytes: 20
+    line: 2
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 20
+    line: 2
+    character: 12
+  end_position:
+    bytes: 21
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 21
+    line: 2
+    character: 13
+  end_position:
+    bytes: 22
+    line: 2
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 22
+    line: 2
+    character: 14
+  end_position:
+    bytes: 23
+    line: 2
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 23
+    line: 2
+    character: 15
+  end_position:
+    bytes: 24
+    line: 2
+    character: 16
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 24
+    line: 2
+    character: 16
+  end_position:
+    bytes: 25
+    line: 2
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 25
+    line: 3
+    character: 1
+  end_position:
+    bytes: 25
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/empty/options.snap b/src/Rust/vvs_parser/src/tests/option_cases/pass/empty/options.snap
new file mode 100644
index 00000000..17560f81
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/pass/empty/options.snap
@@ -0,0 +1,6 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: options
+input_file: vvs_parser/tests/option_cases/pass/empty
+---
+modules: []
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/empty/source.ini b/src/Rust/vvs_parser/src/tests/option_cases/pass/empty/source.ini
new file mode 100644
index 00000000..e69de29b
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/empty/tokens.snap b/src/Rust/vvs_parser/src/tests/option_cases/pass/empty/tokens.snap
new file mode 100644
index 00000000..42aa5619
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/pass/empty/tokens.snap
@@ -0,0 +1,15 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/option_cases/pass/empty
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 0
+    line: 1
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/options.snap b/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/options.snap
new file mode 100644
index 00000000..ccd02baa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/options.snap
@@ -0,0 +1,90 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: options
+input_file: vvs_parser/tests/option_cases/pass/simple
+---
+modules:
+  - - module1
+    - - - opt1
+        - Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 17
+                line: 2
+                character: 8
+              end_position:
+                bytes: 18
+                line: 2
+                character: 9
+              token_type:
+                type: Number
+                text: "1"
+            trailing_trivia:
+              - start_position:
+                  bytes: 18
+                  line: 2
+                  character: 9
+                end_position:
+                  bytes: 19
+                  line: 2
+                  character: 9
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+      - - opt2
+        - Symbol:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 26
+                line: 3
+                character: 8
+              end_position:
+                bytes: 30
+                line: 3
+                character: 12
+              token_type:
+                type: Symbol
+                symbol: "true"
+            trailing_trivia:
+              - start_position:
+                  bytes: 30
+                  line: 3
+                  character: 12
+                end_position:
+                  bytes: 31
+                  line: 3
+                  character: 12
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+  - - module2
+    - - - opt1
+        - String:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 49
+                line: 6
+                character: 8
+              end_position:
+                bytes: 60
+                line: 6
+                character: 19
+              token_type:
+                type: StringLiteral
+                literal: something
+                quote_type: Double
+            trailing_trivia:
+              - start_position:
+                  bytes: 60
+                  line: 6
+                  character: 19
+                end_position:
+                  bytes: 61
+                  line: 6
+                  character: 19
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/source.ini b/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/source.ini
new file mode 100644
index 00000000..1950245e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/source.ini
@@ -0,0 +1,6 @@
+[module1]
+opt1 = 1
+opt2 = true
+
+[module2]
+opt1 = "something"
diff --git a/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/tokens.snap b/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/tokens.snap
new file mode 100644
index 00000000..46a45bb6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/option_cases/pass/simple/tokens.snap
@@ -0,0 +1,313 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/option_cases/pass/simple
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 1
+    line: 1
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 1
+    line: 1
+    character: 2
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: module1
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 14
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: opt1
+- start_position:
+    bytes: 14
+    line: 2
+    character: 5
+  end_position:
+    bytes: 15
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 2
+    character: 6
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 17
+    line: 2
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 2
+    character: 8
+  end_position:
+    bytes: 18
+    line: 2
+    character: 9
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 18
+    line: 2
+    character: 9
+  end_position:
+    bytes: 19
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 3
+    character: 1
+  end_position:
+    bytes: 23
+    line: 3
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: opt2
+- start_position:
+    bytes: 23
+    line: 3
+    character: 5
+  end_position:
+    bytes: 24
+    line: 3
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 3
+    character: 6
+  end_position:
+    bytes: 25
+    line: 3
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 25
+    line: 3
+    character: 7
+  end_position:
+    bytes: 26
+    line: 3
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 3
+    character: 8
+  end_position:
+    bytes: 30
+    line: 3
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 30
+    line: 3
+    character: 12
+  end_position:
+    bytes: 31
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 31
+    line: 4
+    character: 1
+  end_position:
+    bytes: 32
+    line: 4
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 32
+    line: 5
+    character: 1
+  end_position:
+    bytes: 33
+    line: 5
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 33
+    line: 5
+    character: 2
+  end_position:
+    bytes: 40
+    line: 5
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: module2
+- start_position:
+    bytes: 40
+    line: 5
+    character: 9
+  end_position:
+    bytes: 41
+    line: 5
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 41
+    line: 5
+    character: 10
+  end_position:
+    bytes: 42
+    line: 5
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 42
+    line: 6
+    character: 1
+  end_position:
+    bytes: 46
+    line: 6
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: opt1
+- start_position:
+    bytes: 46
+    line: 6
+    character: 5
+  end_position:
+    bytes: 47
+    line: 6
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 47
+    line: 6
+    character: 6
+  end_position:
+    bytes: 48
+    line: 6
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 48
+    line: 6
+    character: 7
+  end_position:
+    bytes: 49
+    line: 6
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 49
+    line: 6
+    character: 8
+  end_position:
+    bytes: 60
+    line: 6
+    character: 19
+  token_type:
+    type: StringLiteral
+    literal: something
+    quote_type: Double
+- start_position:
+    bytes: 60
+    line: 6
+    character: 19
+  end_position:
+    bytes: 61
+    line: 6
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 61
+    line: 7
+    character: 1
+  end_position:
+    bytes: 61
+    line: 7
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/pass_cases.rs b/src/Rust/vvs_parser/src/tests/pass_cases.rs
new file mode 100644
index 00000000..115b7d77
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/pass_cases.rs
@@ -0,0 +1,87 @@
+use crate::{
+    ast::AstResult,
+    node::Node,
+    tests::common::run_test_folder,
+    tokenizer::{self, Token, TokenReference},
+};
+use insta::assert_yaml_snapshot;
+use std::{fmt, fs, path::Path};
+
+#[derive(PartialEq, Eq)]
+struct PrettyString<'a>(pub &'a str);
+
+// Make diff to display string as multi-line string
+impl<'a> fmt::Debug for PrettyString<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(self.0)
+    }
+}
+
+fn unpack_token_reference(token: &TokenReference) -> Vec<Token> {
+    token
+        .leading_trivia()
+        .chain(std::iter::once(token.token()))
+        .chain(token.trailing_trivia())
+        .cloned()
+        .collect()
+}
+
+fn test_option_case(path: &Path) {
+    let source = fs::read_to_string(path.join("source.ini")).expect("couldn't read source.ini");
+    let tokens = tokenizer::Lexer::new(&source).collect().unwrap();
+    assert_yaml_snapshot!("tokens", tokens);
+
+    let options = crate::ast::OptionTableResult::parse_fallible(&source)
+        .into_result()
+        .unwrap_or_else(|error| panic!("couldn't make option table for {path:?} - {error:#?}"));
+
+    assert_yaml_snapshot!("options", options);
+}
+
+fn test_pass_case(path: &Path) {
+    let source = fs::read_to_string(path.join("source.lua")).expect("couldn't read source.lua");
+    let tokens = tokenizer::Lexer::new(&source).collect().unwrap();
+    assert_yaml_snapshot!("tokens", tokens);
+
+    let ast = AstResult::parse_fallible(&source)
+        .into_result()
+        .unwrap_or_else(|error| panic!("couldn't make ast for {path:?} - {error:#?}"));
+
+    let old_positions: Vec<_> = ast.tokens().flat_map(unpack_token_reference).collect();
+
+    assert_yaml_snapshot!("ast", ast.nodes());
+    assert_eq!(PrettyString(&format!("{ast}")), PrettyString(&source));
+
+    let ast = ast.update_positions();
+    assert_eq!(old_positions, ast.tokens().flat_map(unpack_token_reference).collect::<Vec<_>>(),);
+}
+
+#[test]
+fn test_roblox_pass_cases() {
+    run_test_folder("./src/tests/roblox_cases/pass", test_pass_case);
+}
+
+#[test]
+fn test_lua52_pass_cases() {
+    run_test_folder("./src/tests/lua52_cases/pass", test_pass_case);
+}
+
+#[test]
+fn test_lua53_pass_cases() {
+    run_test_folder("./src/tests/lua53_cases/pass", test_pass_case);
+}
+
+#[test]
+fn test_lua54_pass_cases() {
+    run_test_folder("./src/tests/lua54_cases/pass", test_pass_case);
+}
+
+#[test]
+fn test_vivy_pass_cases() {
+    run_test_folder("./src/tests/vivy_cases/pass", test_pass_case);
+}
+
+#[test]
+fn test_option_pass_cases() {
+    run_test_folder("./src/tests/option_cases/pass", test_option_case);
+}
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/ast.snap
new file mode 100644
index 00000000..9ea7d346
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/ast.snap
@@ -0,0 +1,254 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.ast()
+input_file: vvs_parser/tests/roblox_cases/fail/parser/function_return_type_thin_arrow
+---
+nodes:
+  stmts:
+    - - FunctionDeclaration:
+          function_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 8
+                line: 1
+                character: 9
+              token_type:
+                type: Symbol
+                symbol: function
+            trailing_trivia:
+              - start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name:
+            names:
+              pairs:
+                - End:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 9
+                        line: 1
+                        character: 10
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      token_type:
+                        type: Identifier
+                        identifier: foo
+                    trailing_trivia: []
+            colon_name: ~
+          body:
+            parameters_parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    end_position:
+                      bytes: 13
+                      line: 1
+                      character: 14
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 13
+                      line: 1
+                      character: 14
+                    end_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 14
+                        line: 1
+                        character: 15
+                      end_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            parameters:
+              pairs: []
+            type_specifiers: []
+            return_type:
+              punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 15
+                    line: 1
+                    character: 16
+                  end_position:
+                    bytes: 17
+                    line: 1
+                    character: 18
+                  token_type:
+                    type: Symbol
+                    symbol: "->"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    end_position:
+                      bytes: 18
+                      line: 1
+                      character: 19
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Basic:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 18
+                      line: 1
+                      character: 19
+                    end_position:
+                      bytes: 24
+                      line: 1
+                      character: 25
+                    token_type:
+                      type: Identifier
+                      identifier: string
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 24
+                        line: 1
+                        character: 25
+                      end_position:
+                        bytes: 25
+                        line: 1
+                        character: 25
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            block:
+              stmts: []
+              last_stmt:
+                - Return:
+                    token:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 25
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 26
+                            line: 2
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 26
+                          line: 2
+                          character: 2
+                        end_position:
+                          bytes: 32
+                          line: 2
+                          character: 8
+                        token_type:
+                          type: Symbol
+                          symbol: return
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 32
+                            line: 2
+                            character: 8
+                          end_position:
+                            bytes: 33
+                            line: 2
+                            character: 9
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    returns:
+                      pairs:
+                        - End:
+                            String:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 33
+                                  line: 2
+                                  character: 9
+                                end_position:
+                                  bytes: 35
+                                  line: 2
+                                  character: 11
+                                token_type:
+                                  type: StringLiteral
+                                  literal: ""
+                                  quote_type: Double
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 35
+                                    line: 2
+                                    character: 11
+                                  end_position:
+                                    bytes: 36
+                                    line: 2
+                                    character: 11
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                - ~
+            end_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 36
+                  line: 3
+                  character: 1
+                end_position:
+                  bytes: 39
+                  line: 3
+                  character: 4
+                token_type:
+                  type: Symbol
+                  symbol: end
+              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 39
+      line: 3
+      character: 4
+    end_position:
+      bytes: 39
+      line: 3
+      character: 4
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/ast_to_string.snap
new file mode 100644
index 00000000..0f74fc9b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/ast_to_string.snap
@@ -0,0 +1,6 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+---
+"function foo() -> string\n\treturn \"\"\nend"
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/error_display.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/error_display.snap
new file mode 100644
index 00000000..875e2441
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/error_display.snap
@@ -0,0 +1,11 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+---
+error[ast]: function return type annotations should use `:` instead of `->`
+  ┌─ source.lua:1:16
+  │
+1 │ function foo() -> string
+  │                ^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/errors.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/errors.snap
new file mode 100644
index 00000000..6e7cbe65
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 15
+        line: 1
+        character: 16
+      end_position:
+        bytes: 17
+        line: 1
+        character: 18
+      token_type:
+        type: Symbol
+        symbol: "->"
+    additional: "function return type annotations should use `:` instead of `->`"
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/source.lua
new file mode 100644
index 00000000..165392c0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/source.lua
@@ -0,0 +1,3 @@
+function foo() -> string
+	return ""
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/tokens.snap
new file mode 100644
index 00000000..8c807bd8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/function_return_type_thin_arrow/tokens.snap
@@ -0,0 +1,192 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 25
+    line: 2
+    character: 1
+  end_position:
+    bytes: 26
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 26
+    line: 2
+    character: 2
+  end_position:
+    bytes: 32
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 32
+    line: 2
+    character: 8
+  end_position:
+    bytes: 33
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 33
+    line: 2
+    character: 9
+  end_position:
+    bytes: 35
+    line: 2
+    character: 11
+  token_type:
+    type: StringLiteral
+    literal: ""
+    quote_type: Double
+- start_position:
+    bytes: 35
+    line: 2
+    character: 11
+  end_position:
+    bytes: 36
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 36
+    line: 3
+    character: 1
+  end_position:
+    bytes: 39
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 39
+    line: 3
+    character: 4
+  end_position:
+    bytes: 39
+    line: 3
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/ast.snap
new file mode 100644
index 00000000..cbaa915d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/ast.snap
@@ -0,0 +1,21 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.ast
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 26
+      line: 1
+      character: 27
+    end_position:
+      bytes: 26
+      line: 1
+      character: 27
+    token_type:
+      type: Eof
+  trailing_trivia: []
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/ast_to_string.snap
new file mode 100644
index 00000000..769004af
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/ast_to_string.snap
@@ -0,0 +1,6 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+---
+""
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/error.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/error.snap
new file mode 100644
index 00000000..764e5601
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/error.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: error
+
+---
+UnexpectedToken:
+  token:
+    start_position:
+      bytes: 26
+      line: 1
+      character: 27
+    end_position:
+      bytes: 26
+      line: 1
+      character: 27
+    token_type:
+      type: Eof
+  additional: "expected `->` after `()` when parsing function type"
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/error_display.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/error_display.snap
new file mode 100644
index 00000000..9179dfeb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/error_display.snap
@@ -0,0 +1,11 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+---
+error[ast]: expected `->` after `()` for function type
+  ┌─ source.lua:1:27
+  │
+1 │ type Foo = (count: number)
+  │                           ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/errors.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/errors.snap
new file mode 100644
index 00000000..ff46da5c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/errors.snap
@@ -0,0 +1,18 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 26
+        line: 1
+        character: 27
+      end_position:
+        bytes: 26
+        line: 1
+        character: 27
+      token_type:
+        type: Eof
+    additional: "expected `->` after `()` for function type"
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/source.lua
new file mode 100644
index 00000000..648860cc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/source.lua
@@ -0,0 +1 @@
+type Foo = (count: number)
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/tokens.snap
new file mode 100644
index 00000000..7e27690a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/named_function_arg_types/tokens.snap
@@ -0,0 +1,148 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: Foo
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: count
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/ast.snap
new file mode 100644
index 00000000..776ede7b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/ast.snap
@@ -0,0 +1,117 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.ast()
+input_file: vvs_parser/tests/roblox_cases/fail/parser/nil_dot
+---
+nodes:
+  stmts:
+    - - TypeDeclaration:
+          type_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: type
+            trailing_trivia:
+              - start_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                end_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          base:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 8
+                line: 1
+                character: 9
+              token_type:
+                type: Identifier
+                identifier: Foo
+            trailing_trivia:
+              - start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                end_position:
+                  bytes: 11
+                  line: 1
+                  character: 12
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          declare_as:
+            Basic:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 11
+                  line: 1
+                  character: 12
+                end_position:
+                  bytes: 14
+                  line: 1
+                  character: 15
+                token_type:
+                  type: Symbol
+                  symbol: nil
+              trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 27
+      line: 2
+      character: 1
+    end_position:
+      bytes: 27
+      line: 2
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/ast_to_string.snap
new file mode 100644
index 00000000..0123dfe5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/ast_to_string.snap
@@ -0,0 +1,6 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+---
+type Foo = nil
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/error.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/error.snap
new file mode 100644
index 00000000..70ed0b8b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/error.snap
@@ -0,0 +1,22 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 58
+expression: error
+input_file: full-moon/tests/roblox_cases/fail/parser/nil_dot
+
+---
+UnexpectedToken:
+  token:
+    start_position:
+      bytes: 14
+      line: 1
+      character: 15
+    end_position:
+      bytes: 15
+      line: 1
+      character: 16
+    token_type:
+      type: Symbol
+      symbol: "."
+  additional: leftover token
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/error_display.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/error_display.snap
new file mode 100644
index 00000000..0e6b920e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/error_display.snap
@@ -0,0 +1,35 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+---
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:15
+  │
+1 │ type Foo = nil.bar<string>
+  │               ^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:19
+  │
+1 │ type Foo = nil.bar<string>
+  │                   ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:19
+  │
+1 │ type Foo = nil.bar<string>
+  │                   ^
+
+error[ast]: unexpected expression when looking for a statement
+  ┌─ source.lua:1:26
+  │
+1 │ type Foo = nil.bar<string>
+  │                          ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:26
+  │
+1 │ type Foo = nil.bar<string>
+  │                          ^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/errors.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/errors.snap
new file mode 100644
index 00000000..47554f28
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/errors.snap
@@ -0,0 +1,75 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 14
+        line: 1
+        character: 15
+      end_position:
+        bytes: 15
+        line: 1
+        character: 16
+      token_type:
+        type: Symbol
+        symbol: "."
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 18
+        line: 1
+        character: 19
+      end_position:
+        bytes: 19
+        line: 1
+        character: 20
+      token_type:
+        type: Symbol
+        symbol: "<"
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 18
+        line: 1
+        character: 19
+      end_position:
+        bytes: 19
+        line: 1
+        character: 20
+      token_type:
+        type: Symbol
+        symbol: "<"
+    additional: "unexpected token, this needs to be a statement"
+- AstError:
+    token:
+      start_position:
+        bytes: 25
+        line: 1
+        character: 26
+      end_position:
+        bytes: 26
+        line: 1
+        character: 27
+      token_type:
+        type: Symbol
+        symbol: ">"
+    additional: unexpected expression when looking for a statement
+- AstError:
+    token:
+      start_position:
+        bytes: 25
+        line: 1
+        character: 26
+      end_position:
+        bytes: 26
+        line: 1
+        character: 27
+      token_type:
+        type: Symbol
+        symbol: ">"
+    additional: "unexpected token, this needs to be a statement"
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/source.lua
new file mode 100644
index 00000000..488795ab
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/source.lua
@@ -0,0 +1 @@
+type Foo = nil.bar<string>
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/tokens.snap
new file mode 100644
index 00000000..dd8c8779
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/nil_dot/tokens.snap
@@ -0,0 +1,161 @@
+---
+source: full-moon/tests/fail_cases.rs
+assertion_line: 52
+expression: tokens
+input_file: full-moon/tests/roblox_cases/fail/parser/nil_dot
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: Foo
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: nil
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: "<"
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: ">"
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 27
+    line: 1
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 27
+    line: 2
+    character: 1
+  end_position:
+    bytes: 27
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/ast.snap
new file mode 100644
index 00000000..ee6423cd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/ast.snap
@@ -0,0 +1,411 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.ast()
+input_file: vvs_parser/tests/roblox_cases/fail/parser/type_table_no_right_brace
+---
+nodes:
+  stmts:
+    - - TypeDeclaration:
+          type_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: type
+            trailing_trivia:
+              - start_position:
+                  bytes: 4
+                  line: 1
+                  character: 5
+                end_position:
+                  bytes: 5
+                  line: 1
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          base:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 8
+                line: 1
+                character: 9
+              token_type:
+                type: Identifier
+                identifier: Foo
+            trailing_trivia:
+              - start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 10
+                  line: 1
+                  character: 11
+                end_position:
+                  bytes: 11
+                  line: 1
+                  character: 12
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          declare_as:
+            Table:
+              braces:
+                tokens:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: "{"
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 12
+                          line: 1
+                          character: 13
+                        end_position:
+                          bytes: 13
+                          line: 1
+                          character: 14
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 0
+                        line: 1
+                        character: 1
+                      end_position:
+                        bytes: 1
+                        line: 1
+                        character: 2
+                      token_type:
+                        type: Symbol
+                        symbol: "}"
+                    trailing_trivia: []
+              fields:
+                pairs:
+                  - Punctuated:
+                      - key:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 13
+                                line: 1
+                                character: 14
+                              end_position:
+                                bytes: 14
+                                line: 1
+                                character: 15
+                              token_type:
+                                type: Identifier
+                                identifier: x
+                            trailing_trivia: []
+                        colon:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 14
+                              line: 1
+                              character: 15
+                            end_position:
+                              bytes: 15
+                              line: 1
+                              character: 16
+                            token_type:
+                              type: Symbol
+                              symbol: ":"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 15
+                                line: 1
+                                character: 16
+                              end_position:
+                                bytes: 16
+                                line: 1
+                                character: 17
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                        value:
+                          Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 16
+                                line: 1
+                                character: 17
+                              end_position:
+                                bytes: 22
+                                line: 1
+                                character: 23
+                              token_type:
+                                type: Identifier
+                                identifier: string
+                            trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 22
+                            line: 1
+                            character: 23
+                          end_position:
+                            bytes: 23
+                            line: 1
+                            character: 24
+                          token_type:
+                            type: Symbol
+                            symbol: ","
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 23
+                              line: 1
+                              character: 24
+                            end_position:
+                              bytes: 24
+                              line: 1
+                              character: 25
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  - End:
+                      key:
+                        Name:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 24
+                              line: 1
+                              character: 25
+                            end_position:
+                              bytes: 25
+                              line: 1
+                              character: 26
+                            token_type:
+                              type: Identifier
+                              identifier: y
+                          trailing_trivia: []
+                      colon:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 25
+                            line: 1
+                            character: 26
+                          end_position:
+                            bytes: 26
+                            line: 1
+                            character: 27
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 26
+                              line: 1
+                              character: 27
+                            end_position:
+                              bytes: 27
+                              line: 1
+                              character: 28
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      value:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 27
+                              line: 1
+                              character: 28
+                            end_position:
+                              bytes: 33
+                              line: 1
+                              character: 34
+                            token_type:
+                              type: Identifier
+                              identifier: string
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 33
+                                line: 1
+                                character: 34
+                              end_position:
+                                bytes: 34
+                                line: 1
+                                character: 34
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+      - ~
+    - - LocalAssignment:
+          local_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 34
+                  line: 2
+                  character: 1
+                end_position:
+                  bytes: 35
+                  line: 2
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 35
+                line: 3
+                character: 1
+              end_position:
+                bytes: 40
+                line: 3
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: local
+            trailing_trivia:
+              - start_position:
+                  bytes: 40
+                  line: 3
+                  character: 6
+                end_position:
+                  bytes: 41
+                  line: 3
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          name_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 41
+                      line: 3
+                      character: 7
+                    end_position:
+                      bytes: 42
+                      line: 3
+                      character: 8
+                    token_type:
+                      type: Identifier
+                      identifier: x
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 42
+                        line: 3
+                        character: 8
+                      end_position:
+                        bytes: 43
+                        line: 3
+                        character: 9
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 43
+                line: 3
+                character: 9
+              end_position:
+                bytes: 44
+                line: 3
+                character: 10
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 44
+                  line: 3
+                  character: 10
+                end_position:
+                  bytes: 45
+                  line: 3
+                  character: 11
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 45
+                        line: 3
+                        character: 11
+                      end_position:
+                        bytes: 46
+                        line: 3
+                        character: 12
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia: []
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 46
+      line: 3
+      character: 12
+    end_position:
+      bytes: 46
+      line: 3
+      character: 12
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/ast_to_string.snap
new file mode 100644
index 00000000..f7244cce
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/ast_to_string.snap
@@ -0,0 +1,6 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+---
+"type Foo = { x: string, y: string\n}\nlocal x = 1"
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/error_display.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/error_display.snap
new file mode 100644
index 00000000..dc218d2c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/error_display.snap
@@ -0,0 +1,11 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+---
+error[ast]: expected `}` to close type table
+  ┌─ source.lua:3:1
+  │
+3 │ local x = 1
+  │ ^^^^^
+
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/errors.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/errors.snap
new file mode 100644
index 00000000..91e6c7c6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/errors.snap
@@ -0,0 +1,19 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: result.errors
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 35
+        line: 3
+        character: 1
+      end_position:
+        bytes: 40
+        line: 3
+        character: 6
+      token_type:
+        type: Symbol
+        symbol: local
+    additional: "expected `}` to close type table"
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/source.lua
new file mode 100644
index 00000000..c882c335
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/source.lua
@@ -0,0 +1,3 @@
+type Foo = { x: string, y: string
+
+local x = 1
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/tokens.snap
new file mode 100644
index 00000000..fc10df6d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/fail/parser/type_table_no_right_brace/tokens.snap
@@ -0,0 +1,312 @@
+---
+source: full-moon/tests/fail_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: Foo
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 27
+    line: 1
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 27
+    line: 1
+    character: 28
+  end_position:
+    bytes: 33
+    line: 1
+    character: 34
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 33
+    line: 1
+    character: 34
+  end_position:
+    bytes: 34
+    line: 1
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 34
+    line: 2
+    character: 1
+  end_position:
+    bytes: 35
+    line: 2
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 35
+    line: 3
+    character: 1
+  end_position:
+    bytes: 40
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 40
+    line: 3
+    character: 6
+  end_position:
+    bytes: 41
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 41
+    line: 3
+    character: 7
+  end_position:
+    bytes: 42
+    line: 3
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 42
+    line: 3
+    character: 8
+  end_position:
+    bytes: 43
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 43
+    line: 3
+    character: 9
+  end_position:
+    bytes: 44
+    line: 3
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 44
+    line: 3
+    character: 10
+  end_position:
+    bytes: 45
+    line: 3
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 45
+    line: 3
+    character: 11
+  end_position:
+    bytes: 46
+    line: 3
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 46
+    line: 3
+    character: 12
+  end_position:
+    bytes: 46
+    line: 3
+    character: 12
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/ast.snap
new file mode 100644
index 00000000..23ff308a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/ast.snap
@@ -0,0 +1,1824 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/roblox_cases/pass/compound_assignment
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 11
+                        line: 1
+                        character: 12
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 2
+              character: 1
+            end_position:
+              bytes: 17
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 17
+                line: 2
+                character: 6
+              end_position:
+                bytes: 18
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 18
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 19
+                    line: 2
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: y
+                trailing_trivia:
+                  - start_position:
+                      bytes: 19
+                      line: 2
+                      character: 8
+                    end_position:
+                      bytes: 20
+                      line: 2
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 20
+              line: 2
+              character: 9
+            end_position:
+              bytes: 21
+              line: 2
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 21
+                line: 2
+                character: 10
+              end_position:
+                bytes: 22
+                line: 2
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 22
+                      line: 2
+                      character: 11
+                    end_position:
+                      bytes: 23
+                      line: 2
+                      character: 12
+                    token_type:
+                      type: Number
+                      text: "2"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 23
+                        line: 2
+                        character: 12
+                      end_position:
+                        bytes: 24
+                        line: 2
+                        character: 12
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia:
+              - start_position:
+                  bytes: 24
+                  line: 3
+                  character: 1
+                end_position:
+                  bytes: 25
+                  line: 3
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 25
+                line: 4
+                character: 1
+              end_position:
+                bytes: 26
+                line: 4
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 26
+                  line: 4
+                  character: 2
+                end_position:
+                  bytes: 27
+                  line: 4
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          PlusEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 27
+                line: 4
+                character: 3
+              end_position:
+                bytes: 29
+                line: 4
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: +=
+            trailing_trivia:
+              - start_position:
+                  bytes: 29
+                  line: 4
+                  character: 5
+                end_position:
+                  bytes: 30
+                  line: 4
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 30
+                line: 4
+                character: 6
+              end_position:
+                bytes: 31
+                line: 4
+                character: 7
+              token_type:
+                type: Number
+                text: "5"
+            trailing_trivia:
+              - start_position:
+                  bytes: 31
+                  line: 4
+                  character: 7
+                end_position:
+                  bytes: 32
+                  line: 4
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 32
+                line: 5
+                character: 1
+              end_position:
+                bytes: 33
+                line: 5
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 33
+                  line: 5
+                  character: 2
+                end_position:
+                  bytes: 34
+                  line: 5
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          MinusEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 34
+                line: 5
+                character: 3
+              end_position:
+                bytes: 36
+                line: 5
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: "-="
+            trailing_trivia:
+              - start_position:
+                  bytes: 36
+                  line: 5
+                  character: 5
+                end_position:
+                  bytes: 37
+                  line: 5
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 37
+                line: 5
+                character: 6
+              end_position:
+                bytes: 38
+                line: 5
+                character: 7
+              token_type:
+                type: Number
+                text: "5"
+            trailing_trivia:
+              - start_position:
+                  bytes: 38
+                  line: 5
+                  character: 7
+                end_position:
+                  bytes: 39
+                  line: 5
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 39
+                line: 6
+                character: 1
+              end_position:
+                bytes: 40
+                line: 6
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 40
+                  line: 6
+                  character: 2
+                end_position:
+                  bytes: 41
+                  line: 6
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          StarEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 41
+                line: 6
+                character: 3
+              end_position:
+                bytes: 43
+                line: 6
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: "*="
+            trailing_trivia:
+              - start_position:
+                  bytes: 43
+                  line: 6
+                  character: 5
+                end_position:
+                  bytes: 44
+                  line: 6
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 44
+                line: 6
+                character: 6
+              end_position:
+                bytes: 45
+                line: 6
+                character: 7
+              token_type:
+                type: Number
+                text: "5"
+            trailing_trivia:
+              - start_position:
+                  bytes: 45
+                  line: 6
+                  character: 7
+                end_position:
+                  bytes: 46
+                  line: 6
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 46
+                line: 7
+                character: 1
+              end_position:
+                bytes: 47
+                line: 7
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 47
+                  line: 7
+                  character: 2
+                end_position:
+                  bytes: 48
+                  line: 7
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          SlashEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 48
+                line: 7
+                character: 3
+              end_position:
+                bytes: 50
+                line: 7
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: /=
+            trailing_trivia:
+              - start_position:
+                  bytes: 50
+                  line: 7
+                  character: 5
+                end_position:
+                  bytes: 51
+                  line: 7
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 51
+                line: 7
+                character: 6
+              end_position:
+                bytes: 52
+                line: 7
+                character: 7
+              token_type:
+                type: Number
+                text: "5"
+            trailing_trivia:
+              - start_position:
+                  bytes: 52
+                  line: 7
+                  character: 7
+                end_position:
+                  bytes: 53
+                  line: 7
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 53
+                line: 8
+                character: 1
+              end_position:
+                bytes: 54
+                line: 8
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 54
+                  line: 8
+                  character: 2
+                end_position:
+                  bytes: 55
+                  line: 8
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          DoubleSlashEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 55
+                line: 8
+                character: 3
+              end_position:
+                bytes: 58
+                line: 8
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: //=
+            trailing_trivia:
+              - start_position:
+                  bytes: 58
+                  line: 8
+                  character: 6
+                end_position:
+                  bytes: 59
+                  line: 8
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 59
+                line: 8
+                character: 7
+              end_position:
+                bytes: 60
+                line: 8
+                character: 8
+              token_type:
+                type: Number
+                text: "5"
+            trailing_trivia:
+              - start_position:
+                  bytes: 60
+                  line: 8
+                  character: 8
+                end_position:
+                  bytes: 61
+                  line: 8
+                  character: 8
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 61
+                line: 9
+                character: 1
+              end_position:
+                bytes: 62
+                line: 9
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 62
+                  line: 9
+                  character: 2
+                end_position:
+                  bytes: 63
+                  line: 9
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          PercentEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 63
+                line: 9
+                character: 3
+              end_position:
+                bytes: 65
+                line: 9
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: "%="
+            trailing_trivia:
+              - start_position:
+                  bytes: 65
+                  line: 9
+                  character: 5
+                end_position:
+                  bytes: 66
+                  line: 9
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 66
+                line: 9
+                character: 6
+              end_position:
+                bytes: 67
+                line: 9
+                character: 7
+              token_type:
+                type: Number
+                text: "5"
+            trailing_trivia:
+              - start_position:
+                  bytes: 67
+                  line: 9
+                  character: 7
+                end_position:
+                  bytes: 68
+                  line: 9
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 68
+                line: 10
+                character: 1
+              end_position:
+                bytes: 69
+                line: 10
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 69
+                  line: 10
+                  character: 2
+                end_position:
+                  bytes: 70
+                  line: 10
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          CaretEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 70
+                line: 10
+                character: 3
+              end_position:
+                bytes: 72
+                line: 10
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: ^=
+            trailing_trivia:
+              - start_position:
+                  bytes: 72
+                  line: 10
+                  character: 5
+                end_position:
+                  bytes: 73
+                  line: 10
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 73
+                line: 10
+                character: 6
+              end_position:
+                bytes: 74
+                line: 10
+                character: 7
+              token_type:
+                type: Number
+                text: "5"
+            trailing_trivia:
+              - start_position:
+                  bytes: 74
+                  line: 10
+                  character: 7
+                end_position:
+                  bytes: 75
+                  line: 10
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia:
+              - start_position:
+                  bytes: 75
+                  line: 11
+                  character: 1
+                end_position:
+                  bytes: 76
+                  line: 11
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 76
+                line: 12
+                character: 1
+              end_position:
+                bytes: 77
+                line: 12
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 77
+                  line: 12
+                  character: 2
+                end_position:
+                  bytes: 78
+                  line: 12
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          PlusEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 78
+                line: 12
+                character: 3
+              end_position:
+                bytes: 80
+                line: 12
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: +=
+            trailing_trivia:
+              - start_position:
+                  bytes: 80
+                  line: 12
+                  character: 5
+                end_position:
+                  bytes: 81
+                  line: 12
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 81
+                  line: 12
+                  character: 6
+                end_position:
+                  bytes: 82
+                  line: 12
+                  character: 7
+                token_type:
+                  type: Identifier
+                  identifier: y
+              trailing_trivia:
+                - start_position:
+                    bytes: 82
+                    line: 12
+                    character: 7
+                  end_position:
+                    bytes: 83
+                    line: 12
+                    character: 7
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 83
+                line: 13
+                character: 1
+              end_position:
+                bytes: 84
+                line: 13
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 84
+                  line: 13
+                  character: 2
+                end_position:
+                  bytes: 85
+                  line: 13
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          MinusEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 85
+                line: 13
+                character: 3
+              end_position:
+                bytes: 87
+                line: 13
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: "-="
+            trailing_trivia:
+              - start_position:
+                  bytes: 87
+                  line: 13
+                  character: 5
+                end_position:
+                  bytes: 88
+                  line: 13
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 88
+                  line: 13
+                  character: 6
+                end_position:
+                  bytes: 89
+                  line: 13
+                  character: 7
+                token_type:
+                  type: Identifier
+                  identifier: y
+              trailing_trivia:
+                - start_position:
+                    bytes: 89
+                    line: 13
+                    character: 7
+                  end_position:
+                    bytes: 90
+                    line: 13
+                    character: 7
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 90
+                line: 14
+                character: 1
+              end_position:
+                bytes: 91
+                line: 14
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 91
+                  line: 14
+                  character: 2
+                end_position:
+                  bytes: 92
+                  line: 14
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          StarEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 92
+                line: 14
+                character: 3
+              end_position:
+                bytes: 94
+                line: 14
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: "*="
+            trailing_trivia:
+              - start_position:
+                  bytes: 94
+                  line: 14
+                  character: 5
+                end_position:
+                  bytes: 95
+                  line: 14
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 95
+                  line: 14
+                  character: 6
+                end_position:
+                  bytes: 96
+                  line: 14
+                  character: 7
+                token_type:
+                  type: Identifier
+                  identifier: y
+              trailing_trivia:
+                - start_position:
+                    bytes: 96
+                    line: 14
+                    character: 7
+                  end_position:
+                    bytes: 97
+                    line: 14
+                    character: 7
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 97
+                line: 15
+                character: 1
+              end_position:
+                bytes: 98
+                line: 15
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 98
+                  line: 15
+                  character: 2
+                end_position:
+                  bytes: 99
+                  line: 15
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          SlashEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 99
+                line: 15
+                character: 3
+              end_position:
+                bytes: 101
+                line: 15
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: /=
+            trailing_trivia:
+              - start_position:
+                  bytes: 101
+                  line: 15
+                  character: 5
+                end_position:
+                  bytes: 102
+                  line: 15
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 102
+                  line: 15
+                  character: 6
+                end_position:
+                  bytes: 103
+                  line: 15
+                  character: 7
+                token_type:
+                  type: Identifier
+                  identifier: y
+              trailing_trivia:
+                - start_position:
+                    bytes: 103
+                    line: 15
+                    character: 7
+                  end_position:
+                    bytes: 104
+                    line: 15
+                    character: 7
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 104
+                line: 16
+                character: 1
+              end_position:
+                bytes: 105
+                line: 16
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 105
+                  line: 16
+                  character: 2
+                end_position:
+                  bytes: 106
+                  line: 16
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          DoubleSlashEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 106
+                line: 16
+                character: 3
+              end_position:
+                bytes: 109
+                line: 16
+                character: 6
+              token_type:
+                type: Symbol
+                symbol: //=
+            trailing_trivia:
+              - start_position:
+                  bytes: 109
+                  line: 16
+                  character: 6
+                end_position:
+                  bytes: 110
+                  line: 16
+                  character: 7
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 110
+                  line: 16
+                  character: 7
+                end_position:
+                  bytes: 111
+                  line: 16
+                  character: 8
+                token_type:
+                  type: Identifier
+                  identifier: y
+              trailing_trivia:
+                - start_position:
+                    bytes: 111
+                    line: 16
+                    character: 8
+                  end_position:
+                    bytes: 112
+                    line: 16
+                    character: 8
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 112
+                line: 17
+                character: 1
+              end_position:
+                bytes: 113
+                line: 17
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 113
+                  line: 17
+                  character: 2
+                end_position:
+                  bytes: 114
+                  line: 17
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          PercentEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 114
+                line: 17
+                character: 3
+              end_position:
+                bytes: 116
+                line: 17
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: "%="
+            trailing_trivia:
+              - start_position:
+                  bytes: 116
+                  line: 17
+                  character: 5
+                end_position:
+                  bytes: 117
+                  line: 17
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 117
+                  line: 17
+                  character: 6
+                end_position:
+                  bytes: 118
+                  line: 17
+                  character: 7
+                token_type:
+                  type: Identifier
+                  identifier: y
+              trailing_trivia:
+                - start_position:
+                    bytes: 118
+                    line: 17
+                    character: 7
+                  end_position:
+                    bytes: 119
+                    line: 17
+                    character: 7
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 119
+                line: 18
+                character: 1
+              end_position:
+                bytes: 120
+                line: 18
+                character: 2
+              token_type:
+                type: Identifier
+                identifier: x
+            trailing_trivia:
+              - start_position:
+                  bytes: 120
+                  line: 18
+                  character: 2
+                end_position:
+                  bytes: 121
+                  line: 18
+                  character: 3
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          CaretEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 121
+                line: 18
+                character: 3
+              end_position:
+                bytes: 123
+                line: 18
+                character: 5
+              token_type:
+                type: Symbol
+                symbol: ^=
+            trailing_trivia:
+              - start_position:
+                  bytes: 123
+                  line: 18
+                  character: 5
+                end_position:
+                  bytes: 124
+                  line: 18
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 124
+                  line: 18
+                  character: 6
+                end_position:
+                  bytes: 125
+                  line: 18
+                  character: 7
+                token_type:
+                  type: Identifier
+                  identifier: y
+              trailing_trivia:
+                - start_position:
+                    bytes: 125
+                    line: 18
+                    character: 7
+                  end_position:
+                    bytes: 126
+                    line: 18
+                    character: 7
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 126
+                line: 19
+                character: 1
+              end_position:
+                bytes: 127
+                line: 19
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 127
+              line: 20
+              character: 1
+            end_position:
+              bytes: 132
+              line: 20
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 132
+                line: 20
+                character: 6
+              end_position:
+                bytes: 133
+                line: 20
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 133
+                    line: 20
+                    character: 7
+                  end_position:
+                    bytes: 137
+                    line: 20
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: str1
+                trailing_trivia:
+                  - start_position:
+                      bytes: 137
+                      line: 20
+                      character: 11
+                    end_position:
+                      bytes: 138
+                      line: 20
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 138
+              line: 20
+              character: 12
+            end_position:
+              bytes: 139
+              line: 20
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 139
+                line: 20
+                character: 13
+              end_position:
+                bytes: 140
+                line: 20
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 140
+                      line: 20
+                      character: 14
+                    end_position:
+                      bytes: 149
+                      line: 20
+                      character: 23
+                    token_type:
+                      type: StringLiteral
+                      literal: "Hello, "
+                      quote_type: Double
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 149
+                        line: 20
+                        character: 23
+                      end_position:
+                        bytes: 150
+                        line: 20
+                        character: 23
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 150
+              line: 21
+              character: 1
+            end_position:
+              bytes: 155
+              line: 21
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 155
+                line: 21
+                character: 6
+              end_position:
+                bytes: 156
+                line: 21
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 156
+                    line: 21
+                    character: 7
+                  end_position:
+                    bytes: 160
+                    line: 21
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: str2
+                trailing_trivia:
+                  - start_position:
+                      bytes: 160
+                      line: 21
+                      character: 11
+                    end_position:
+                      bytes: 161
+                      line: 21
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 161
+              line: 21
+              character: 12
+            end_position:
+              bytes: 162
+              line: 21
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 162
+                line: 21
+                character: 13
+              end_position:
+                bytes: 163
+                line: 21
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                String:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 163
+                      line: 21
+                      character: 14
+                    end_position:
+                      bytes: 171
+                      line: 21
+                      character: 22
+                    token_type:
+                      type: StringLiteral
+                      literal: world!
+                      quote_type: Double
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 171
+                        line: 21
+                        character: 22
+                      end_position:
+                        bytes: 172
+                        line: 21
+                        character: 22
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia:
+              - start_position:
+                  bytes: 172
+                  line: 22
+                  character: 1
+                end_position:
+                  bytes: 173
+                  line: 22
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 173
+                line: 23
+                character: 1
+              end_position:
+                bytes: 177
+                line: 23
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: str1
+            trailing_trivia:
+              - start_position:
+                  bytes: 177
+                  line: 23
+                  character: 5
+                end_position:
+                  bytes: 178
+                  line: 23
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          TwoDotsEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 178
+                line: 23
+                character: 6
+              end_position:
+                bytes: 181
+                line: 23
+                character: 9
+              token_type:
+                type: Symbol
+                symbol: "..="
+            trailing_trivia:
+              - start_position:
+                  bytes: 181
+                  line: 23
+                  character: 9
+                end_position:
+                  bytes: 182
+                  line: 23
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          String:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 182
+                line: 23
+                character: 10
+              end_position:
+                bytes: 190
+                line: 23
+                character: 18
+              token_type:
+                type: StringLiteral
+                literal: world!
+                quote_type: Double
+            trailing_trivia:
+              - start_position:
+                  bytes: 190
+                  line: 23
+                  character: 18
+                end_position:
+                  bytes: 191
+                  line: 23
+                  character: 18
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - CompoundAssignment:
+        lhs:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 191
+                line: 24
+                character: 1
+              end_position:
+                bytes: 195
+                line: 24
+                character: 5
+              token_type:
+                type: Identifier
+                identifier: str1
+            trailing_trivia:
+              - start_position:
+                  bytes: 195
+                  line: 24
+                  character: 5
+                end_position:
+                  bytes: 196
+                  line: 24
+                  character: 6
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        compound_operator:
+          TwoDotsEqual:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 196
+                line: 24
+                character: 6
+              end_position:
+                bytes: 199
+                line: 24
+                character: 9
+              token_type:
+                type: Symbol
+                symbol: "..="
+            trailing_trivia:
+              - start_position:
+                  bytes: 199
+                  line: 24
+                  character: 9
+                end_position:
+                  bytes: 200
+                  line: 24
+                  character: 10
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        rhs:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 200
+                  line: 24
+                  character: 10
+                end_position:
+                  bytes: 204
+                  line: 24
+                  character: 14
+                token_type:
+                  type: Identifier
+                  identifier: str2
+              trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/source.lua
new file mode 100644
index 00000000..ed2ab3c8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/source.lua
@@ -0,0 +1,24 @@
+local x = 1
+local y = 2
+
+x += 5
+x -= 5
+x *= 5
+x /= 5
+x //= 5
+x %= 5
+x ^= 5
+
+x += y
+x -= y
+x *= y
+x /= y
+x //= y
+x %= y
+x ^= y
+
+local str1 = "Hello, "
+local str2 = "world!"
+
+str1 ..= "world!"
+str1 ..= str2
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/tokens.snap
new file mode 100644
index 00000000..f60aed94
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/compound_assignment/tokens.snap
@@ -0,0 +1,1461 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 38
+expression: tokens
+input_file: full-moon/tests/roblox_cases/pass/compound_assignment
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 12
+    line: 2
+    character: 1
+  end_position:
+    bytes: 17
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 17
+    line: 2
+    character: 6
+  end_position:
+    bytes: 18
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 18
+    line: 2
+    character: 7
+  end_position:
+    bytes: 19
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 19
+    line: 2
+    character: 8
+  end_position:
+    bytes: 20
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 2
+    character: 9
+  end_position:
+    bytes: 21
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 21
+    line: 2
+    character: 10
+  end_position:
+    bytes: 22
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 2
+    character: 11
+  end_position:
+    bytes: 23
+    line: 2
+    character: 12
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 23
+    line: 2
+    character: 12
+  end_position:
+    bytes: 24
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 24
+    line: 3
+    character: 1
+  end_position:
+    bytes: 25
+    line: 3
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 25
+    line: 4
+    character: 1
+  end_position:
+    bytes: 26
+    line: 4
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 26
+    line: 4
+    character: 2
+  end_position:
+    bytes: 27
+    line: 4
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 27
+    line: 4
+    character: 3
+  end_position:
+    bytes: 29
+    line: 4
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: +=
+- start_position:
+    bytes: 29
+    line: 4
+    character: 5
+  end_position:
+    bytes: 30
+    line: 4
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 30
+    line: 4
+    character: 6
+  end_position:
+    bytes: 31
+    line: 4
+    character: 7
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 31
+    line: 4
+    character: 7
+  end_position:
+    bytes: 32
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 32
+    line: 5
+    character: 1
+  end_position:
+    bytes: 33
+    line: 5
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 33
+    line: 5
+    character: 2
+  end_position:
+    bytes: 34
+    line: 5
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 34
+    line: 5
+    character: 3
+  end_position:
+    bytes: 36
+    line: 5
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "-="
+- start_position:
+    bytes: 36
+    line: 5
+    character: 5
+  end_position:
+    bytes: 37
+    line: 5
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 37
+    line: 5
+    character: 6
+  end_position:
+    bytes: 38
+    line: 5
+    character: 7
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 38
+    line: 5
+    character: 7
+  end_position:
+    bytes: 39
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 39
+    line: 6
+    character: 1
+  end_position:
+    bytes: 40
+    line: 6
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 40
+    line: 6
+    character: 2
+  end_position:
+    bytes: 41
+    line: 6
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 41
+    line: 6
+    character: 3
+  end_position:
+    bytes: 43
+    line: 6
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "*="
+- start_position:
+    bytes: 43
+    line: 6
+    character: 5
+  end_position:
+    bytes: 44
+    line: 6
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 44
+    line: 6
+    character: 6
+  end_position:
+    bytes: 45
+    line: 6
+    character: 7
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 45
+    line: 6
+    character: 7
+  end_position:
+    bytes: 46
+    line: 6
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 46
+    line: 7
+    character: 1
+  end_position:
+    bytes: 47
+    line: 7
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 47
+    line: 7
+    character: 2
+  end_position:
+    bytes: 48
+    line: 7
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 48
+    line: 7
+    character: 3
+  end_position:
+    bytes: 50
+    line: 7
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: /=
+- start_position:
+    bytes: 50
+    line: 7
+    character: 5
+  end_position:
+    bytes: 51
+    line: 7
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 51
+    line: 7
+    character: 6
+  end_position:
+    bytes: 52
+    line: 7
+    character: 7
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 52
+    line: 7
+    character: 7
+  end_position:
+    bytes: 53
+    line: 7
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 53
+    line: 8
+    character: 1
+  end_position:
+    bytes: 54
+    line: 8
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 54
+    line: 8
+    character: 2
+  end_position:
+    bytes: 55
+    line: 8
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 55
+    line: 8
+    character: 3
+  end_position:
+    bytes: 58
+    line: 8
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: //=
+- start_position:
+    bytes: 58
+    line: 8
+    character: 6
+  end_position:
+    bytes: 59
+    line: 8
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 59
+    line: 8
+    character: 7
+  end_position:
+    bytes: 60
+    line: 8
+    character: 8
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 60
+    line: 8
+    character: 8
+  end_position:
+    bytes: 61
+    line: 8
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 61
+    line: 9
+    character: 1
+  end_position:
+    bytes: 62
+    line: 9
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 62
+    line: 9
+    character: 2
+  end_position:
+    bytes: 63
+    line: 9
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 63
+    line: 9
+    character: 3
+  end_position:
+    bytes: 65
+    line: 9
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "%="
+- start_position:
+    bytes: 65
+    line: 9
+    character: 5
+  end_position:
+    bytes: 66
+    line: 9
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 66
+    line: 9
+    character: 6
+  end_position:
+    bytes: 67
+    line: 9
+    character: 7
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 67
+    line: 9
+    character: 7
+  end_position:
+    bytes: 68
+    line: 9
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 68
+    line: 10
+    character: 1
+  end_position:
+    bytes: 69
+    line: 10
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 69
+    line: 10
+    character: 2
+  end_position:
+    bytes: 70
+    line: 10
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 70
+    line: 10
+    character: 3
+  end_position:
+    bytes: 72
+    line: 10
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: ^=
+- start_position:
+    bytes: 72
+    line: 10
+    character: 5
+  end_position:
+    bytes: 73
+    line: 10
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 73
+    line: 10
+    character: 6
+  end_position:
+    bytes: 74
+    line: 10
+    character: 7
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 74
+    line: 10
+    character: 7
+  end_position:
+    bytes: 75
+    line: 10
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 75
+    line: 11
+    character: 1
+  end_position:
+    bytes: 76
+    line: 11
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 76
+    line: 12
+    character: 1
+  end_position:
+    bytes: 77
+    line: 12
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 77
+    line: 12
+    character: 2
+  end_position:
+    bytes: 78
+    line: 12
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 78
+    line: 12
+    character: 3
+  end_position:
+    bytes: 80
+    line: 12
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: +=
+- start_position:
+    bytes: 80
+    line: 12
+    character: 5
+  end_position:
+    bytes: 81
+    line: 12
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 81
+    line: 12
+    character: 6
+  end_position:
+    bytes: 82
+    line: 12
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 82
+    line: 12
+    character: 7
+  end_position:
+    bytes: 83
+    line: 12
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 83
+    line: 13
+    character: 1
+  end_position:
+    bytes: 84
+    line: 13
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 84
+    line: 13
+    character: 2
+  end_position:
+    bytes: 85
+    line: 13
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 85
+    line: 13
+    character: 3
+  end_position:
+    bytes: 87
+    line: 13
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "-="
+- start_position:
+    bytes: 87
+    line: 13
+    character: 5
+  end_position:
+    bytes: 88
+    line: 13
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 88
+    line: 13
+    character: 6
+  end_position:
+    bytes: 89
+    line: 13
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 89
+    line: 13
+    character: 7
+  end_position:
+    bytes: 90
+    line: 13
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 90
+    line: 14
+    character: 1
+  end_position:
+    bytes: 91
+    line: 14
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 91
+    line: 14
+    character: 2
+  end_position:
+    bytes: 92
+    line: 14
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 92
+    line: 14
+    character: 3
+  end_position:
+    bytes: 94
+    line: 14
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "*="
+- start_position:
+    bytes: 94
+    line: 14
+    character: 5
+  end_position:
+    bytes: 95
+    line: 14
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 95
+    line: 14
+    character: 6
+  end_position:
+    bytes: 96
+    line: 14
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 96
+    line: 14
+    character: 7
+  end_position:
+    bytes: 97
+    line: 14
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 97
+    line: 15
+    character: 1
+  end_position:
+    bytes: 98
+    line: 15
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 98
+    line: 15
+    character: 2
+  end_position:
+    bytes: 99
+    line: 15
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 99
+    line: 15
+    character: 3
+  end_position:
+    bytes: 101
+    line: 15
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: /=
+- start_position:
+    bytes: 101
+    line: 15
+    character: 5
+  end_position:
+    bytes: 102
+    line: 15
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 102
+    line: 15
+    character: 6
+  end_position:
+    bytes: 103
+    line: 15
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 103
+    line: 15
+    character: 7
+  end_position:
+    bytes: 104
+    line: 15
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 104
+    line: 16
+    character: 1
+  end_position:
+    bytes: 105
+    line: 16
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 105
+    line: 16
+    character: 2
+  end_position:
+    bytes: 106
+    line: 16
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 106
+    line: 16
+    character: 3
+  end_position:
+    bytes: 109
+    line: 16
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: //=
+- start_position:
+    bytes: 109
+    line: 16
+    character: 6
+  end_position:
+    bytes: 110
+    line: 16
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 110
+    line: 16
+    character: 7
+  end_position:
+    bytes: 111
+    line: 16
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 111
+    line: 16
+    character: 8
+  end_position:
+    bytes: 112
+    line: 16
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 112
+    line: 17
+    character: 1
+  end_position:
+    bytes: 113
+    line: 17
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 113
+    line: 17
+    character: 2
+  end_position:
+    bytes: 114
+    line: 17
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 114
+    line: 17
+    character: 3
+  end_position:
+    bytes: 116
+    line: 17
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: "%="
+- start_position:
+    bytes: 116
+    line: 17
+    character: 5
+  end_position:
+    bytes: 117
+    line: 17
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 117
+    line: 17
+    character: 6
+  end_position:
+    bytes: 118
+    line: 17
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 118
+    line: 17
+    character: 7
+  end_position:
+    bytes: 119
+    line: 17
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 119
+    line: 18
+    character: 1
+  end_position:
+    bytes: 120
+    line: 18
+    character: 2
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 120
+    line: 18
+    character: 2
+  end_position:
+    bytes: 121
+    line: 18
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 121
+    line: 18
+    character: 3
+  end_position:
+    bytes: 123
+    line: 18
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: ^=
+- start_position:
+    bytes: 123
+    line: 18
+    character: 5
+  end_position:
+    bytes: 124
+    line: 18
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 124
+    line: 18
+    character: 6
+  end_position:
+    bytes: 125
+    line: 18
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 125
+    line: 18
+    character: 7
+  end_position:
+    bytes: 126
+    line: 18
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 126
+    line: 19
+    character: 1
+  end_position:
+    bytes: 127
+    line: 19
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 127
+    line: 20
+    character: 1
+  end_position:
+    bytes: 132
+    line: 20
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 132
+    line: 20
+    character: 6
+  end_position:
+    bytes: 133
+    line: 20
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 133
+    line: 20
+    character: 7
+  end_position:
+    bytes: 137
+    line: 20
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: str1
+- start_position:
+    bytes: 137
+    line: 20
+    character: 11
+  end_position:
+    bytes: 138
+    line: 20
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 138
+    line: 20
+    character: 12
+  end_position:
+    bytes: 139
+    line: 20
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 139
+    line: 20
+    character: 13
+  end_position:
+    bytes: 140
+    line: 20
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 140
+    line: 20
+    character: 14
+  end_position:
+    bytes: 149
+    line: 20
+    character: 23
+  token_type:
+    type: StringLiteral
+    literal: "Hello, "
+    quote_type: Double
+- start_position:
+    bytes: 149
+    line: 20
+    character: 23
+  end_position:
+    bytes: 150
+    line: 20
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 150
+    line: 21
+    character: 1
+  end_position:
+    bytes: 155
+    line: 21
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 155
+    line: 21
+    character: 6
+  end_position:
+    bytes: 156
+    line: 21
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 156
+    line: 21
+    character: 7
+  end_position:
+    bytes: 160
+    line: 21
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: str2
+- start_position:
+    bytes: 160
+    line: 21
+    character: 11
+  end_position:
+    bytes: 161
+    line: 21
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 161
+    line: 21
+    character: 12
+  end_position:
+    bytes: 162
+    line: 21
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 162
+    line: 21
+    character: 13
+  end_position:
+    bytes: 163
+    line: 21
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 163
+    line: 21
+    character: 14
+  end_position:
+    bytes: 171
+    line: 21
+    character: 22
+  token_type:
+    type: StringLiteral
+    literal: world!
+    quote_type: Double
+- start_position:
+    bytes: 171
+    line: 21
+    character: 22
+  end_position:
+    bytes: 172
+    line: 21
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 172
+    line: 22
+    character: 1
+  end_position:
+    bytes: 173
+    line: 22
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 173
+    line: 23
+    character: 1
+  end_position:
+    bytes: 177
+    line: 23
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: str1
+- start_position:
+    bytes: 177
+    line: 23
+    character: 5
+  end_position:
+    bytes: 178
+    line: 23
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 178
+    line: 23
+    character: 6
+  end_position:
+    bytes: 181
+    line: 23
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "..="
+- start_position:
+    bytes: 181
+    line: 23
+    character: 9
+  end_position:
+    bytes: 182
+    line: 23
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 182
+    line: 23
+    character: 10
+  end_position:
+    bytes: 190
+    line: 23
+    character: 18
+  token_type:
+    type: StringLiteral
+    literal: world!
+    quote_type: Double
+- start_position:
+    bytes: 190
+    line: 23
+    character: 18
+  end_position:
+    bytes: 191
+    line: 23
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 191
+    line: 24
+    character: 1
+  end_position:
+    bytes: 195
+    line: 24
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: str1
+- start_position:
+    bytes: 195
+    line: 24
+    character: 5
+  end_position:
+    bytes: 196
+    line: 24
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 196
+    line: 24
+    character: 6
+  end_position:
+    bytes: 199
+    line: 24
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: "..="
+- start_position:
+    bytes: 199
+    line: 24
+    character: 9
+  end_position:
+    bytes: 200
+    line: 24
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 200
+    line: 24
+    character: 10
+  end_position:
+    bytes: 204
+    line: 24
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: str2
+- start_position:
+    bytes: 204
+    line: 24
+    character: 14
+  end_position:
+    bytes: 204
+    line: 24
+    character: 14
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/ast.snap
new file mode 100644
index 00000000..54eb84aa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/ast.snap
@@ -0,0 +1,365 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/roblox_cases/pass/continue
+---
+stmts:
+  - - While:
+        while_token:
+          leading_trivia:
+            - start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 27
+                line: 1
+                character: 28
+              token_type:
+                type: SingleLineComment
+                comment: " Very important loop here"
+            - start_position:
+                bytes: 27
+                line: 1
+                character: 28
+              end_position:
+                bytes: 28
+                line: 1
+                character: 28
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 28
+              line: 2
+              character: 1
+            end_position:
+              bytes: 33
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: while
+          trailing_trivia:
+            - start_position:
+                bytes: 33
+                line: 2
+                character: 6
+              end_position:
+                bytes: 34
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        condition:
+          Symbol:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 34
+                line: 2
+                character: 7
+              end_position:
+                bytes: 38
+                line: 2
+                character: 11
+              token_type:
+                type: Symbol
+                symbol: "true"
+            trailing_trivia:
+              - start_position:
+                  bytes: 38
+                  line: 2
+                  character: 11
+                end_position:
+                  bytes: 39
+                  line: 2
+                  character: 12
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 39
+              line: 2
+              character: 12
+            end_position:
+              bytes: 41
+              line: 2
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 41
+                line: 2
+                character: 14
+              end_position:
+                bytes: 42
+                line: 2
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts: []
+          last_stmt:
+            - Continue:
+                leading_trivia:
+                  - start_position:
+                      bytes: 42
+                      line: 3
+                      character: 1
+                    end_position:
+                      bytes: 43
+                      line: 3
+                      character: 2
+                    token_type:
+                      type: Whitespace
+                      characters: "\t"
+                token:
+                  start_position:
+                    bytes: 43
+                    line: 3
+                    character: 2
+                  end_position:
+                    bytes: 51
+                    line: 3
+                    character: 10
+                  token_type:
+                    type: Identifier
+                    identifier: continue
+                trailing_trivia:
+                  - start_position:
+                      bytes: 51
+                      line: 3
+                      character: 10
+                    end_position:
+                      bytes: 52
+                      line: 3
+                      character: 10
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+            - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 52
+              line: 4
+              character: 1
+            end_position:
+              bytes: 55
+              line: 4
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 55
+                line: 4
+                character: 4
+              end_position:
+                bytes: 56
+                line: 4
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia:
+              - start_position:
+                  bytes: 56
+                  line: 5
+                  character: 1
+                end_position:
+                  bytes: 57
+                  line: 5
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 57
+                line: 6
+                character: 1
+              end_position:
+                bytes: 65
+                line: 6
+                character: 9
+              token_type:
+                type: Identifier
+                identifier: continue
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 65
+                            line: 6
+                            character: 9
+                          end_position:
+                            bytes: 66
+                            line: 6
+                            character: 10
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 66
+                            line: 6
+                            character: 10
+                          end_position:
+                            bytes: 67
+                            line: 6
+                            character: 11
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 67
+                              line: 6
+                              character: 11
+                            end_position:
+                              bytes: 68
+                              line: 6
+                              character: 11
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 68
+              line: 7
+              character: 1
+            end_position:
+              bytes: 73
+              line: 7
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 73
+                line: 7
+                character: 6
+              end_position:
+                bytes: 74
+                line: 7
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 74
+                    line: 7
+                    character: 7
+                  end_position:
+                    bytes: 82
+                    line: 7
+                    character: 15
+                  token_type:
+                    type: Identifier
+                    identifier: continue
+                trailing_trivia:
+                  - start_position:
+                      bytes: 82
+                      line: 7
+                      character: 15
+                    end_position:
+                      bytes: 83
+                      line: 7
+                      character: 16
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 83
+              line: 7
+              character: 16
+            end_position:
+              bytes: 84
+              line: 7
+              character: 17
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 84
+                line: 7
+                character: 17
+              end_position:
+                bytes: 85
+                line: 7
+                character: 18
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 85
+                      line: 7
+                      character: 18
+                    end_position:
+                      bytes: 86
+                      line: 7
+                      character: 19
+                    token_type:
+                      type: Number
+                      text: "4"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 86
+                        line: 7
+                        character: 19
+                      end_position:
+                        bytes: 87
+                        line: 7
+                        character: 19
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/source.lua
new file mode 100644
index 00000000..f712f24d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/source.lua
@@ -0,0 +1,7 @@
+-- Very important loop here
+while true do
+	continue
+end
+
+continue()
+local continue = 4
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/tokens.snap
new file mode 100644
index 00000000..58a1adab
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/continue/tokens.snap
@@ -0,0 +1,303 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/roblox_cases/pass/continue
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 27
+    line: 1
+    character: 28
+  token_type:
+    type: SingleLineComment
+    comment: " Very important loop here"
+- start_position:
+    bytes: 27
+    line: 1
+    character: 28
+  end_position:
+    bytes: 28
+    line: 1
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 28
+    line: 2
+    character: 1
+  end_position:
+    bytes: 33
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: while
+- start_position:
+    bytes: 33
+    line: 2
+    character: 6
+  end_position:
+    bytes: 34
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 34
+    line: 2
+    character: 7
+  end_position:
+    bytes: 38
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 38
+    line: 2
+    character: 11
+  end_position:
+    bytes: 39
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 39
+    line: 2
+    character: 12
+  end_position:
+    bytes: 41
+    line: 2
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 41
+    line: 2
+    character: 14
+  end_position:
+    bytes: 42
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 42
+    line: 3
+    character: 1
+  end_position:
+    bytes: 43
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 43
+    line: 3
+    character: 2
+  end_position:
+    bytes: 51
+    line: 3
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: continue
+- start_position:
+    bytes: 51
+    line: 3
+    character: 10
+  end_position:
+    bytes: 52
+    line: 3
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 52
+    line: 4
+    character: 1
+  end_position:
+    bytes: 55
+    line: 4
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 55
+    line: 4
+    character: 4
+  end_position:
+    bytes: 56
+    line: 4
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 56
+    line: 5
+    character: 1
+  end_position:
+    bytes: 57
+    line: 5
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 57
+    line: 6
+    character: 1
+  end_position:
+    bytes: 65
+    line: 6
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: continue
+- start_position:
+    bytes: 65
+    line: 6
+    character: 9
+  end_position:
+    bytes: 66
+    line: 6
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 66
+    line: 6
+    character: 10
+  end_position:
+    bytes: 67
+    line: 6
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 67
+    line: 6
+    character: 11
+  end_position:
+    bytes: 68
+    line: 6
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 68
+    line: 7
+    character: 1
+  end_position:
+    bytes: 73
+    line: 7
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 73
+    line: 7
+    character: 6
+  end_position:
+    bytes: 74
+    line: 7
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 74
+    line: 7
+    character: 7
+  end_position:
+    bytes: 82
+    line: 7
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: continue
+- start_position:
+    bytes: 82
+    line: 7
+    character: 15
+  end_position:
+    bytes: 83
+    line: 7
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 83
+    line: 7
+    character: 16
+  end_position:
+    bytes: 84
+    line: 7
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 84
+    line: 7
+    character: 17
+  end_position:
+    bytes: 85
+    line: 7
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 85
+    line: 7
+    character: 18
+  end_position:
+    bytes: 86
+    line: 7
+    character: 19
+  token_type:
+    type: Number
+    text: "4"
+- start_position:
+    bytes: 86
+    line: 7
+    character: 19
+  end_position:
+    bytes: 87
+    line: 7
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 87
+    line: 8
+    character: 1
+  end_position:
+    bytes: 87
+    line: 8
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/ast.snap
new file mode 100644
index 00000000..8a2bf0d5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/ast.snap
@@ -0,0 +1,663 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/roblox_cases/pass/decimal_seperators
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num1
+                trailing_trivia:
+                  - start_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    end_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 11
+              line: 1
+              character: 12
+            end_position:
+              bytes: 12
+              line: 1
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 12
+                line: 1
+                character: 13
+              end_position:
+                bytes: 13
+                line: 1
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 13
+                      line: 1
+                      character: 14
+                    end_position:
+                      bytes: 22
+                      line: 1
+                      character: 23
+                    token_type:
+                      type: Number
+                      text: 1_048_576
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 22
+                        line: 1
+                        character: 23
+                      end_position:
+                        bytes: 23
+                        line: 1
+                        character: 23
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 23
+              line: 2
+              character: 1
+            end_position:
+              bytes: 28
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 28
+                line: 2
+                character: 6
+              end_position:
+                bytes: 29
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 29
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 33
+                    line: 2
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num2
+                trailing_trivia:
+                  - start_position:
+                      bytes: 33
+                      line: 2
+                      character: 11
+                    end_position:
+                      bytes: 34
+                      line: 2
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 34
+              line: 2
+              character: 12
+            end_position:
+              bytes: 35
+              line: 2
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 35
+                line: 2
+                character: 13
+              end_position:
+                bytes: 36
+                line: 2
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 36
+                      line: 2
+                      character: 14
+                    end_position:
+                      bytes: 47
+                      line: 2
+                      character: 25
+                    token_type:
+                      type: Number
+                      text: "0xFFFF_FFFF"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 47
+                        line: 2
+                        character: 25
+                      end_position:
+                        bytes: 48
+                        line: 2
+                        character: 25
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 48
+              line: 3
+              character: 1
+            end_position:
+              bytes: 53
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 53
+                line: 3
+                character: 6
+              end_position:
+                bytes: 54
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 54
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 58
+                    line: 3
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num3
+                trailing_trivia:
+                  - start_position:
+                      bytes: 58
+                      line: 3
+                      character: 11
+                    end_position:
+                      bytes: 59
+                      line: 3
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 59
+              line: 3
+              character: 12
+            end_position:
+              bytes: 60
+              line: 3
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 60
+                line: 3
+                character: 13
+              end_position:
+                bytes: 61
+                line: 3
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 61
+                      line: 3
+                      character: 14
+                    end_position:
+                      bytes: 73
+                      line: 3
+                      character: 26
+                    token_type:
+                      type: Number
+                      text: 0b_0101_0101
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 73
+                        line: 3
+                        character: 26
+                      end_position:
+                        bytes: 74
+                        line: 3
+                        character: 26
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 74
+              line: 4
+              character: 1
+            end_position:
+              bytes: 79
+              line: 4
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 79
+                line: 4
+                character: 6
+              end_position:
+                bytes: 80
+                line: 4
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 80
+                    line: 4
+                    character: 7
+                  end_position:
+                    bytes: 84
+                    line: 4
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num4
+                trailing_trivia:
+                  - start_position:
+                      bytes: 84
+                      line: 4
+                      character: 11
+                    end_position:
+                      bytes: 85
+                      line: 4
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 85
+              line: 4
+              character: 12
+            end_position:
+              bytes: 86
+              line: 4
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 86
+                line: 4
+                character: 13
+              end_position:
+                bytes: 87
+                line: 4
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 87
+                      line: 4
+                      character: 14
+                    end_position:
+                      bytes: 108
+                      line: 4
+                      character: 35
+                    token_type:
+                      type: Number
+                      text: 1_523_423.132_452_312
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 108
+                        line: 4
+                        character: 35
+                      end_position:
+                        bytes: 109
+                        line: 4
+                        character: 35
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 109
+              line: 5
+              character: 1
+            end_position:
+              bytes: 114
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 114
+                line: 5
+                character: 6
+              end_position:
+                bytes: 115
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 115
+                    line: 5
+                    character: 7
+                  end_position:
+                    bytes: 119
+                    line: 5
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num5
+                trailing_trivia:
+                  - start_position:
+                      bytes: 119
+                      line: 5
+                      character: 11
+                    end_position:
+                      bytes: 120
+                      line: 5
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 120
+              line: 5
+              character: 12
+            end_position:
+              bytes: 121
+              line: 5
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 121
+                line: 5
+                character: 13
+              end_position:
+                bytes: 122
+                line: 5
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 122
+                      line: 5
+                      character: 14
+                    end_position:
+                      bytes: 131
+                      line: 5
+                      character: 23
+                    token_type:
+                      type: Number
+                      text: 1e512_412
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 131
+                        line: 5
+                        character: 23
+                      end_position:
+                        bytes: 132
+                        line: 5
+                        character: 23
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 132
+              line: 6
+              character: 1
+            end_position:
+              bytes: 137
+              line: 6
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 137
+                line: 6
+                character: 6
+              end_position:
+                bytes: 138
+                line: 6
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 138
+                    line: 6
+                    character: 7
+                  end_position:
+                    bytes: 142
+                    line: 6
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: num6
+                trailing_trivia:
+                  - start_position:
+                      bytes: 142
+                      line: 6
+                      character: 11
+                    end_position:
+                      bytes: 143
+                      line: 6
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 143
+              line: 6
+              character: 12
+            end_position:
+              bytes: 144
+              line: 6
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 144
+                line: 6
+                character: 13
+              end_position:
+                bytes: 145
+                line: 6
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 145
+                      line: 6
+                      character: 14
+                    end_position:
+                      bytes: 155
+                      line: 6
+                      character: 24
+                    token_type:
+                      type: Number
+                      text: 1e-512_412
+                  trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/source.lua
new file mode 100644
index 00000000..b1bcb502
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/source.lua
@@ -0,0 +1,6 @@
+local num1 = 1_048_576
+local num2 = 0xFFFF_FFFF
+local num3 = 0b_0101_0101
+local num4 = 1_523_423.132_452_312
+local num5 = 1e512_412
+local num6 = 1e-512_412
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/tokens.snap
new file mode 100644
index 00000000..83883aab
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/decimal_seperators/tokens.snap
@@ -0,0 +1,534 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/roblox_cases/pass/decimal_seperators
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num1
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Number
+    text: 1_048_576
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 23
+    line: 2
+    character: 1
+  end_position:
+    bytes: 28
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 28
+    line: 2
+    character: 6
+  end_position:
+    bytes: 29
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 29
+    line: 2
+    character: 7
+  end_position:
+    bytes: 33
+    line: 2
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num2
+- start_position:
+    bytes: 33
+    line: 2
+    character: 11
+  end_position:
+    bytes: 34
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 34
+    line: 2
+    character: 12
+  end_position:
+    bytes: 35
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 35
+    line: 2
+    character: 13
+  end_position:
+    bytes: 36
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 36
+    line: 2
+    character: 14
+  end_position:
+    bytes: 47
+    line: 2
+    character: 25
+  token_type:
+    type: Number
+    text: "0xFFFF_FFFF"
+- start_position:
+    bytes: 47
+    line: 2
+    character: 25
+  end_position:
+    bytes: 48
+    line: 2
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 48
+    line: 3
+    character: 1
+  end_position:
+    bytes: 53
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 53
+    line: 3
+    character: 6
+  end_position:
+    bytes: 54
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 54
+    line: 3
+    character: 7
+  end_position:
+    bytes: 58
+    line: 3
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num3
+- start_position:
+    bytes: 58
+    line: 3
+    character: 11
+  end_position:
+    bytes: 59
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 59
+    line: 3
+    character: 12
+  end_position:
+    bytes: 60
+    line: 3
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 60
+    line: 3
+    character: 13
+  end_position:
+    bytes: 61
+    line: 3
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 61
+    line: 3
+    character: 14
+  end_position:
+    bytes: 73
+    line: 3
+    character: 26
+  token_type:
+    type: Number
+    text: 0b_0101_0101
+- start_position:
+    bytes: 73
+    line: 3
+    character: 26
+  end_position:
+    bytes: 74
+    line: 3
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 74
+    line: 4
+    character: 1
+  end_position:
+    bytes: 79
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 79
+    line: 4
+    character: 6
+  end_position:
+    bytes: 80
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 80
+    line: 4
+    character: 7
+  end_position:
+    bytes: 84
+    line: 4
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num4
+- start_position:
+    bytes: 84
+    line: 4
+    character: 11
+  end_position:
+    bytes: 85
+    line: 4
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 85
+    line: 4
+    character: 12
+  end_position:
+    bytes: 86
+    line: 4
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 86
+    line: 4
+    character: 13
+  end_position:
+    bytes: 87
+    line: 4
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 87
+    line: 4
+    character: 14
+  end_position:
+    bytes: 108
+    line: 4
+    character: 35
+  token_type:
+    type: Number
+    text: 1_523_423.132_452_312
+- start_position:
+    bytes: 108
+    line: 4
+    character: 35
+  end_position:
+    bytes: 109
+    line: 4
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 109
+    line: 5
+    character: 1
+  end_position:
+    bytes: 114
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 114
+    line: 5
+    character: 6
+  end_position:
+    bytes: 115
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 115
+    line: 5
+    character: 7
+  end_position:
+    bytes: 119
+    line: 5
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num5
+- start_position:
+    bytes: 119
+    line: 5
+    character: 11
+  end_position:
+    bytes: 120
+    line: 5
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 120
+    line: 5
+    character: 12
+  end_position:
+    bytes: 121
+    line: 5
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 121
+    line: 5
+    character: 13
+  end_position:
+    bytes: 122
+    line: 5
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 122
+    line: 5
+    character: 14
+  end_position:
+    bytes: 131
+    line: 5
+    character: 23
+  token_type:
+    type: Number
+    text: 1e512_412
+- start_position:
+    bytes: 131
+    line: 5
+    character: 23
+  end_position:
+    bytes: 132
+    line: 5
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 132
+    line: 6
+    character: 1
+  end_position:
+    bytes: 137
+    line: 6
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 137
+    line: 6
+    character: 6
+  end_position:
+    bytes: 138
+    line: 6
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 138
+    line: 6
+    character: 7
+  end_position:
+    bytes: 142
+    line: 6
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: num6
+- start_position:
+    bytes: 142
+    line: 6
+    character: 11
+  end_position:
+    bytes: 143
+    line: 6
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 143
+    line: 6
+    character: 12
+  end_position:
+    bytes: 144
+    line: 6
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 144
+    line: 6
+    character: 13
+  end_position:
+    bytes: 145
+    line: 6
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 145
+    line: 6
+    character: 14
+  end_position:
+    bytes: 155
+    line: 6
+    character: 24
+  token_type:
+    type: Number
+    text: 1e-512_412
+- start_position:
+    bytes: 155
+    line: 6
+    character: 24
+  end_position:
+    bytes: 155
+    line: 6
+    character: 24
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/ast.snap
new file mode 100644
index 00000000..31e67c65
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/ast.snap
@@ -0,0 +1,173 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 10
+                          line: 1
+                          character: 11
+                        end_position:
+                          bytes: 11
+                          line: 1
+                          character: 12
+                        token_type:
+                          type: Number
+                          text: "1"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 11
+                            line: 1
+                            character: 12
+                          end_position:
+                            bytes: 12
+                            line: 1
+                            character: 13
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  binop:
+                    DoubleSlash:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 12
+                          line: 1
+                          character: 13
+                        end_position:
+                          bytes: 14
+                          line: 1
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: //
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          end_position:
+                            bytes: 15
+                            line: 1
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 15
+                          line: 1
+                          character: 16
+                        end_position:
+                          bytes: 16
+                          line: 1
+                          character: 17
+                        token_type:
+                          type: Number
+                          text: "2"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 16
+                            line: 1
+                            character: 17
+                          end_position:
+                            bytes: 17
+                            line: 1
+                            character: 17
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/source.lua
new file mode 100644
index 00000000..8460eebb
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/source.lua
@@ -0,0 +1 @@
+local x = 1 // 2
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/tokens.snap
new file mode 100644
index 00000000..ec026300
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/floor_division/tokens.snap
@@ -0,0 +1,147 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: //
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 17
+    line: 2
+    character: 1
+  end_position:
+    bytes: 17
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/ast.snap
new file mode 100644
index 00000000..37110dd7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/ast.snap
@@ -0,0 +1,3198 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/roblox_cases/pass/if_expression
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 5
+              line: 1
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 5
+                line: 1
+                character: 6
+              end_position:
+                bytes: 6
+                line: 1
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 6
+                    line: 1
+                    character: 7
+                  end_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: x
+                trailing_trivia:
+                  - start_position:
+                      bytes: 7
+                      line: 1
+                      character: 8
+                    end_position:
+                      bytes: 8
+                      line: 1
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 8
+              line: 1
+              character: 9
+            end_position:
+              bytes: 9
+              line: 1
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                IfExpression:
+                  if_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 10
+                        line: 1
+                        character: 11
+                      end_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: if
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 12
+                          line: 1
+                          character: 13
+                        end_position:
+                          bytes: 13
+                          line: 1
+                          character: 14
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  condition:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 13
+                            line: 1
+                            character: 14
+                          end_position:
+                            bytes: 16
+                            line: 1
+                            character: 17
+                          token_type:
+                            type: Identifier
+                            identifier: foo
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 16
+                              line: 1
+                              character: 17
+                            end_position:
+                              bytes: 17
+                              line: 1
+                              character: 18
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  then_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 17
+                        line: 1
+                        character: 18
+                      end_position:
+                        bytes: 21
+                        line: 1
+                        character: 22
+                      token_type:
+                        type: Symbol
+                        symbol: then
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 21
+                          line: 1
+                          character: 22
+                        end_position:
+                          bytes: 22
+                          line: 1
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  if_expression:
+                    Var:
+                      Expression:
+                        prefix:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 22
+                                line: 1
+                                character: 23
+                              end_position:
+                                bytes: 25
+                                line: 1
+                                character: 26
+                              token_type:
+                                type: Identifier
+                                identifier: foo
+                            trailing_trivia: []
+                        suffixes:
+                          - Index:
+                              Dot:
+                                dot:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 25
+                                      line: 1
+                                      character: 26
+                                    end_position:
+                                      bytes: 26
+                                      line: 1
+                                      character: 27
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "."
+                                  trailing_trivia: []
+                                name:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 26
+                                      line: 1
+                                      character: 27
+                                    end_position:
+                                      bytes: 27
+                                      line: 1
+                                      character: 28
+                                    token_type:
+                                      type: Identifier
+                                      identifier: x
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 27
+                                        line: 1
+                                        character: 28
+                                      end_position:
+                                        bytes: 28
+                                        line: 1
+                                        character: 29
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                  else_if_expressions: ~
+                  else_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 28
+                        line: 1
+                        character: 29
+                      end_position:
+                        bytes: 32
+                        line: 1
+                        character: 33
+                      token_type:
+                        type: Symbol
+                        symbol: else
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 32
+                          line: 1
+                          character: 33
+                        end_position:
+                          bytes: 33
+                          line: 1
+                          character: 34
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  else_expression:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 33
+                          line: 1
+                          character: 34
+                        end_position:
+                          bytes: 34
+                          line: 1
+                          character: 35
+                        token_type:
+                          type: Number
+                          text: "5"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 34
+                            line: 1
+                            character: 35
+                          end_position:
+                            bytes: 35
+                            line: 1
+                            character: 35
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 35
+              line: 2
+              character: 1
+            end_position:
+              bytes: 40
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 40
+                line: 2
+                character: 6
+              end_position:
+                bytes: 41
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 41
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 42
+                    line: 2
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: y
+                trailing_trivia:
+                  - start_position:
+                      bytes: 42
+                      line: 2
+                      character: 8
+                    end_position:
+                      bytes: 43
+                      line: 2
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 43
+              line: 2
+              character: 9
+            end_position:
+              bytes: 44
+              line: 2
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 44
+                line: 2
+                character: 10
+              end_position:
+                bytes: 45
+                line: 2
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                FunctionCall:
+                  prefix:
+                    Expression:
+                      Parentheses:
+                        contained:
+                          tokens:
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 45
+                                  line: 2
+                                  character: 11
+                                end_position:
+                                  bytes: 46
+                                  line: 2
+                                  character: 12
+                                token_type:
+                                  type: Symbol
+                                  symbol: (
+                              trailing_trivia: []
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 79
+                                  line: 2
+                                  character: 45
+                                end_position:
+                                  bytes: 80
+                                  line: 2
+                                  character: 46
+                                token_type:
+                                  type: Symbol
+                                  symbol: )
+                              trailing_trivia: []
+                        expression:
+                          IfExpression:
+                            if_token:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 46
+                                  line: 2
+                                  character: 12
+                                end_position:
+                                  bytes: 48
+                                  line: 2
+                                  character: 14
+                                token_type:
+                                  type: Symbol
+                                  symbol: if
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 48
+                                    line: 2
+                                    character: 14
+                                  end_position:
+                                    bytes: 49
+                                    line: 2
+                                    character: 15
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            condition:
+                              Var:
+                                Name:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 49
+                                      line: 2
+                                      character: 15
+                                    end_position:
+                                      bytes: 50
+                                      line: 2
+                                      character: 16
+                                    token_type:
+                                      type: Identifier
+                                      identifier: x
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 50
+                                        line: 2
+                                        character: 16
+                                      end_position:
+                                        bytes: 51
+                                        line: 2
+                                        character: 17
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                            then_token:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 51
+                                  line: 2
+                                  character: 17
+                                end_position:
+                                  bytes: 55
+                                  line: 2
+                                  character: 21
+                                token_type:
+                                  type: Symbol
+                                  symbol: then
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 55
+                                    line: 2
+                                    character: 21
+                                  end_position:
+                                    bytes: 56
+                                    line: 2
+                                    character: 22
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            if_expression:
+                              Var:
+                                Expression:
+                                  prefix:
+                                    Name:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 56
+                                          line: 2
+                                          character: 22
+                                        end_position:
+                                          bytes: 57
+                                          line: 2
+                                          character: 23
+                                        token_type:
+                                          type: Identifier
+                                          identifier: x
+                                      trailing_trivia: []
+                                  suffixes:
+                                    - Index:
+                                        Dot:
+                                          dot:
+                                            leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 57
+                                                line: 2
+                                                character: 23
+                                              end_position:
+                                                bytes: 58
+                                                line: 2
+                                                character: 24
+                                              token_type:
+                                                type: Symbol
+                                                symbol: "."
+                                            trailing_trivia: []
+                                          name:
+                                            leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 58
+                                                line: 2
+                                                character: 24
+                                              end_position:
+                                                bytes: 65
+                                                line: 2
+                                                character: 31
+                                              token_type:
+                                                type: Identifier
+                                                identifier: indices
+                                            trailing_trivia:
+                                              - start_position:
+                                                  bytes: 65
+                                                  line: 2
+                                                  character: 31
+                                                end_position:
+                                                  bytes: 66
+                                                  line: 2
+                                                  character: 32
+                                                token_type:
+                                                  type: Whitespace
+                                                  characters: " "
+                            else_if_expressions: ~
+                            else_token:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 66
+                                  line: 2
+                                  character: 32
+                                end_position:
+                                  bytes: 70
+                                  line: 2
+                                  character: 36
+                                token_type:
+                                  type: Symbol
+                                  symbol: else
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 70
+                                    line: 2
+                                    character: 36
+                                  end_position:
+                                    bytes: 71
+                                    line: 2
+                                    character: 37
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            else_expression:
+                              FunctionCall:
+                                prefix:
+                                  Name:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 71
+                                        line: 2
+                                        character: 37
+                                      end_position:
+                                        bytes: 77
+                                        line: 2
+                                        character: 43
+                                      token_type:
+                                        type: Identifier
+                                        identifier: create
+                                    trailing_trivia: []
+                                suffixes:
+                                  - Call:
+                                      AnonymousCall:
+                                        Parentheses:
+                                          parentheses:
+                                            tokens:
+                                              - leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 77
+                                                    line: 2
+                                                    character: 43
+                                                  end_position:
+                                                    bytes: 78
+                                                    line: 2
+                                                    character: 44
+                                                  token_type:
+                                                    type: Symbol
+                                                    symbol: (
+                                                trailing_trivia: []
+                                              - leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 78
+                                                    line: 2
+                                                    character: 44
+                                                  end_position:
+                                                    bytes: 79
+                                                    line: 2
+                                                    character: 45
+                                                  token_type:
+                                                    type: Symbol
+                                                    symbol: )
+                                                trailing_trivia: []
+                                          arguments:
+                                            pairs: []
+                  suffixes:
+                    - Call:
+                        MethodCall:
+                          colon_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 80
+                                line: 2
+                                character: 46
+                              end_position:
+                                bytes: 81
+                                line: 2
+                                character: 47
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 81
+                                line: 2
+                                character: 47
+                              end_position:
+                                bytes: 87
+                                line: 2
+                                character: 53
+                              token_type:
+                                type: Identifier
+                                identifier: update
+                            trailing_trivia: []
+                          args:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 87
+                                        line: 2
+                                        character: 53
+                                      end_position:
+                                        bytes: 88
+                                        line: 2
+                                        character: 54
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 134
+                                        line: 2
+                                        character: 100
+                                      end_position:
+                                        bytes: 135
+                                        line: 2
+                                        character: 101
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 135
+                                          line: 2
+                                          character: 101
+                                        end_position:
+                                          bytes: 136
+                                          line: 2
+                                          character: 101
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs:
+                                  - End:
+                                      IfExpression:
+                                        if_token:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 88
+                                              line: 2
+                                              character: 54
+                                            end_position:
+                                              bytes: 90
+                                              line: 2
+                                              character: 56
+                                            token_type:
+                                              type: Symbol
+                                              symbol: if
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 90
+                                                line: 2
+                                                character: 56
+                                              end_position:
+                                                bytes: 91
+                                                line: 2
+                                                character: 57
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                        condition:
+                                          Var:
+                                            Name:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 91
+                                                  line: 2
+                                                  character: 57
+                                                end_position:
+                                                  bytes: 103
+                                                  line: 2
+                                                  character: 69
+                                                token_type:
+                                                  type: Identifier
+                                                  identifier: shouldUpdate
+                                              trailing_trivia:
+                                                - start_position:
+                                                    bytes: 103
+                                                    line: 2
+                                                    character: 69
+                                                  end_position:
+                                                    bytes: 104
+                                                    line: 2
+                                                    character: 70
+                                                  token_type:
+                                                    type: Whitespace
+                                                    characters: " "
+                                        then_token:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 104
+                                              line: 2
+                                              character: 70
+                                            end_position:
+                                              bytes: 108
+                                              line: 2
+                                              character: 74
+                                            token_type:
+                                              type: Symbol
+                                              symbol: then
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 108
+                                                line: 2
+                                                character: 74
+                                              end_position:
+                                                bytes: 109
+                                                line: 2
+                                                character: 75
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                        if_expression:
+                                          Var:
+                                            Name:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 109
+                                                  line: 2
+                                                  character: 75
+                                                end_position:
+                                                  bytes: 120
+                                                  line: 2
+                                                  character: 86
+                                                token_type:
+                                                  type: Identifier
+                                                  identifier: information
+                                              trailing_trivia:
+                                                - start_position:
+                                                    bytes: 120
+                                                    line: 2
+                                                    character: 86
+                                                  end_position:
+                                                    bytes: 121
+                                                    line: 2
+                                                    character: 87
+                                                  token_type:
+                                                    type: Whitespace
+                                                    characters: " "
+                                        else_if_expressions: ~
+                                        else_token:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 121
+                                              line: 2
+                                              character: 87
+                                            end_position:
+                                              bytes: 125
+                                              line: 2
+                                              character: 91
+                                            token_type:
+                                              type: Symbol
+                                              symbol: else
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 125
+                                                line: 2
+                                                character: 91
+                                              end_position:
+                                                bytes: 126
+                                                line: 2
+                                                character: 92
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                        else_expression:
+                                          Var:
+                                            Name:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 126
+                                                  line: 2
+                                                  character: 92
+                                                end_position:
+                                                  bytes: 134
+                                                  line: 2
+                                                  character: 100
+                                                token_type:
+                                                  type: Identifier
+                                                  identifier: defaults
+                                              trailing_trivia: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 136
+              line: 3
+              character: 1
+            end_position:
+              bytes: 141
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 141
+                line: 3
+                character: 6
+              end_position:
+                bytes: 142
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 142
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 143
+                    line: 3
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: z
+                trailing_trivia:
+                  - start_position:
+                      bytes: 143
+                      line: 3
+                      character: 8
+                    end_position:
+                      bytes: 144
+                      line: 3
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 144
+              line: 3
+              character: 9
+            end_position:
+              bytes: 145
+              line: 3
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 145
+                line: 3
+                character: 10
+              end_position:
+                bytes: 146
+                line: 3
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TypeAssertion:
+                  expression:
+                    Parentheses:
+                      contained:
+                        tokens:
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 146
+                                line: 3
+                                character: 11
+                              end_position:
+                                bytes: 147
+                                line: 3
+                                character: 12
+                              token_type:
+                                type: Symbol
+                                symbol: (
+                            trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 171
+                                line: 3
+                                character: 36
+                              end_position:
+                                bytes: 172
+                                line: 3
+                                character: 37
+                              token_type:
+                                type: Symbol
+                                symbol: )
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 172
+                                  line: 3
+                                  character: 37
+                                end_position:
+                                  bytes: 173
+                                  line: 3
+                                  character: 38
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      expression:
+                        IfExpression:
+                          if_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 147
+                                line: 3
+                                character: 12
+                              end_position:
+                                bytes: 149
+                                line: 3
+                                character: 14
+                              token_type:
+                                type: Symbol
+                                symbol: if
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 149
+                                  line: 3
+                                  character: 14
+                                end_position:
+                                  bytes: 150
+                                  line: 3
+                                  character: 15
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          condition:
+                            Var:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 150
+                                    line: 3
+                                    character: 15
+                                  end_position:
+                                    bytes: 153
+                                    line: 3
+                                    character: 18
+                                  token_type:
+                                    type: Identifier
+                                    identifier: bar
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 153
+                                      line: 3
+                                      character: 18
+                                    end_position:
+                                      bytes: 154
+                                      line: 3
+                                      character: 19
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                          then_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 154
+                                line: 3
+                                character: 19
+                              end_position:
+                                bytes: 158
+                                line: 3
+                                character: 23
+                              token_type:
+                                type: Symbol
+                                symbol: then
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 158
+                                  line: 3
+                                  character: 23
+                                end_position:
+                                  bytes: 159
+                                  line: 3
+                                  character: 24
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          if_expression:
+                            Var:
+                              Expression:
+                                prefix:
+                                  Name:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 159
+                                        line: 3
+                                        character: 24
+                                      end_position:
+                                        bytes: 162
+                                        line: 3
+                                        character: 27
+                                      token_type:
+                                        type: Identifier
+                                        identifier: foo
+                                    trailing_trivia: []
+                                suffixes:
+                                  - Index:
+                                      Dot:
+                                        dot:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 162
+                                              line: 3
+                                              character: 27
+                                            end_position:
+                                              bytes: 163
+                                              line: 3
+                                              character: 28
+                                            token_type:
+                                              type: Symbol
+                                              symbol: "."
+                                          trailing_trivia: []
+                                        name:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 163
+                                              line: 3
+                                              character: 28
+                                            end_position:
+                                              bytes: 164
+                                              line: 3
+                                              character: 29
+                                            token_type:
+                                              type: Identifier
+                                              identifier: y
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 164
+                                                line: 3
+                                                character: 29
+                                              end_position:
+                                                bytes: 165
+                                                line: 3
+                                                character: 30
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                          else_if_expressions: ~
+                          else_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 165
+                                line: 3
+                                character: 30
+                              end_position:
+                                bytes: 169
+                                line: 3
+                                character: 34
+                              token_type:
+                                type: Symbol
+                                symbol: else
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 169
+                                  line: 3
+                                  character: 34
+                                end_position:
+                                  bytes: 170
+                                  line: 3
+                                  character: 35
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          else_expression:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 170
+                                  line: 3
+                                  character: 35
+                                end_position:
+                                  bytes: 171
+                                  line: 3
+                                  character: 36
+                                token_type:
+                                  type: Number
+                                  text: "5"
+                              trailing_trivia: []
+                  type_assertion:
+                    assertion_op:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 173
+                          line: 3
+                          character: 38
+                        end_position:
+                          bytes: 175
+                          line: 3
+                          character: 40
+                        token_type:
+                          type: Symbol
+                          symbol: "::"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 175
+                            line: 3
+                            character: 40
+                          end_position:
+                            bytes: 176
+                            line: 3
+                            character: 41
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    cast_to:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 176
+                            line: 3
+                            character: 41
+                          end_position:
+                            bytes: 182
+                            line: 3
+                            character: 47
+                          token_type:
+                            type: Identifier
+                            identifier: number
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 182
+                              line: 3
+                              character: 47
+                            end_position:
+                              bytes: 183
+                              line: 3
+                              character: 47
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 183
+                line: 4
+                character: 1
+              end_position:
+                bytes: 184
+                line: 4
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 184
+              line: 5
+              character: 1
+            end_position:
+              bytes: 189
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 189
+                line: 5
+                character: 6
+              end_position:
+                bytes: 190
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 190
+                    line: 5
+                    character: 7
+                  end_position:
+                    bytes: 191
+                    line: 5
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: a
+                trailing_trivia:
+                  - start_position:
+                      bytes: 191
+                      line: 5
+                      character: 8
+                    end_position:
+                      bytes: 192
+                      line: 5
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 192
+              line: 5
+              character: 9
+            end_position:
+              bytes: 193
+              line: 5
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 193
+                line: 5
+                character: 10
+              end_position:
+                bytes: 194
+                line: 5
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                IfExpression:
+                  if_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 194
+                        line: 5
+                        character: 11
+                      end_position:
+                        bytes: 196
+                        line: 5
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: if
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 196
+                          line: 5
+                          character: 13
+                        end_position:
+                          bytes: 197
+                          line: 5
+                          character: 14
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  condition:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 197
+                            line: 5
+                            character: 14
+                          end_position:
+                            bytes: 200
+                            line: 5
+                            character: 17
+                          token_type:
+                            type: Identifier
+                            identifier: foo
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 200
+                              line: 5
+                              character: 17
+                            end_position:
+                              bytes: 201
+                              line: 5
+                              character: 18
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  then_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 201
+                        line: 5
+                        character: 18
+                      end_position:
+                        bytes: 205
+                        line: 5
+                        character: 22
+                      token_type:
+                        type: Symbol
+                        symbol: then
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 205
+                          line: 5
+                          character: 22
+                        end_position:
+                          bytes: 206
+                          line: 5
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  if_expression:
+                    Var:
+                      Expression:
+                        prefix:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 206
+                                line: 5
+                                character: 23
+                              end_position:
+                                bytes: 209
+                                line: 5
+                                character: 26
+                              token_type:
+                                type: Identifier
+                                identifier: foo
+                            trailing_trivia: []
+                        suffixes:
+                          - Index:
+                              Dot:
+                                dot:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 209
+                                      line: 5
+                                      character: 26
+                                    end_position:
+                                      bytes: 210
+                                      line: 5
+                                      character: 27
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "."
+                                  trailing_trivia: []
+                                name:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 210
+                                      line: 5
+                                      character: 27
+                                    end_position:
+                                      bytes: 211
+                                      line: 5
+                                      character: 28
+                                    token_type:
+                                      type: Identifier
+                                      identifier: x
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 211
+                                        line: 5
+                                        character: 28
+                                      end_position:
+                                        bytes: 212
+                                        line: 5
+                                        character: 29
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                  else_if_expressions:
+                    - else_if_token:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 212
+                            line: 5
+                            character: 29
+                          end_position:
+                            bytes: 218
+                            line: 5
+                            character: 35
+                          token_type:
+                            type: Symbol
+                            symbol: elseif
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 218
+                              line: 5
+                              character: 35
+                            end_position:
+                              bytes: 219
+                              line: 5
+                              character: 36
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      condition:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 219
+                                line: 5
+                                character: 36
+                              end_position:
+                                bytes: 222
+                                line: 5
+                                character: 39
+                              token_type:
+                                type: Identifier
+                                identifier: bar
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 222
+                                  line: 5
+                                  character: 39
+                                end_position:
+                                  bytes: 223
+                                  line: 5
+                                  character: 40
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      then_token:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 223
+                            line: 5
+                            character: 40
+                          end_position:
+                            bytes: 227
+                            line: 5
+                            character: 44
+                          token_type:
+                            type: Symbol
+                            symbol: then
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 227
+                              line: 5
+                              character: 44
+                            end_position:
+                              bytes: 228
+                              line: 5
+                              character: 45
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      expression:
+                        Var:
+                          Expression:
+                            prefix:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 228
+                                    line: 5
+                                    character: 45
+                                  end_position:
+                                    bytes: 231
+                                    line: 5
+                                    character: 48
+                                  token_type:
+                                    type: Identifier
+                                    identifier: bar
+                                trailing_trivia: []
+                            suffixes:
+                              - Index:
+                                  Dot:
+                                    dot:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 231
+                                          line: 5
+                                          character: 48
+                                        end_position:
+                                          bytes: 232
+                                          line: 5
+                                          character: 49
+                                        token_type:
+                                          type: Symbol
+                                          symbol: "."
+                                      trailing_trivia: []
+                                    name:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 232
+                                          line: 5
+                                          character: 49
+                                        end_position:
+                                          bytes: 233
+                                          line: 5
+                                          character: 50
+                                        token_type:
+                                          type: Identifier
+                                          identifier: x
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 233
+                                            line: 5
+                                            character: 50
+                                          end_position:
+                                            bytes: 234
+                                            line: 5
+                                            character: 51
+                                          token_type:
+                                            type: Whitespace
+                                            characters: " "
+                  else_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 234
+                        line: 5
+                        character: 51
+                      end_position:
+                        bytes: 238
+                        line: 5
+                        character: 55
+                      token_type:
+                        type: Symbol
+                        symbol: else
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 238
+                          line: 5
+                          character: 55
+                        end_position:
+                          bytes: 239
+                          line: 5
+                          character: 56
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  else_expression:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 239
+                          line: 5
+                          character: 56
+                        end_position:
+                          bytes: 240
+                          line: 5
+                          character: 57
+                        token_type:
+                          type: Number
+                          text: "5"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 240
+                            line: 5
+                            character: 57
+                          end_position:
+                            bytes: 241
+                            line: 5
+                            character: 57
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 241
+              line: 6
+              character: 1
+            end_position:
+              bytes: 246
+              line: 6
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 246
+                line: 6
+                character: 6
+              end_position:
+                bytes: 247
+                line: 6
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 247
+                    line: 6
+                    character: 7
+                  end_position:
+                    bytes: 248
+                    line: 6
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: b
+                trailing_trivia:
+                  - start_position:
+                      bytes: 248
+                      line: 6
+                      character: 8
+                    end_position:
+                      bytes: 249
+                      line: 6
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 249
+              line: 6
+              character: 9
+            end_position:
+              bytes: 250
+              line: 6
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 250
+                line: 6
+                character: 10
+              end_position:
+                bytes: 251
+                line: 6
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                IfExpression:
+                  if_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 251
+                        line: 6
+                        character: 11
+                      end_position:
+                        bytes: 253
+                        line: 6
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: if
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 253
+                          line: 6
+                          character: 13
+                        end_position:
+                          bytes: 254
+                          line: 6
+                          character: 14
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  condition:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 254
+                            line: 6
+                            character: 14
+                          end_position:
+                            bytes: 257
+                            line: 6
+                            character: 17
+                          token_type:
+                            type: Identifier
+                            identifier: foo
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 257
+                              line: 6
+                              character: 17
+                            end_position:
+                              bytes: 258
+                              line: 6
+                              character: 18
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  then_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 258
+                        line: 6
+                        character: 18
+                      end_position:
+                        bytes: 262
+                        line: 6
+                        character: 22
+                      token_type:
+                        type: Symbol
+                        symbol: then
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 262
+                          line: 6
+                          character: 22
+                        end_position:
+                          bytes: 263
+                          line: 6
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  if_expression:
+                    IfExpression:
+                      if_token:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 263
+                            line: 6
+                            character: 23
+                          end_position:
+                            bytes: 265
+                            line: 6
+                            character: 25
+                          token_type:
+                            type: Symbol
+                            symbol: if
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 265
+                              line: 6
+                              character: 25
+                            end_position:
+                              bytes: 266
+                              line: 6
+                              character: 26
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      condition:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 266
+                                line: 6
+                                character: 26
+                              end_position:
+                                bytes: 269
+                                line: 6
+                                character: 29
+                              token_type:
+                                type: Identifier
+                                identifier: bar
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 269
+                                  line: 6
+                                  character: 29
+                                end_position:
+                                  bytes: 270
+                                  line: 6
+                                  character: 30
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      then_token:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 270
+                            line: 6
+                            character: 30
+                          end_position:
+                            bytes: 274
+                            line: 6
+                            character: 34
+                          token_type:
+                            type: Symbol
+                            symbol: then
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 274
+                              line: 6
+                              character: 34
+                            end_position:
+                              bytes: 275
+                              line: 6
+                              character: 35
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      if_expression:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 275
+                                line: 6
+                                character: 35
+                              end_position:
+                                bytes: 278
+                                line: 6
+                                character: 38
+                              token_type:
+                                type: Identifier
+                                identifier: bar
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 278
+                                  line: 6
+                                  character: 38
+                                end_position:
+                                  bytes: 279
+                                  line: 6
+                                  character: 39
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      else_if_expressions: ~
+                      else_token:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 279
+                            line: 6
+                            character: 39
+                          end_position:
+                            bytes: 283
+                            line: 6
+                            character: 43
+                          token_type:
+                            type: Symbol
+                            symbol: else
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 283
+                              line: 6
+                              character: 43
+                            end_position:
+                              bytes: 284
+                              line: 6
+                              character: 44
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      else_expression:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 284
+                                line: 6
+                                character: 44
+                              end_position:
+                                bytes: 287
+                                line: 6
+                                character: 47
+                              token_type:
+                                type: Identifier
+                                identifier: foo
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 287
+                                  line: 6
+                                  character: 47
+                                end_position:
+                                  bytes: 288
+                                  line: 6
+                                  character: 48
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                  else_if_expressions: ~
+                  else_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 288
+                        line: 6
+                        character: 48
+                      end_position:
+                        bytes: 292
+                        line: 6
+                        character: 52
+                      token_type:
+                        type: Symbol
+                        symbol: else
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 292
+                          line: 6
+                          character: 52
+                        end_position:
+                          bytes: 293
+                          line: 6
+                          character: 53
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  else_expression:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 293
+                          line: 6
+                          character: 53
+                        end_position:
+                          bytes: 294
+                          line: 6
+                          character: 54
+                        token_type:
+                          type: Number
+                          text: "5"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 294
+                            line: 6
+                            character: 54
+                          end_position:
+                            bytes: 295
+                            line: 6
+                            character: 54
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 295
+              line: 7
+              character: 1
+            end_position:
+              bytes: 300
+              line: 7
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 300
+                line: 7
+                character: 6
+              end_position:
+                bytes: 301
+                line: 7
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 301
+                    line: 7
+                    character: 7
+                  end_position:
+                    bytes: 302
+                    line: 7
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: c
+                trailing_trivia:
+                  - start_position:
+                      bytes: 302
+                      line: 7
+                      character: 8
+                    end_position:
+                      bytes: 303
+                      line: 7
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 303
+              line: 7
+              character: 9
+            end_position:
+              bytes: 304
+              line: 7
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 304
+                line: 7
+                character: 10
+              end_position:
+                bytes: 305
+                line: 7
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                IfExpression:
+                  if_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 305
+                        line: 7
+                        character: 11
+                      end_position:
+                        bytes: 307
+                        line: 7
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: if
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 307
+                          line: 7
+                          character: 13
+                        end_position:
+                          bytes: 308
+                          line: 7
+                          character: 14
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  condition:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 308
+                            line: 7
+                            character: 14
+                          end_position:
+                            bytes: 311
+                            line: 7
+                            character: 17
+                          token_type:
+                            type: Identifier
+                            identifier: foo
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 311
+                              line: 7
+                              character: 17
+                            end_position:
+                              bytes: 312
+                              line: 7
+                              character: 18
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  then_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 312
+                        line: 7
+                        character: 18
+                      end_position:
+                        bytes: 316
+                        line: 7
+                        character: 22
+                      token_type:
+                        type: Symbol
+                        symbol: then
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 316
+                          line: 7
+                          character: 22
+                        end_position:
+                          bytes: 317
+                          line: 7
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  if_expression:
+                    Parentheses:
+                      contained:
+                        tokens:
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 317
+                                line: 7
+                                character: 23
+                              end_position:
+                                bytes: 318
+                                line: 7
+                                character: 24
+                              token_type:
+                                type: Symbol
+                                symbol: (
+                            trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 333
+                                line: 7
+                                character: 39
+                              end_position:
+                                bytes: 334
+                                line: 7
+                                character: 40
+                              token_type:
+                                type: Symbol
+                                symbol: )
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 334
+                                  line: 7
+                                  character: 40
+                                end_position:
+                                  bytes: 335
+                                  line: 7
+                                  character: 41
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      expression:
+                        TypeAssertion:
+                          expression:
+                            Var:
+                              Expression:
+                                prefix:
+                                  Name:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 318
+                                        line: 7
+                                        character: 24
+                                      end_position:
+                                        bytes: 321
+                                        line: 7
+                                        character: 27
+                                      token_type:
+                                        type: Identifier
+                                        identifier: foo
+                                    trailing_trivia: []
+                                suffixes:
+                                  - Index:
+                                      Dot:
+                                        dot:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 321
+                                              line: 7
+                                              character: 27
+                                            end_position:
+                                              bytes: 322
+                                              line: 7
+                                              character: 28
+                                            token_type:
+                                              type: Symbol
+                                              symbol: "."
+                                          trailing_trivia: []
+                                        name:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 322
+                                              line: 7
+                                              character: 28
+                                            end_position:
+                                              bytes: 323
+                                              line: 7
+                                              character: 29
+                                            token_type:
+                                              type: Identifier
+                                              identifier: x
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 323
+                                                line: 7
+                                                character: 29
+                                              end_position:
+                                                bytes: 324
+                                                line: 7
+                                                character: 30
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                          type_assertion:
+                            assertion_op:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 324
+                                  line: 7
+                                  character: 30
+                                end_position:
+                                  bytes: 326
+                                  line: 7
+                                  character: 32
+                                token_type:
+                                  type: Symbol
+                                  symbol: "::"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 326
+                                    line: 7
+                                    character: 32
+                                  end_position:
+                                    bytes: 327
+                                    line: 7
+                                    character: 33
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            cast_to:
+                              Basic:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 327
+                                    line: 7
+                                    character: 33
+                                  end_position:
+                                    bytes: 333
+                                    line: 7
+                                    character: 39
+                                  token_type:
+                                    type: Identifier
+                                    identifier: number
+                                trailing_trivia: []
+                  else_if_expressions:
+                    - else_if_token:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 335
+                            line: 7
+                            character: 41
+                          end_position:
+                            bytes: 341
+                            line: 7
+                            character: 47
+                          token_type:
+                            type: Symbol
+                            symbol: elseif
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 341
+                              line: 7
+                              character: 47
+                            end_position:
+                              bytes: 342
+                              line: 7
+                              character: 48
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      condition:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 342
+                                line: 7
+                                character: 48
+                              end_position:
+                                bytes: 345
+                                line: 7
+                                character: 51
+                              token_type:
+                                type: Identifier
+                                identifier: bar
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 345
+                                  line: 7
+                                  character: 51
+                                end_position:
+                                  bytes: 346
+                                  line: 7
+                                  character: 52
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      then_token:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 346
+                            line: 7
+                            character: 52
+                          end_position:
+                            bytes: 350
+                            line: 7
+                            character: 56
+                          token_type:
+                            type: Symbol
+                            symbol: then
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 350
+                              line: 7
+                              character: 56
+                            end_position:
+                              bytes: 351
+                              line: 7
+                              character: 57
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      expression:
+                        FunctionCall:
+                          prefix:
+                            Name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 351
+                                  line: 7
+                                  character: 57
+                                end_position:
+                                  bytes: 354
+                                  line: 7
+                                  character: 60
+                                token_type:
+                                  type: Identifier
+                                  identifier: bar
+                              trailing_trivia: []
+                          suffixes:
+                            - Index:
+                                Dot:
+                                  dot:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 354
+                                        line: 7
+                                        character: 60
+                                      end_position:
+                                        bytes: 355
+                                        line: 7
+                                        character: 61
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "."
+                                    trailing_trivia: []
+                                  name:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 355
+                                        line: 7
+                                        character: 61
+                                      end_position:
+                                        bytes: 356
+                                        line: 7
+                                        character: 62
+                                      token_type:
+                                        type: Identifier
+                                        identifier: x
+                                    trailing_trivia: []
+                            - Call:
+                                AnonymousCall:
+                                  Parentheses:
+                                    parentheses:
+                                      tokens:
+                                        - leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 356
+                                              line: 7
+                                              character: 62
+                                            end_position:
+                                              bytes: 357
+                                              line: 7
+                                              character: 63
+                                            token_type:
+                                              type: Symbol
+                                              symbol: (
+                                          trailing_trivia: []
+                                        - leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 357
+                                              line: 7
+                                              character: 63
+                                            end_position:
+                                              bytes: 358
+                                              line: 7
+                                              character: 64
+                                            token_type:
+                                              type: Symbol
+                                              symbol: )
+                                          trailing_trivia: []
+                                    arguments:
+                                      pairs: []
+                            - Call:
+                                AnonymousCall:
+                                  Parentheses:
+                                    parentheses:
+                                      tokens:
+                                        - leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 358
+                                              line: 7
+                                              character: 64
+                                            end_position:
+                                              bytes: 359
+                                              line: 7
+                                              character: 65
+                                            token_type:
+                                              type: Symbol
+                                              symbol: (
+                                          trailing_trivia: []
+                                        - leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 359
+                                              line: 7
+                                              character: 65
+                                            end_position:
+                                              bytes: 360
+                                              line: 7
+                                              character: 66
+                                            token_type:
+                                              type: Symbol
+                                              symbol: )
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 360
+                                                line: 7
+                                                character: 66
+                                              end_position:
+                                                bytes: 361
+                                                line: 7
+                                                character: 67
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                    arguments:
+                                      pairs: []
+                  else_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 361
+                        line: 7
+                        character: 67
+                      end_position:
+                        bytes: 365
+                        line: 7
+                        character: 71
+                      token_type:
+                        type: Symbol
+                        symbol: else
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 365
+                          line: 7
+                          character: 71
+                        end_position:
+                          bytes: 366
+                          line: 7
+                          character: 72
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  else_expression:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 366
+                          line: 7
+                          character: 72
+                        end_position:
+                          bytes: 367
+                          line: 7
+                          character: 73
+                        token_type:
+                          type: Number
+                          text: "5"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 367
+                            line: 7
+                            character: 73
+                          end_position:
+                            bytes: 368
+                            line: 7
+                            character: 73
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 368
+              line: 8
+              character: 1
+            end_position:
+              bytes: 373
+              line: 8
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 373
+                line: 8
+                character: 6
+              end_position:
+                bytes: 374
+                line: 8
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 374
+                    line: 8
+                    character: 7
+                  end_position:
+                    bytes: 375
+                    line: 8
+                    character: 8
+                  token_type:
+                    type: Identifier
+                    identifier: d
+                trailing_trivia:
+                  - start_position:
+                      bytes: 375
+                      line: 8
+                      character: 8
+                    end_position:
+                      bytes: 376
+                      line: 8
+                      character: 9
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 376
+              line: 8
+              character: 9
+            end_position:
+              bytes: 377
+              line: 8
+              character: 10
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 377
+                line: 8
+                character: 10
+              end_position:
+                bytes: 378
+                line: 8
+                character: 11
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                IfExpression:
+                  if_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 378
+                        line: 8
+                        character: 11
+                      end_position:
+                        bytes: 380
+                        line: 8
+                        character: 13
+                      token_type:
+                        type: Symbol
+                        symbol: if
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 380
+                          line: 8
+                          character: 13
+                        end_position:
+                          bytes: 381
+                          line: 8
+                          character: 14
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  condition:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 381
+                            line: 8
+                            character: 14
+                          end_position:
+                            bytes: 384
+                            line: 8
+                            character: 17
+                          token_type:
+                            type: Identifier
+                            identifier: foo
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 384
+                              line: 8
+                              character: 17
+                            end_position:
+                              bytes: 385
+                              line: 8
+                              character: 18
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  then_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 385
+                        line: 8
+                        character: 18
+                      end_position:
+                        bytes: 389
+                        line: 8
+                        character: 22
+                      token_type:
+                        type: Symbol
+                        symbol: then
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 389
+                          line: 8
+                          character: 22
+                        end_position:
+                          bytes: 390
+                          line: 8
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  if_expression:
+                    Number:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 390
+                          line: 8
+                          character: 23
+                        end_position:
+                          bytes: 391
+                          line: 8
+                          character: 24
+                        token_type:
+                          type: Number
+                          text: "5"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 391
+                            line: 8
+                            character: 24
+                          end_position:
+                            bytes: 392
+                            line: 8
+                            character: 25
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  else_if_expressions: ~
+                  else_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 392
+                        line: 8
+                        character: 25
+                      end_position:
+                        bytes: 396
+                        line: 8
+                        character: 29
+                      token_type:
+                        type: Symbol
+                        symbol: else
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 396
+                          line: 8
+                          character: 29
+                        end_position:
+                          bytes: 397
+                          line: 8
+                          character: 30
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  else_expression:
+                    TypeAssertion:
+                      expression:
+                        Var:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 397
+                                line: 8
+                                character: 30
+                              end_position:
+                                bytes: 400
+                                line: 8
+                                character: 33
+                              token_type:
+                                type: Identifier
+                                identifier: baz
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 400
+                                  line: 8
+                                  character: 33
+                                end_position:
+                                  bytes: 401
+                                  line: 8
+                                  character: 34
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      type_assertion:
+                        assertion_op:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 401
+                              line: 8
+                              character: 34
+                            end_position:
+                              bytes: 403
+                              line: 8
+                              character: 36
+                            token_type:
+                              type: Symbol
+                              symbol: "::"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 403
+                                line: 8
+                                character: 36
+                              end_position:
+                                bytes: 404
+                                line: 8
+                                character: 37
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                        cast_to:
+                          Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 404
+                                line: 8
+                                character: 37
+                              end_position:
+                                bytes: 410
+                                line: 8
+                                character: 43
+                              token_type:
+                                type: Identifier
+                                identifier: number
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 410
+                                  line: 8
+                                  character: 43
+                                end_position:
+                                  bytes: 411
+                                  line: 8
+                                  character: 43
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+    - ~
+  - - If:
+        if_token:
+          leading_trivia:
+            - start_position:
+                bytes: 411
+                line: 9
+                character: 1
+              end_position:
+                bytes: 412
+                line: 9
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 412
+              line: 10
+              character: 1
+            end_position:
+              bytes: 414
+              line: 10
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: if
+          trailing_trivia:
+            - start_position:
+                bytes: 414
+                line: 10
+                character: 3
+              end_position:
+                bytes: 415
+                line: 10
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: " "
+        condition:
+          IfExpression:
+            if_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 415
+                  line: 10
+                  character: 4
+                end_position:
+                  bytes: 417
+                  line: 10
+                  character: 6
+                token_type:
+                  type: Symbol
+                  symbol: if
+              trailing_trivia:
+                - start_position:
+                    bytes: 417
+                    line: 10
+                    character: 6
+                  end_position:
+                    bytes: 418
+                    line: 10
+                    character: 7
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            condition:
+              Var:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 418
+                      line: 10
+                      character: 7
+                    end_position:
+                      bytes: 421
+                      line: 10
+                      character: 10
+                    token_type:
+                      type: Identifier
+                      identifier: foo
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 421
+                        line: 10
+                        character: 10
+                      end_position:
+                        bytes: 422
+                        line: 10
+                        character: 11
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            then_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 422
+                  line: 10
+                  character: 11
+                end_position:
+                  bytes: 426
+                  line: 10
+                  character: 15
+                token_type:
+                  type: Symbol
+                  symbol: then
+              trailing_trivia:
+                - start_position:
+                    bytes: 426
+                    line: 10
+                    character: 15
+                  end_position:
+                    bytes: 427
+                    line: 10
+                    character: 16
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            if_expression:
+              Var:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 427
+                      line: 10
+                      character: 16
+                    end_position:
+                      bytes: 430
+                      line: 10
+                      character: 19
+                    token_type:
+                      type: Identifier
+                      identifier: bar
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 430
+                        line: 10
+                        character: 19
+                      end_position:
+                        bytes: 431
+                        line: 10
+                        character: 20
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            else_if_expressions: ~
+            else_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 431
+                  line: 10
+                  character: 20
+                end_position:
+                  bytes: 435
+                  line: 10
+                  character: 24
+                token_type:
+                  type: Symbol
+                  symbol: else
+              trailing_trivia:
+                - start_position:
+                    bytes: 435
+                    line: 10
+                    character: 24
+                  end_position:
+                    bytes: 436
+                    line: 10
+                    character: 25
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            else_expression:
+              Var:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 436
+                      line: 10
+                      character: 25
+                    end_position:
+                      bytes: 439
+                      line: 10
+                      character: 28
+                    token_type:
+                      type: Identifier
+                      identifier: baz
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 439
+                        line: 10
+                        character: 28
+                      end_position:
+                        bytes: 440
+                        line: 10
+                        character: 29
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        then_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 440
+              line: 10
+              character: 29
+            end_position:
+              bytes: 444
+              line: 10
+              character: 33
+            token_type:
+              type: Symbol
+              symbol: then
+          trailing_trivia:
+            - start_position:
+                bytes: 444
+                line: 10
+                character: 33
+              end_position:
+                bytes: 445
+                line: 10
+                character: 33
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts: []
+        else_if: ~
+        else_token: ~
+        else: ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 445
+              line: 11
+              character: 1
+            end_position:
+              bytes: 448
+              line: 11
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/source.lua
new file mode 100644
index 00000000..83f3860a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/source.lua
@@ -0,0 +1,11 @@
+local x = if foo then foo.x else 5
+local y = (if x then x.indices else create()):update(if shouldUpdate then information else defaults)
+local z = (if bar then foo.y else 5) :: number
+
+local a = if foo then foo.x elseif bar then bar.x else 5
+local b = if foo then if bar then bar else foo else 5
+local c = if foo then (foo.x :: number) elseif bar then bar.x()() else 5
+local d = if foo then 5 else baz :: number
+
+if if foo then bar else baz then
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/tokens.snap
new file mode 100644
index 00000000..f385aa38
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/if_expression/tokens.snap
@@ -0,0 +1,2480 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 27
+    line: 1
+    character: 28
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 27
+    line: 1
+    character: 28
+  end_position:
+    bytes: 28
+    line: 1
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 28
+    line: 1
+    character: 29
+  end_position:
+    bytes: 32
+    line: 1
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 32
+    line: 1
+    character: 33
+  end_position:
+    bytes: 33
+    line: 1
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 33
+    line: 1
+    character: 34
+  end_position:
+    bytes: 34
+    line: 1
+    character: 35
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 34
+    line: 1
+    character: 35
+  end_position:
+    bytes: 35
+    line: 1
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 35
+    line: 2
+    character: 1
+  end_position:
+    bytes: 40
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 40
+    line: 2
+    character: 6
+  end_position:
+    bytes: 41
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 41
+    line: 2
+    character: 7
+  end_position:
+    bytes: 42
+    line: 2
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 42
+    line: 2
+    character: 8
+  end_position:
+    bytes: 43
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 43
+    line: 2
+    character: 9
+  end_position:
+    bytes: 44
+    line: 2
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 44
+    line: 2
+    character: 10
+  end_position:
+    bytes: 45
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 45
+    line: 2
+    character: 11
+  end_position:
+    bytes: 46
+    line: 2
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 46
+    line: 2
+    character: 12
+  end_position:
+    bytes: 48
+    line: 2
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 48
+    line: 2
+    character: 14
+  end_position:
+    bytes: 49
+    line: 2
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 49
+    line: 2
+    character: 15
+  end_position:
+    bytes: 50
+    line: 2
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 50
+    line: 2
+    character: 16
+  end_position:
+    bytes: 51
+    line: 2
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 51
+    line: 2
+    character: 17
+  end_position:
+    bytes: 55
+    line: 2
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 55
+    line: 2
+    character: 21
+  end_position:
+    bytes: 56
+    line: 2
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 56
+    line: 2
+    character: 22
+  end_position:
+    bytes: 57
+    line: 2
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 57
+    line: 2
+    character: 23
+  end_position:
+    bytes: 58
+    line: 2
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 58
+    line: 2
+    character: 24
+  end_position:
+    bytes: 65
+    line: 2
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: indices
+- start_position:
+    bytes: 65
+    line: 2
+    character: 31
+  end_position:
+    bytes: 66
+    line: 2
+    character: 32
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 66
+    line: 2
+    character: 32
+  end_position:
+    bytes: 70
+    line: 2
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 70
+    line: 2
+    character: 36
+  end_position:
+    bytes: 71
+    line: 2
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 71
+    line: 2
+    character: 37
+  end_position:
+    bytes: 77
+    line: 2
+    character: 43
+  token_type:
+    type: Identifier
+    identifier: create
+- start_position:
+    bytes: 77
+    line: 2
+    character: 43
+  end_position:
+    bytes: 78
+    line: 2
+    character: 44
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 78
+    line: 2
+    character: 44
+  end_position:
+    bytes: 79
+    line: 2
+    character: 45
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 79
+    line: 2
+    character: 45
+  end_position:
+    bytes: 80
+    line: 2
+    character: 46
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 80
+    line: 2
+    character: 46
+  end_position:
+    bytes: 81
+    line: 2
+    character: 47
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 81
+    line: 2
+    character: 47
+  end_position:
+    bytes: 87
+    line: 2
+    character: 53
+  token_type:
+    type: Identifier
+    identifier: update
+- start_position:
+    bytes: 87
+    line: 2
+    character: 53
+  end_position:
+    bytes: 88
+    line: 2
+    character: 54
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 88
+    line: 2
+    character: 54
+  end_position:
+    bytes: 90
+    line: 2
+    character: 56
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 90
+    line: 2
+    character: 56
+  end_position:
+    bytes: 91
+    line: 2
+    character: 57
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 91
+    line: 2
+    character: 57
+  end_position:
+    bytes: 103
+    line: 2
+    character: 69
+  token_type:
+    type: Identifier
+    identifier: shouldUpdate
+- start_position:
+    bytes: 103
+    line: 2
+    character: 69
+  end_position:
+    bytes: 104
+    line: 2
+    character: 70
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 104
+    line: 2
+    character: 70
+  end_position:
+    bytes: 108
+    line: 2
+    character: 74
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 108
+    line: 2
+    character: 74
+  end_position:
+    bytes: 109
+    line: 2
+    character: 75
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 109
+    line: 2
+    character: 75
+  end_position:
+    bytes: 120
+    line: 2
+    character: 86
+  token_type:
+    type: Identifier
+    identifier: information
+- start_position:
+    bytes: 120
+    line: 2
+    character: 86
+  end_position:
+    bytes: 121
+    line: 2
+    character: 87
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 121
+    line: 2
+    character: 87
+  end_position:
+    bytes: 125
+    line: 2
+    character: 91
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 125
+    line: 2
+    character: 91
+  end_position:
+    bytes: 126
+    line: 2
+    character: 92
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 126
+    line: 2
+    character: 92
+  end_position:
+    bytes: 134
+    line: 2
+    character: 100
+  token_type:
+    type: Identifier
+    identifier: defaults
+- start_position:
+    bytes: 134
+    line: 2
+    character: 100
+  end_position:
+    bytes: 135
+    line: 2
+    character: 101
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 135
+    line: 2
+    character: 101
+  end_position:
+    bytes: 136
+    line: 2
+    character: 101
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 136
+    line: 3
+    character: 1
+  end_position:
+    bytes: 141
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 141
+    line: 3
+    character: 6
+  end_position:
+    bytes: 142
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 142
+    line: 3
+    character: 7
+  end_position:
+    bytes: 143
+    line: 3
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: z
+- start_position:
+    bytes: 143
+    line: 3
+    character: 8
+  end_position:
+    bytes: 144
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 144
+    line: 3
+    character: 9
+  end_position:
+    bytes: 145
+    line: 3
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 145
+    line: 3
+    character: 10
+  end_position:
+    bytes: 146
+    line: 3
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 146
+    line: 3
+    character: 11
+  end_position:
+    bytes: 147
+    line: 3
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 147
+    line: 3
+    character: 12
+  end_position:
+    bytes: 149
+    line: 3
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 149
+    line: 3
+    character: 14
+  end_position:
+    bytes: 150
+    line: 3
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 150
+    line: 3
+    character: 15
+  end_position:
+    bytes: 153
+    line: 3
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 153
+    line: 3
+    character: 18
+  end_position:
+    bytes: 154
+    line: 3
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 154
+    line: 3
+    character: 19
+  end_position:
+    bytes: 158
+    line: 3
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 158
+    line: 3
+    character: 23
+  end_position:
+    bytes: 159
+    line: 3
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 159
+    line: 3
+    character: 24
+  end_position:
+    bytes: 162
+    line: 3
+    character: 27
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 162
+    line: 3
+    character: 27
+  end_position:
+    bytes: 163
+    line: 3
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 163
+    line: 3
+    character: 28
+  end_position:
+    bytes: 164
+    line: 3
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 164
+    line: 3
+    character: 29
+  end_position:
+    bytes: 165
+    line: 3
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 165
+    line: 3
+    character: 30
+  end_position:
+    bytes: 169
+    line: 3
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 169
+    line: 3
+    character: 34
+  end_position:
+    bytes: 170
+    line: 3
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 170
+    line: 3
+    character: 35
+  end_position:
+    bytes: 171
+    line: 3
+    character: 36
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 171
+    line: 3
+    character: 36
+  end_position:
+    bytes: 172
+    line: 3
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 172
+    line: 3
+    character: 37
+  end_position:
+    bytes: 173
+    line: 3
+    character: 38
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 173
+    line: 3
+    character: 38
+  end_position:
+    bytes: 175
+    line: 3
+    character: 40
+  token_type:
+    type: Symbol
+    symbol: "::"
+- start_position:
+    bytes: 175
+    line: 3
+    character: 40
+  end_position:
+    bytes: 176
+    line: 3
+    character: 41
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 176
+    line: 3
+    character: 41
+  end_position:
+    bytes: 182
+    line: 3
+    character: 47
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 182
+    line: 3
+    character: 47
+  end_position:
+    bytes: 183
+    line: 3
+    character: 47
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 183
+    line: 4
+    character: 1
+  end_position:
+    bytes: 184
+    line: 4
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 184
+    line: 5
+    character: 1
+  end_position:
+    bytes: 189
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 189
+    line: 5
+    character: 6
+  end_position:
+    bytes: 190
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 190
+    line: 5
+    character: 7
+  end_position:
+    bytes: 191
+    line: 5
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 191
+    line: 5
+    character: 8
+  end_position:
+    bytes: 192
+    line: 5
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 192
+    line: 5
+    character: 9
+  end_position:
+    bytes: 193
+    line: 5
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 193
+    line: 5
+    character: 10
+  end_position:
+    bytes: 194
+    line: 5
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 194
+    line: 5
+    character: 11
+  end_position:
+    bytes: 196
+    line: 5
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 196
+    line: 5
+    character: 13
+  end_position:
+    bytes: 197
+    line: 5
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 197
+    line: 5
+    character: 14
+  end_position:
+    bytes: 200
+    line: 5
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 200
+    line: 5
+    character: 17
+  end_position:
+    bytes: 201
+    line: 5
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 201
+    line: 5
+    character: 18
+  end_position:
+    bytes: 205
+    line: 5
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 205
+    line: 5
+    character: 22
+  end_position:
+    bytes: 206
+    line: 5
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 206
+    line: 5
+    character: 23
+  end_position:
+    bytes: 209
+    line: 5
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 209
+    line: 5
+    character: 26
+  end_position:
+    bytes: 210
+    line: 5
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 210
+    line: 5
+    character: 27
+  end_position:
+    bytes: 211
+    line: 5
+    character: 28
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 211
+    line: 5
+    character: 28
+  end_position:
+    bytes: 212
+    line: 5
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 212
+    line: 5
+    character: 29
+  end_position:
+    bytes: 218
+    line: 5
+    character: 35
+  token_type:
+    type: Symbol
+    symbol: elseif
+- start_position:
+    bytes: 218
+    line: 5
+    character: 35
+  end_position:
+    bytes: 219
+    line: 5
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 219
+    line: 5
+    character: 36
+  end_position:
+    bytes: 222
+    line: 5
+    character: 39
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 222
+    line: 5
+    character: 39
+  end_position:
+    bytes: 223
+    line: 5
+    character: 40
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 223
+    line: 5
+    character: 40
+  end_position:
+    bytes: 227
+    line: 5
+    character: 44
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 227
+    line: 5
+    character: 44
+  end_position:
+    bytes: 228
+    line: 5
+    character: 45
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 228
+    line: 5
+    character: 45
+  end_position:
+    bytes: 231
+    line: 5
+    character: 48
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 231
+    line: 5
+    character: 48
+  end_position:
+    bytes: 232
+    line: 5
+    character: 49
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 232
+    line: 5
+    character: 49
+  end_position:
+    bytes: 233
+    line: 5
+    character: 50
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 233
+    line: 5
+    character: 50
+  end_position:
+    bytes: 234
+    line: 5
+    character: 51
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 234
+    line: 5
+    character: 51
+  end_position:
+    bytes: 238
+    line: 5
+    character: 55
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 238
+    line: 5
+    character: 55
+  end_position:
+    bytes: 239
+    line: 5
+    character: 56
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 239
+    line: 5
+    character: 56
+  end_position:
+    bytes: 240
+    line: 5
+    character: 57
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 240
+    line: 5
+    character: 57
+  end_position:
+    bytes: 241
+    line: 5
+    character: 57
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 241
+    line: 6
+    character: 1
+  end_position:
+    bytes: 246
+    line: 6
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 246
+    line: 6
+    character: 6
+  end_position:
+    bytes: 247
+    line: 6
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 247
+    line: 6
+    character: 7
+  end_position:
+    bytes: 248
+    line: 6
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 248
+    line: 6
+    character: 8
+  end_position:
+    bytes: 249
+    line: 6
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 249
+    line: 6
+    character: 9
+  end_position:
+    bytes: 250
+    line: 6
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 250
+    line: 6
+    character: 10
+  end_position:
+    bytes: 251
+    line: 6
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 251
+    line: 6
+    character: 11
+  end_position:
+    bytes: 253
+    line: 6
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 253
+    line: 6
+    character: 13
+  end_position:
+    bytes: 254
+    line: 6
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 254
+    line: 6
+    character: 14
+  end_position:
+    bytes: 257
+    line: 6
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 257
+    line: 6
+    character: 17
+  end_position:
+    bytes: 258
+    line: 6
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 258
+    line: 6
+    character: 18
+  end_position:
+    bytes: 262
+    line: 6
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 262
+    line: 6
+    character: 22
+  end_position:
+    bytes: 263
+    line: 6
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 263
+    line: 6
+    character: 23
+  end_position:
+    bytes: 265
+    line: 6
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 265
+    line: 6
+    character: 25
+  end_position:
+    bytes: 266
+    line: 6
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 266
+    line: 6
+    character: 26
+  end_position:
+    bytes: 269
+    line: 6
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 269
+    line: 6
+    character: 29
+  end_position:
+    bytes: 270
+    line: 6
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 270
+    line: 6
+    character: 30
+  end_position:
+    bytes: 274
+    line: 6
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 274
+    line: 6
+    character: 34
+  end_position:
+    bytes: 275
+    line: 6
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 275
+    line: 6
+    character: 35
+  end_position:
+    bytes: 278
+    line: 6
+    character: 38
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 278
+    line: 6
+    character: 38
+  end_position:
+    bytes: 279
+    line: 6
+    character: 39
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 279
+    line: 6
+    character: 39
+  end_position:
+    bytes: 283
+    line: 6
+    character: 43
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 283
+    line: 6
+    character: 43
+  end_position:
+    bytes: 284
+    line: 6
+    character: 44
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 284
+    line: 6
+    character: 44
+  end_position:
+    bytes: 287
+    line: 6
+    character: 47
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 287
+    line: 6
+    character: 47
+  end_position:
+    bytes: 288
+    line: 6
+    character: 48
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 288
+    line: 6
+    character: 48
+  end_position:
+    bytes: 292
+    line: 6
+    character: 52
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 292
+    line: 6
+    character: 52
+  end_position:
+    bytes: 293
+    line: 6
+    character: 53
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 293
+    line: 6
+    character: 53
+  end_position:
+    bytes: 294
+    line: 6
+    character: 54
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 294
+    line: 6
+    character: 54
+  end_position:
+    bytes: 295
+    line: 6
+    character: 54
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 295
+    line: 7
+    character: 1
+  end_position:
+    bytes: 300
+    line: 7
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 300
+    line: 7
+    character: 6
+  end_position:
+    bytes: 301
+    line: 7
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 301
+    line: 7
+    character: 7
+  end_position:
+    bytes: 302
+    line: 7
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: c
+- start_position:
+    bytes: 302
+    line: 7
+    character: 8
+  end_position:
+    bytes: 303
+    line: 7
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 303
+    line: 7
+    character: 9
+  end_position:
+    bytes: 304
+    line: 7
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 304
+    line: 7
+    character: 10
+  end_position:
+    bytes: 305
+    line: 7
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 305
+    line: 7
+    character: 11
+  end_position:
+    bytes: 307
+    line: 7
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 307
+    line: 7
+    character: 13
+  end_position:
+    bytes: 308
+    line: 7
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 308
+    line: 7
+    character: 14
+  end_position:
+    bytes: 311
+    line: 7
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 311
+    line: 7
+    character: 17
+  end_position:
+    bytes: 312
+    line: 7
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 312
+    line: 7
+    character: 18
+  end_position:
+    bytes: 316
+    line: 7
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 316
+    line: 7
+    character: 22
+  end_position:
+    bytes: 317
+    line: 7
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 317
+    line: 7
+    character: 23
+  end_position:
+    bytes: 318
+    line: 7
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 318
+    line: 7
+    character: 24
+  end_position:
+    bytes: 321
+    line: 7
+    character: 27
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 321
+    line: 7
+    character: 27
+  end_position:
+    bytes: 322
+    line: 7
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 322
+    line: 7
+    character: 28
+  end_position:
+    bytes: 323
+    line: 7
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 323
+    line: 7
+    character: 29
+  end_position:
+    bytes: 324
+    line: 7
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 324
+    line: 7
+    character: 30
+  end_position:
+    bytes: 326
+    line: 7
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: "::"
+- start_position:
+    bytes: 326
+    line: 7
+    character: 32
+  end_position:
+    bytes: 327
+    line: 7
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 327
+    line: 7
+    character: 33
+  end_position:
+    bytes: 333
+    line: 7
+    character: 39
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 333
+    line: 7
+    character: 39
+  end_position:
+    bytes: 334
+    line: 7
+    character: 40
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 334
+    line: 7
+    character: 40
+  end_position:
+    bytes: 335
+    line: 7
+    character: 41
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 335
+    line: 7
+    character: 41
+  end_position:
+    bytes: 341
+    line: 7
+    character: 47
+  token_type:
+    type: Symbol
+    symbol: elseif
+- start_position:
+    bytes: 341
+    line: 7
+    character: 47
+  end_position:
+    bytes: 342
+    line: 7
+    character: 48
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 342
+    line: 7
+    character: 48
+  end_position:
+    bytes: 345
+    line: 7
+    character: 51
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 345
+    line: 7
+    character: 51
+  end_position:
+    bytes: 346
+    line: 7
+    character: 52
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 346
+    line: 7
+    character: 52
+  end_position:
+    bytes: 350
+    line: 7
+    character: 56
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 350
+    line: 7
+    character: 56
+  end_position:
+    bytes: 351
+    line: 7
+    character: 57
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 351
+    line: 7
+    character: 57
+  end_position:
+    bytes: 354
+    line: 7
+    character: 60
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 354
+    line: 7
+    character: 60
+  end_position:
+    bytes: 355
+    line: 7
+    character: 61
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 355
+    line: 7
+    character: 61
+  end_position:
+    bytes: 356
+    line: 7
+    character: 62
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 356
+    line: 7
+    character: 62
+  end_position:
+    bytes: 357
+    line: 7
+    character: 63
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 357
+    line: 7
+    character: 63
+  end_position:
+    bytes: 358
+    line: 7
+    character: 64
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 358
+    line: 7
+    character: 64
+  end_position:
+    bytes: 359
+    line: 7
+    character: 65
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 359
+    line: 7
+    character: 65
+  end_position:
+    bytes: 360
+    line: 7
+    character: 66
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 360
+    line: 7
+    character: 66
+  end_position:
+    bytes: 361
+    line: 7
+    character: 67
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 361
+    line: 7
+    character: 67
+  end_position:
+    bytes: 365
+    line: 7
+    character: 71
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 365
+    line: 7
+    character: 71
+  end_position:
+    bytes: 366
+    line: 7
+    character: 72
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 366
+    line: 7
+    character: 72
+  end_position:
+    bytes: 367
+    line: 7
+    character: 73
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 367
+    line: 7
+    character: 73
+  end_position:
+    bytes: 368
+    line: 7
+    character: 73
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 368
+    line: 8
+    character: 1
+  end_position:
+    bytes: 373
+    line: 8
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 373
+    line: 8
+    character: 6
+  end_position:
+    bytes: 374
+    line: 8
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 374
+    line: 8
+    character: 7
+  end_position:
+    bytes: 375
+    line: 8
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: d
+- start_position:
+    bytes: 375
+    line: 8
+    character: 8
+  end_position:
+    bytes: 376
+    line: 8
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 376
+    line: 8
+    character: 9
+  end_position:
+    bytes: 377
+    line: 8
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 377
+    line: 8
+    character: 10
+  end_position:
+    bytes: 378
+    line: 8
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 378
+    line: 8
+    character: 11
+  end_position:
+    bytes: 380
+    line: 8
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 380
+    line: 8
+    character: 13
+  end_position:
+    bytes: 381
+    line: 8
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 381
+    line: 8
+    character: 14
+  end_position:
+    bytes: 384
+    line: 8
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 384
+    line: 8
+    character: 17
+  end_position:
+    bytes: 385
+    line: 8
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 385
+    line: 8
+    character: 18
+  end_position:
+    bytes: 389
+    line: 8
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 389
+    line: 8
+    character: 22
+  end_position:
+    bytes: 390
+    line: 8
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 390
+    line: 8
+    character: 23
+  end_position:
+    bytes: 391
+    line: 8
+    character: 24
+  token_type:
+    type: Number
+    text: "5"
+- start_position:
+    bytes: 391
+    line: 8
+    character: 24
+  end_position:
+    bytes: 392
+    line: 8
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 392
+    line: 8
+    character: 25
+  end_position:
+    bytes: 396
+    line: 8
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 396
+    line: 8
+    character: 29
+  end_position:
+    bytes: 397
+    line: 8
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 397
+    line: 8
+    character: 30
+  end_position:
+    bytes: 400
+    line: 8
+    character: 33
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 400
+    line: 8
+    character: 33
+  end_position:
+    bytes: 401
+    line: 8
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 401
+    line: 8
+    character: 34
+  end_position:
+    bytes: 403
+    line: 8
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: "::"
+- start_position:
+    bytes: 403
+    line: 8
+    character: 36
+  end_position:
+    bytes: 404
+    line: 8
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 404
+    line: 8
+    character: 37
+  end_position:
+    bytes: 410
+    line: 8
+    character: 43
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 410
+    line: 8
+    character: 43
+  end_position:
+    bytes: 411
+    line: 8
+    character: 43
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 411
+    line: 9
+    character: 1
+  end_position:
+    bytes: 412
+    line: 9
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 412
+    line: 10
+    character: 1
+  end_position:
+    bytes: 414
+    line: 10
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 414
+    line: 10
+    character: 3
+  end_position:
+    bytes: 415
+    line: 10
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 415
+    line: 10
+    character: 4
+  end_position:
+    bytes: 417
+    line: 10
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 417
+    line: 10
+    character: 6
+  end_position:
+    bytes: 418
+    line: 10
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 418
+    line: 10
+    character: 7
+  end_position:
+    bytes: 421
+    line: 10
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 421
+    line: 10
+    character: 10
+  end_position:
+    bytes: 422
+    line: 10
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 422
+    line: 10
+    character: 11
+  end_position:
+    bytes: 426
+    line: 10
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 426
+    line: 10
+    character: 15
+  end_position:
+    bytes: 427
+    line: 10
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 427
+    line: 10
+    character: 16
+  end_position:
+    bytes: 430
+    line: 10
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 430
+    line: 10
+    character: 19
+  end_position:
+    bytes: 431
+    line: 10
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 431
+    line: 10
+    character: 20
+  end_position:
+    bytes: 435
+    line: 10
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 435
+    line: 10
+    character: 24
+  end_position:
+    bytes: 436
+    line: 10
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 436
+    line: 10
+    character: 25
+  end_position:
+    bytes: 439
+    line: 10
+    character: 28
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 439
+    line: 10
+    character: 28
+  end_position:
+    bytes: 440
+    line: 10
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 440
+    line: 10
+    character: 29
+  end_position:
+    bytes: 444
+    line: 10
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 444
+    line: 10
+    character: 33
+  end_position:
+    bytes: 445
+    line: 10
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 445
+    line: 11
+    character: 1
+  end_position:
+    bytes: 448
+    line: 11
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 448
+    line: 11
+    character: 4
+  end_position:
+    bytes: 448
+    line: 11
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/ast.snap
new file mode 100644
index 00000000..bb4e51de
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/ast.snap
@@ -0,0 +1,2231 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: full-moon/tests/roblox_cases/pass/multiline_expressions
+---
+stmts:
+  - - Do:
+        do_token:
+          leading_trivia:
+            - start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 104
+                line: 1
+                character: 105
+              token_type:
+                type: SingleLineComment
+                comment: " Taken from https://github.com/JohnnyMorganz/StyLua/blob/main/tests/inputs/multiline-expressions-3.lua"
+            - start_position:
+                bytes: 104
+                line: 1
+                character: 105
+              end_position:
+                bytes: 105
+                line: 1
+                character: 105
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 105
+              line: 2
+              character: 1
+            end_position:
+              bytes: 107
+              line: 2
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 107
+                line: 2
+                character: 3
+              end_position:
+                bytes: 108
+                line: 2
+                character: 3
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - Do:
+                  do_token:
+                    leading_trivia:
+                      - start_position:
+                          bytes: 108
+                          line: 3
+                          character: 1
+                        end_position:
+                          bytes: 109
+                          line: 3
+                          character: 2
+                        token_type:
+                          type: Whitespace
+                          characters: "\t"
+                    token:
+                      start_position:
+                        bytes: 109
+                        line: 3
+                        character: 2
+                      end_position:
+                        bytes: 111
+                        line: 3
+                        character: 4
+                      token_type:
+                        type: Symbol
+                        symbol: do
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 111
+                          line: 3
+                          character: 4
+                        end_position:
+                          bytes: 112
+                          line: 3
+                          character: 4
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+                  block:
+                    stmts:
+                      - - Do:
+                            do_token:
+                              leading_trivia:
+                                - start_position:
+                                    bytes: 112
+                                    line: 4
+                                    character: 1
+                                  end_position:
+                                    bytes: 114
+                                    line: 4
+                                    character: 3
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\t\t"
+                              token:
+                                start_position:
+                                  bytes: 114
+                                  line: 4
+                                  character: 3
+                                end_position:
+                                  bytes: 116
+                                  line: 4
+                                  character: 5
+                                token_type:
+                                  type: Symbol
+                                  symbol: do
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 116
+                                    line: 4
+                                    character: 5
+                                  end_position:
+                                    bytes: 117
+                                    line: 4
+                                    character: 5
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                            block:
+                              stmts:
+                                - - Do:
+                                      do_token:
+                                        leading_trivia:
+                                          - start_position:
+                                              bytes: 117
+                                              line: 5
+                                              character: 1
+                                            end_position:
+                                              bytes: 120
+                                              line: 5
+                                              character: 4
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\t\t\t"
+                                        token:
+                                          start_position:
+                                            bytes: 120
+                                            line: 5
+                                            character: 4
+                                          end_position:
+                                            bytes: 122
+                                            line: 5
+                                            character: 6
+                                          token_type:
+                                            type: Symbol
+                                            symbol: do
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 122
+                                              line: 5
+                                              character: 6
+                                            end_position:
+                                              bytes: 123
+                                              line: 5
+                                              character: 6
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\n"
+                                      block:
+                                        stmts:
+                                          - - LocalAssignment:
+                                                local_token:
+                                                  leading_trivia:
+                                                    - start_position:
+                                                        bytes: 123
+                                                        line: 6
+                                                        character: 1
+                                                      end_position:
+                                                        bytes: 127
+                                                        line: 6
+                                                        character: 5
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\t\t\t\t"
+                                                  token:
+                                                    start_position:
+                                                      bytes: 127
+                                                      line: 6
+                                                      character: 5
+                                                    end_position:
+                                                      bytes: 132
+                                                      line: 6
+                                                      character: 10
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: local
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 132
+                                                        line: 6
+                                                        character: 10
+                                                      end_position:
+                                                        bytes: 133
+                                                        line: 6
+                                                        character: 11
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                                name_list:
+                                                  pairs:
+                                                    - End:
+                                                        leading_trivia: []
+                                                        token:
+                                                          start_position:
+                                                            bytes: 133
+                                                            line: 6
+                                                            character: 11
+                                                          end_position:
+                                                            bytes: 137
+                                                            line: 6
+                                                            character: 15
+                                                          token_type:
+                                                            type: Identifier
+                                                            identifier: text
+                                                        trailing_trivia:
+                                                          - start_position:
+                                                              bytes: 137
+                                                              line: 6
+                                                              character: 15
+                                                            end_position:
+                                                              bytes: 138
+                                                              line: 6
+                                                              character: 16
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: " "
+                                                equal_token:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 138
+                                                      line: 6
+                                                      character: 16
+                                                    end_position:
+                                                      bytes: 139
+                                                      line: 6
+                                                      character: 17
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: "="
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 139
+                                                        line: 6
+                                                        character: 17
+                                                      end_position:
+                                                        bytes: 140
+                                                        line: 6
+                                                        character: 18
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                                expr_list:
+                                                  pairs:
+                                                    - End:
+                                                        BinaryOperator:
+                                                          lhs:
+                                                            String:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 140
+                                                                  line: 6
+                                                                  character: 18
+                                                                end_position:
+                                                                  bytes: 151
+                                                                  line: 6
+                                                                  character: 29
+                                                                token_type:
+                                                                  type: StringLiteral
+                                                                  literal: "Players: "
+                                                                  quote_type: Double
+                                                              trailing_trivia:
+                                                                - start_position:
+                                                                    bytes: 151
+                                                                    line: 6
+                                                                    character: 29
+                                                                  end_position:
+                                                                    bytes: 152
+                                                                    line: 6
+                                                                    character: 30
+                                                                  token_type:
+                                                                    type: Whitespace
+                                                                    characters: " "
+                                                          binop:
+                                                            TwoDots:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 152
+                                                                  line: 6
+                                                                  character: 30
+                                                                end_position:
+                                                                  bytes: 154
+                                                                  line: 6
+                                                                  character: 32
+                                                                token_type:
+                                                                  type: Symbol
+                                                                  symbol: ".."
+                                                              trailing_trivia:
+                                                                - start_position:
+                                                                    bytes: 154
+                                                                    line: 6
+                                                                    character: 32
+                                                                  end_position:
+                                                                    bytes: 155
+                                                                    line: 6
+                                                                    character: 33
+                                                                  token_type:
+                                                                    type: Whitespace
+                                                                    characters: " "
+                                                          rhs:
+                                                            BinaryOperator:
+                                                              lhs:
+                                                                BinaryOperator:
+                                                                  lhs:
+                                                                    UnaryOperator:
+                                                                      unop:
+                                                                        Hash:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 155
+                                                                              line: 6
+                                                                              character: 33
+                                                                            end_position:
+                                                                              bytes: 156
+                                                                              line: 6
+                                                                              character: 34
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: "#"
+                                                                          trailing_trivia: []
+                                                                      expression:
+                                                                        FunctionCall:
+                                                                          prefix:
+                                                                            Name:
+                                                                              leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 156
+                                                                                  line: 6
+                                                                                  character: 34
+                                                                                end_position:
+                                                                                  bytes: 172
+                                                                                  line: 6
+                                                                                  character: 50
+                                                                                token_type:
+                                                                                  type: Identifier
+                                                                                  identifier: Server_Container
+                                                                              trailing_trivia: []
+                                                                          suffixes:
+                                                                            - Index:
+                                                                                Dot:
+                                                                                  dot:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 172
+                                                                                        line: 6
+                                                                                        character: 50
+                                                                                      end_position:
+                                                                                        bytes: 173
+                                                                                        line: 6
+                                                                                        character: 51
+                                                                                      token_type:
+                                                                                        type: Symbol
+                                                                                        symbol: "."
+                                                                                    trailing_trivia: []
+                                                                                  name:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 173
+                                                                                        line: 6
+                                                                                        character: 51
+                                                                                      end_position:
+                                                                                        bytes: 235
+                                                                                        line: 6
+                                                                                        character: 113
+                                                                                      token_type:
+                                                                                        type: Identifier
+                                                                                        identifier: ARandomVariableWhichIsVeryLongSoThatThisGetsOverTheColumnLimit
+                                                                                    trailing_trivia: []
+                                                                            - Index:
+                                                                                Dot:
+                                                                                  dot:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 235
+                                                                                        line: 6
+                                                                                        character: 113
+                                                                                      end_position:
+                                                                                        bytes: 236
+                                                                                        line: 6
+                                                                                        character: 114
+                                                                                      token_type:
+                                                                                        type: Symbol
+                                                                                        symbol: "."
+                                                                                    trailing_trivia: []
+                                                                                  name:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 236
+                                                                                        line: 6
+                                                                                        character: 114
+                                                                                      end_position:
+                                                                                        bytes: 245
+                                                                                        line: 6
+                                                                                        character: 123
+                                                                                      token_type:
+                                                                                        type: Identifier
+                                                                                        identifier: Players_F
+                                                                                    trailing_trivia: []
+                                                                            - Call:
+                                                                                MethodCall:
+                                                                                  colon_token:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 245
+                                                                                        line: 6
+                                                                                        character: 123
+                                                                                      end_position:
+                                                                                        bytes: 246
+                                                                                        line: 6
+                                                                                        character: 124
+                                                                                      token_type:
+                                                                                        type: Symbol
+                                                                                        symbol: ":"
+                                                                                    trailing_trivia: []
+                                                                                  name:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 246
+                                                                                        line: 6
+                                                                                        character: 124
+                                                                                      end_position:
+                                                                                        bytes: 257
+                                                                                        line: 6
+                                                                                        character: 135
+                                                                                      token_type:
+                                                                                        type: Identifier
+                                                                                        identifier: GetChildren
+                                                                                    trailing_trivia: []
+                                                                                  args:
+                                                                                    Parentheses:
+                                                                                      parentheses:
+                                                                                        tokens:
+                                                                                          - leading_trivia: []
+                                                                                            token:
+                                                                                              start_position:
+                                                                                                bytes: 257
+                                                                                                line: 6
+                                                                                                character: 135
+                                                                                              end_position:
+                                                                                                bytes: 258
+                                                                                                line: 6
+                                                                                                character: 136
+                                                                                              token_type:
+                                                                                                type: Symbol
+                                                                                                symbol: (
+                                                                                            trailing_trivia: []
+                                                                                          - leading_trivia: []
+                                                                                            token:
+                                                                                              start_position:
+                                                                                                bytes: 258
+                                                                                                line: 6
+                                                                                                character: 136
+                                                                                              end_position:
+                                                                                                bytes: 259
+                                                                                                line: 6
+                                                                                                character: 137
+                                                                                              token_type:
+                                                                                                type: Symbol
+                                                                                                symbol: )
+                                                                                            trailing_trivia:
+                                                                                              - start_position:
+                                                                                                  bytes: 259
+                                                                                                  line: 6
+                                                                                                  character: 137
+                                                                                                end_position:
+                                                                                                  bytes: 260
+                                                                                                  line: 6
+                                                                                                  character: 138
+                                                                                                token_type:
+                                                                                                  type: Whitespace
+                                                                                                  characters: " "
+                                                                                      arguments:
+                                                                                        pairs: []
+                                                                  binop:
+                                                                    Minus:
+                                                                      leading_trivia: []
+                                                                      token:
+                                                                        start_position:
+                                                                          bytes: 260
+                                                                          line: 6
+                                                                          character: 138
+                                                                        end_position:
+                                                                          bytes: 261
+                                                                          line: 6
+                                                                          character: 139
+                                                                        token_type:
+                                                                          type: Symbol
+                                                                          symbol: "-"
+                                                                      trailing_trivia:
+                                                                        - start_position:
+                                                                            bytes: 261
+                                                                            line: 6
+                                                                            character: 139
+                                                                          end_position:
+                                                                            bytes: 262
+                                                                            line: 6
+                                                                            character: 140
+                                                                          token_type:
+                                                                            type: Whitespace
+                                                                            characters: " "
+                                                                  rhs:
+                                                                    Number:
+                                                                      leading_trivia: []
+                                                                      token:
+                                                                        start_position:
+                                                                          bytes: 262
+                                                                          line: 6
+                                                                          character: 140
+                                                                        end_position:
+                                                                          bytes: 263
+                                                                          line: 6
+                                                                          character: 141
+                                                                        token_type:
+                                                                          type: Number
+                                                                          text: "1"
+                                                                      trailing_trivia:
+                                                                        - start_position:
+                                                                            bytes: 263
+                                                                            line: 6
+                                                                            character: 141
+                                                                          end_position:
+                                                                            bytes: 264
+                                                                            line: 6
+                                                                            character: 142
+                                                                          token_type:
+                                                                            type: Whitespace
+                                                                            characters: " "
+                                                              binop:
+                                                                TwoDots:
+                                                                  leading_trivia: []
+                                                                  token:
+                                                                    start_position:
+                                                                      bytes: 264
+                                                                      line: 6
+                                                                      character: 142
+                                                                    end_position:
+                                                                      bytes: 266
+                                                                      line: 6
+                                                                      character: 144
+                                                                    token_type:
+                                                                      type: Symbol
+                                                                      symbol: ".."
+                                                                  trailing_trivia:
+                                                                    - start_position:
+                                                                        bytes: 266
+                                                                        line: 6
+                                                                        character: 144
+                                                                      end_position:
+                                                                        bytes: 267
+                                                                        line: 6
+                                                                        character: 145
+                                                                      token_type:
+                                                                        type: Whitespace
+                                                                        characters: " "
+                                                              rhs:
+                                                                String:
+                                                                  leading_trivia: []
+                                                                  token:
+                                                                    start_position:
+                                                                      bytes: 267
+                                                                      line: 6
+                                                                      character: 145
+                                                                    end_position:
+                                                                      bytes: 272
+                                                                      line: 6
+                                                                      character: 150
+                                                                    token_type:
+                                                                      type: StringLiteral
+                                                                      literal: /20
+                                                                      quote_type: Double
+                                                                  trailing_trivia:
+                                                                    - start_position:
+                                                                        bytes: 272
+                                                                        line: 6
+                                                                        character: 150
+                                                                      end_position:
+                                                                        bytes: 273
+                                                                        line: 6
+                                                                        character: 150
+                                                                      token_type:
+                                                                        type: Whitespace
+                                                                        characters: "\n"
+                                            - ~
+                                          - - LocalAssignment:
+                                                local_token:
+                                                  leading_trivia:
+                                                    - start_position:
+                                                        bytes: 273
+                                                        line: 7
+                                                        character: 1
+                                                      end_position:
+                                                        bytes: 277
+                                                        line: 7
+                                                        character: 5
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\t\t\t\t"
+                                                  token:
+                                                    start_position:
+                                                      bytes: 277
+                                                      line: 7
+                                                      character: 5
+                                                    end_position:
+                                                      bytes: 282
+                                                      line: 7
+                                                      character: 10
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: local
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 282
+                                                        line: 7
+                                                        character: 10
+                                                      end_position:
+                                                        bytes: 283
+                                                        line: 7
+                                                        character: 11
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                                name_list:
+                                                  pairs:
+                                                    - End:
+                                                        leading_trivia: []
+                                                        token:
+                                                          start_position:
+                                                            bytes: 283
+                                                            line: 7
+                                                            character: 11
+                                                          end_position:
+                                                            bytes: 288
+                                                            line: 7
+                                                            character: 16
+                                                          token_type:
+                                                            type: Identifier
+                                                            identifier: ratio
+                                                        trailing_trivia:
+                                                          - start_position:
+                                                              bytes: 288
+                                                              line: 7
+                                                              character: 16
+                                                            end_position:
+                                                              bytes: 289
+                                                              line: 7
+                                                              character: 17
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: " "
+                                                equal_token:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 289
+                                                      line: 7
+                                                      character: 17
+                                                    end_position:
+                                                      bytes: 290
+                                                      line: 7
+                                                      character: 18
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: "="
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 290
+                                                        line: 7
+                                                        character: 18
+                                                      end_position:
+                                                        bytes: 291
+                                                        line: 7
+                                                        character: 19
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                                expr_list:
+                                                  pairs:
+                                                    - End:
+                                                        BinaryOperator:
+                                                          lhs:
+                                                            BinaryOperator:
+                                                              lhs:
+                                                                BinaryOperator:
+                                                                  lhs:
+                                                                    Parentheses:
+                                                                      contained:
+                                                                        tokens:
+                                                                          - leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 291
+                                                                                line: 7
+                                                                                character: 19
+                                                                              end_position:
+                                                                                bytes: 292
+                                                                                line: 7
+                                                                                character: 20
+                                                                              token_type:
+                                                                                type: Symbol
+                                                                                symbol: (
+                                                                            trailing_trivia: []
+                                                                          - leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 313
+                                                                                line: 7
+                                                                                character: 41
+                                                                              end_position:
+                                                                                bytes: 314
+                                                                                line: 7
+                                                                                character: 42
+                                                                              token_type:
+                                                                                type: Symbol
+                                                                                symbol: )
+                                                                            trailing_trivia:
+                                                                              - start_position:
+                                                                                  bytes: 314
+                                                                                  line: 7
+                                                                                  character: 42
+                                                                                end_position:
+                                                                                  bytes: 315
+                                                                                  line: 7
+                                                                                  character: 43
+                                                                                token_type:
+                                                                                  type: Whitespace
+                                                                                  characters: " "
+                                                                      expression:
+                                                                        BinaryOperator:
+                                                                          lhs:
+                                                                            Var:
+                                                                              Name:
+                                                                                leading_trivia: []
+                                                                                token:
+                                                                                  start_position:
+                                                                                    bytes: 292
+                                                                                    line: 7
+                                                                                    character: 20
+                                                                                  end_position:
+                                                                                    bytes: 299
+                                                                                    line: 7
+                                                                                    character: 27
+                                                                                  token_type:
+                                                                                    type: Identifier
+                                                                                    identifier: minAxis
+                                                                                trailing_trivia:
+                                                                                  - start_position:
+                                                                                      bytes: 299
+                                                                                      line: 7
+                                                                                      character: 27
+                                                                                    end_position:
+                                                                                      bytes: 300
+                                                                                      line: 7
+                                                                                      character: 28
+                                                                                    token_type:
+                                                                                      type: Whitespace
+                                                                                      characters: " "
+                                                                          binop:
+                                                                            Minus:
+                                                                              leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 300
+                                                                                  line: 7
+                                                                                  character: 28
+                                                                                end_position:
+                                                                                  bytes: 301
+                                                                                  line: 7
+                                                                                  character: 29
+                                                                                token_type:
+                                                                                  type: Symbol
+                                                                                  symbol: "-"
+                                                                              trailing_trivia:
+                                                                                - start_position:
+                                                                                    bytes: 301
+                                                                                    line: 7
+                                                                                    character: 29
+                                                                                  end_position:
+                                                                                    bytes: 302
+                                                                                    line: 7
+                                                                                    character: 30
+                                                                                  token_type:
+                                                                                    type: Whitespace
+                                                                                    characters: " "
+                                                                          rhs:
+                                                                            Var:
+                                                                              Name:
+                                                                                leading_trivia: []
+                                                                                token:
+                                                                                  start_position:
+                                                                                    bytes: 302
+                                                                                    line: 7
+                                                                                    character: 30
+                                                                                  end_position:
+                                                                                    bytes: 313
+                                                                                    line: 7
+                                                                                    character: 41
+                                                                                  token_type:
+                                                                                    type: Identifier
+                                                                                    identifier: minAxisSize
+                                                                                trailing_trivia: []
+                                                                  binop:
+                                                                    Slash:
+                                                                      leading_trivia: []
+                                                                      token:
+                                                                        start_position:
+                                                                          bytes: 315
+                                                                          line: 7
+                                                                          character: 43
+                                                                        end_position:
+                                                                          bytes: 316
+                                                                          line: 7
+                                                                          character: 44
+                                                                        token_type:
+                                                                          type: Symbol
+                                                                          symbol: /
+                                                                      trailing_trivia:
+                                                                        - start_position:
+                                                                            bytes: 316
+                                                                            line: 7
+                                                                            character: 44
+                                                                          end_position:
+                                                                            bytes: 317
+                                                                            line: 7
+                                                                            character: 45
+                                                                          token_type:
+                                                                            type: Whitespace
+                                                                            characters: " "
+                                                                  rhs:
+                                                                    Var:
+                                                                      Name:
+                                                                        leading_trivia: []
+                                                                        token:
+                                                                          start_position:
+                                                                            bytes: 317
+                                                                            line: 7
+                                                                            character: 45
+                                                                          end_position:
+                                                                            bytes: 322
+                                                                            line: 7
+                                                                            character: 50
+                                                                          token_type:
+                                                                            type: Identifier
+                                                                            identifier: delta
+                                                                        trailing_trivia:
+                                                                          - start_position:
+                                                                              bytes: 322
+                                                                              line: 7
+                                                                              character: 50
+                                                                            end_position:
+                                                                              bytes: 323
+                                                                              line: 7
+                                                                              character: 51
+                                                                            token_type:
+                                                                              type: Whitespace
+                                                                              characters: " "
+                                                              binop:
+                                                                Star:
+                                                                  leading_trivia: []
+                                                                  token:
+                                                                    start_position:
+                                                                      bytes: 323
+                                                                      line: 7
+                                                                      character: 51
+                                                                    end_position:
+                                                                      bytes: 324
+                                                                      line: 7
+                                                                      character: 52
+                                                                    token_type:
+                                                                      type: Symbol
+                                                                      symbol: "*"
+                                                                  trailing_trivia:
+                                                                    - start_position:
+                                                                        bytes: 324
+                                                                        line: 7
+                                                                        character: 52
+                                                                      end_position:
+                                                                        bytes: 325
+                                                                        line: 7
+                                                                        character: 53
+                                                                      token_type:
+                                                                        type: Whitespace
+                                                                        characters: " "
+                                                              rhs:
+                                                                Parentheses:
+                                                                  contained:
+                                                                    tokens:
+                                                                      - leading_trivia: []
+                                                                        token:
+                                                                          start_position:
+                                                                            bytes: 325
+                                                                            line: 7
+                                                                            character: 53
+                                                                          end_position:
+                                                                            bytes: 326
+                                                                            line: 7
+                                                                            character: 54
+                                                                          token_type:
+                                                                            type: Symbol
+                                                                            symbol: (
+                                                                        trailing_trivia: []
+                                                                      - leading_trivia: []
+                                                                        token:
+                                                                          start_position:
+                                                                            bytes: 377
+                                                                            line: 7
+                                                                            character: 105
+                                                                          end_position:
+                                                                            bytes: 378
+                                                                            line: 7
+                                                                            character: 106
+                                                                          token_type:
+                                                                            type: Symbol
+                                                                            symbol: )
+                                                                        trailing_trivia:
+                                                                          - start_position:
+                                                                              bytes: 378
+                                                                              line: 7
+                                                                              character: 106
+                                                                            end_position:
+                                                                              bytes: 379
+                                                                              line: 7
+                                                                              character: 107
+                                                                            token_type:
+                                                                              type: Whitespace
+                                                                              characters: " "
+                                                                  expression:
+                                                                    BinaryOperator:
+                                                                      lhs:
+                                                                        Var:
+                                                                          Expression:
+                                                                            prefix:
+                                                                              Name:
+                                                                                leading_trivia: []
+                                                                                token:
+                                                                                  start_position:
+                                                                                    bytes: 326
+                                                                                    line: 7
+                                                                                    character: 54
+                                                                                  end_position:
+                                                                                    bytes: 330
+                                                                                    line: 7
+                                                                                    character: 58
+                                                                                  token_type:
+                                                                                    type: Identifier
+                                                                                    identifier: self
+                                                                                trailing_trivia: []
+                                                                            suffixes:
+                                                                              - Index:
+                                                                                  Dot:
+                                                                                    dot:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 330
+                                                                                          line: 7
+                                                                                          character: 58
+                                                                                        end_position:
+                                                                                          bytes: 331
+                                                                                          line: 7
+                                                                                          character: 59
+                                                                                        token_type:
+                                                                                          type: Symbol
+                                                                                          symbol: "."
+                                                                                      trailing_trivia: []
+                                                                                    name:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 331
+                                                                                          line: 7
+                                                                                          character: 59
+                                                                                        end_position:
+                                                                                          bytes: 336
+                                                                                          line: 7
+                                                                                          character: 64
+                                                                                        token_type:
+                                                                                          type: Identifier
+                                                                                          identifier: props
+                                                                                      trailing_trivia: []
+                                                                              - Index:
+                                                                                  Dot:
+                                                                                    dot:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 336
+                                                                                          line: 7
+                                                                                          character: 64
+                                                                                        end_position:
+                                                                                          bytes: 337
+                                                                                          line: 7
+                                                                                          character: 65
+                                                                                        token_type:
+                                                                                          type: Symbol
+                                                                                          symbol: "."
+                                                                                      trailing_trivia: []
+                                                                                    name:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 337
+                                                                                          line: 7
+                                                                                          character: 65
+                                                                                        end_position:
+                                                                                          bytes: 350
+                                                                                          line: 7
+                                                                                          character: 78
+                                                                                        token_type:
+                                                                                          type: Identifier
+                                                                                          identifier: maxScaleRatio
+                                                                                      trailing_trivia:
+                                                                                        - start_position:
+                                                                                            bytes: 350
+                                                                                            line: 7
+                                                                                            character: 78
+                                                                                          end_position:
+                                                                                            bytes: 351
+                                                                                            line: 7
+                                                                                            character: 79
+                                                                                          token_type:
+                                                                                            type: Whitespace
+                                                                                            characters: " "
+                                                                      binop:
+                                                                        Minus:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 351
+                                                                              line: 7
+                                                                              character: 79
+                                                                            end_position:
+                                                                              bytes: 352
+                                                                              line: 7
+                                                                              character: 80
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: "-"
+                                                                          trailing_trivia:
+                                                                            - start_position:
+                                                                                bytes: 352
+                                                                                line: 7
+                                                                                character: 80
+                                                                              end_position:
+                                                                                bytes: 353
+                                                                                line: 7
+                                                                                character: 81
+                                                                              token_type:
+                                                                                type: Whitespace
+                                                                                characters: " "
+                                                                      rhs:
+                                                                        Var:
+                                                                          Expression:
+                                                                            prefix:
+                                                                              Name:
+                                                                                leading_trivia: []
+                                                                                token:
+                                                                                  start_position:
+                                                                                    bytes: 353
+                                                                                    line: 7
+                                                                                    character: 81
+                                                                                  end_position:
+                                                                                    bytes: 357
+                                                                                    line: 7
+                                                                                    character: 85
+                                                                                  token_type:
+                                                                                    type: Identifier
+                                                                                    identifier: self
+                                                                                trailing_trivia: []
+                                                                            suffixes:
+                                                                              - Index:
+                                                                                  Dot:
+                                                                                    dot:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 357
+                                                                                          line: 7
+                                                                                          character: 85
+                                                                                        end_position:
+                                                                                          bytes: 358
+                                                                                          line: 7
+                                                                                          character: 86
+                                                                                        token_type:
+                                                                                          type: Symbol
+                                                                                          symbol: "."
+                                                                                      trailing_trivia: []
+                                                                                    name:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 358
+                                                                                          line: 7
+                                                                                          character: 86
+                                                                                        end_position:
+                                                                                          bytes: 363
+                                                                                          line: 7
+                                                                                          character: 91
+                                                                                        token_type:
+                                                                                          type: Identifier
+                                                                                          identifier: props
+                                                                                      trailing_trivia: []
+                                                                              - Index:
+                                                                                  Dot:
+                                                                                    dot:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 363
+                                                                                          line: 7
+                                                                                          character: 91
+                                                                                        end_position:
+                                                                                          bytes: 364
+                                                                                          line: 7
+                                                                                          character: 92
+                                                                                        token_type:
+                                                                                          type: Symbol
+                                                                                          symbol: "."
+                                                                                      trailing_trivia: []
+                                                                                    name:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 364
+                                                                                          line: 7
+                                                                                          character: 92
+                                                                                        end_position:
+                                                                                          bytes: 377
+                                                                                          line: 7
+                                                                                          character: 105
+                                                                                        token_type:
+                                                                                          type: Identifier
+                                                                                          identifier: minScaleRatio
+                                                                                      trailing_trivia: []
+                                                          binop:
+                                                            Plus:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 379
+                                                                  line: 7
+                                                                  character: 107
+                                                                end_position:
+                                                                  bytes: 380
+                                                                  line: 7
+                                                                  character: 108
+                                                                token_type:
+                                                                  type: Symbol
+                                                                  symbol: +
+                                                              trailing_trivia:
+                                                                - start_position:
+                                                                    bytes: 380
+                                                                    line: 7
+                                                                    character: 108
+                                                                  end_position:
+                                                                    bytes: 381
+                                                                    line: 7
+                                                                    character: 109
+                                                                  token_type:
+                                                                    type: Whitespace
+                                                                    characters: " "
+                                                          rhs:
+                                                            Var:
+                                                              Expression:
+                                                                prefix:
+                                                                  Name:
+                                                                    leading_trivia: []
+                                                                    token:
+                                                                      start_position:
+                                                                        bytes: 381
+                                                                        line: 7
+                                                                        character: 109
+                                                                      end_position:
+                                                                        bytes: 385
+                                                                        line: 7
+                                                                        character: 113
+                                                                      token_type:
+                                                                        type: Identifier
+                                                                        identifier: self
+                                                                    trailing_trivia: []
+                                                                suffixes:
+                                                                  - Index:
+                                                                      Dot:
+                                                                        dot:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 385
+                                                                              line: 7
+                                                                              character: 113
+                                                                            end_position:
+                                                                              bytes: 386
+                                                                              line: 7
+                                                                              character: 114
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: "."
+                                                                          trailing_trivia: []
+                                                                        name:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 386
+                                                                              line: 7
+                                                                              character: 114
+                                                                            end_position:
+                                                                              bytes: 391
+                                                                              line: 7
+                                                                              character: 119
+                                                                            token_type:
+                                                                              type: Identifier
+                                                                              identifier: props
+                                                                          trailing_trivia: []
+                                                                  - Index:
+                                                                      Dot:
+                                                                        dot:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 391
+                                                                              line: 7
+                                                                              character: 119
+                                                                            end_position:
+                                                                              bytes: 392
+                                                                              line: 7
+                                                                              character: 120
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: "."
+                                                                          trailing_trivia: []
+                                                                        name:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 392
+                                                                              line: 7
+                                                                              character: 120
+                                                                            end_position:
+                                                                              bytes: 405
+                                                                              line: 7
+                                                                              character: 133
+                                                                            token_type:
+                                                                              type: Identifier
+                                                                              identifier: minScaleRatio
+                                                                          trailing_trivia:
+                                                                            - start_position:
+                                                                                bytes: 405
+                                                                                line: 7
+                                                                                character: 133
+                                                                              end_position:
+                                                                                bytes: 406
+                                                                                line: 7
+                                                                                character: 133
+                                                                              token_type:
+                                                                                type: Whitespace
+                                                                                characters: "\n"
+                                            - ~
+                                          - - LocalAssignment:
+                                                local_token:
+                                                  leading_trivia:
+                                                    - start_position:
+                                                        bytes: 406
+                                                        line: 8
+                                                        character: 1
+                                                      end_position:
+                                                        bytes: 410
+                                                        line: 8
+                                                        character: 5
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\t\t\t\t"
+                                                  token:
+                                                    start_position:
+                                                      bytes: 410
+                                                      line: 8
+                                                      character: 5
+                                                    end_position:
+                                                      bytes: 415
+                                                      line: 8
+                                                      character: 10
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: local
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 415
+                                                        line: 8
+                                                        character: 10
+                                                      end_position:
+                                                        bytes: 416
+                                                        line: 8
+                                                        character: 11
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                                name_list:
+                                                  pairs:
+                                                    - End:
+                                                        leading_trivia: []
+                                                        token:
+                                                          start_position:
+                                                            bytes: 416
+                                                            line: 8
+                                                            character: 11
+                                                          end_position:
+                                                            bytes: 422
+                                                            line: 8
+                                                            character: 17
+                                                          token_type:
+                                                            type: Identifier
+                                                            identifier: ratio2
+                                                        trailing_trivia:
+                                                          - start_position:
+                                                              bytes: 422
+                                                              line: 8
+                                                              character: 17
+                                                            end_position:
+                                                              bytes: 423
+                                                              line: 8
+                                                              character: 18
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: " "
+                                                equal_token:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 423
+                                                      line: 8
+                                                      character: 18
+                                                    end_position:
+                                                      bytes: 424
+                                                      line: 8
+                                                      character: 19
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: "="
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 424
+                                                        line: 8
+                                                        character: 19
+                                                      end_position:
+                                                        bytes: 425
+                                                        line: 8
+                                                        character: 20
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                                expr_list:
+                                                  pairs:
+                                                    - End:
+                                                        BinaryOperator:
+                                                          lhs:
+                                                            BinaryOperator:
+                                                              lhs:
+                                                                BinaryOperator:
+                                                                  lhs:
+                                                                    BinaryOperator:
+                                                                      lhs:
+                                                                        Parentheses:
+                                                                          contained:
+                                                                            tokens:
+                                                                              - leading_trivia: []
+                                                                                token:
+                                                                                  start_position:
+                                                                                    bytes: 425
+                                                                                    line: 8
+                                                                                    character: 20
+                                                                                  end_position:
+                                                                                    bytes: 426
+                                                                                    line: 8
+                                                                                    character: 21
+                                                                                  token_type:
+                                                                                    type: Symbol
+                                                                                    symbol: (
+                                                                                trailing_trivia: []
+                                                                              - leading_trivia: []
+                                                                                token:
+                                                                                  start_position:
+                                                                                    bytes: 447
+                                                                                    line: 8
+                                                                                    character: 42
+                                                                                  end_position:
+                                                                                    bytes: 448
+                                                                                    line: 8
+                                                                                    character: 43
+                                                                                  token_type:
+                                                                                    type: Symbol
+                                                                                    symbol: )
+                                                                                trailing_trivia:
+                                                                                  - start_position:
+                                                                                      bytes: 448
+                                                                                      line: 8
+                                                                                      character: 43
+                                                                                    end_position:
+                                                                                      bytes: 449
+                                                                                      line: 8
+                                                                                      character: 44
+                                                                                    token_type:
+                                                                                      type: Whitespace
+                                                                                      characters: " "
+                                                                          expression:
+                                                                            BinaryOperator:
+                                                                              lhs:
+                                                                                Var:
+                                                                                  Name:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 426
+                                                                                        line: 8
+                                                                                        character: 21
+                                                                                      end_position:
+                                                                                        bytes: 433
+                                                                                        line: 8
+                                                                                        character: 28
+                                                                                      token_type:
+                                                                                        type: Identifier
+                                                                                        identifier: minAxis
+                                                                                    trailing_trivia:
+                                                                                      - start_position:
+                                                                                          bytes: 433
+                                                                                          line: 8
+                                                                                          character: 28
+                                                                                        end_position:
+                                                                                          bytes: 434
+                                                                                          line: 8
+                                                                                          character: 29
+                                                                                        token_type:
+                                                                                          type: Whitespace
+                                                                                          characters: " "
+                                                                              binop:
+                                                                                Minus:
+                                                                                  leading_trivia: []
+                                                                                  token:
+                                                                                    start_position:
+                                                                                      bytes: 434
+                                                                                      line: 8
+                                                                                      character: 29
+                                                                                    end_position:
+                                                                                      bytes: 435
+                                                                                      line: 8
+                                                                                      character: 30
+                                                                                    token_type:
+                                                                                      type: Symbol
+                                                                                      symbol: "-"
+                                                                                  trailing_trivia:
+                                                                                    - start_position:
+                                                                                        bytes: 435
+                                                                                        line: 8
+                                                                                        character: 30
+                                                                                      end_position:
+                                                                                        bytes: 436
+                                                                                        line: 8
+                                                                                        character: 31
+                                                                                      token_type:
+                                                                                        type: Whitespace
+                                                                                        characters: " "
+                                                                              rhs:
+                                                                                Var:
+                                                                                  Name:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 436
+                                                                                        line: 8
+                                                                                        character: 31
+                                                                                      end_position:
+                                                                                        bytes: 447
+                                                                                        line: 8
+                                                                                        character: 42
+                                                                                      token_type:
+                                                                                        type: Identifier
+                                                                                        identifier: minAxisSize
+                                                                                    trailing_trivia: []
+                                                                      binop:
+                                                                        Slash:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 449
+                                                                              line: 8
+                                                                              character: 44
+                                                                            end_position:
+                                                                              bytes: 450
+                                                                              line: 8
+                                                                              character: 45
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: /
+                                                                          trailing_trivia:
+                                                                            - start_position:
+                                                                                bytes: 450
+                                                                                line: 8
+                                                                                character: 45
+                                                                              end_position:
+                                                                                bytes: 451
+                                                                                line: 8
+                                                                                character: 46
+                                                                              token_type:
+                                                                                type: Whitespace
+                                                                                characters: " "
+                                                                      rhs:
+                                                                        Var:
+                                                                          Name:
+                                                                            leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 451
+                                                                                line: 8
+                                                                                character: 46
+                                                                              end_position:
+                                                                                bytes: 456
+                                                                                line: 8
+                                                                                character: 51
+                                                                              token_type:
+                                                                                type: Identifier
+                                                                                identifier: delta
+                                                                            trailing_trivia:
+                                                                              - start_position:
+                                                                                  bytes: 456
+                                                                                  line: 8
+                                                                                  character: 51
+                                                                                end_position:
+                                                                                  bytes: 457
+                                                                                  line: 8
+                                                                                  character: 52
+                                                                                token_type:
+                                                                                  type: Whitespace
+                                                                                  characters: " "
+                                                                  binop:
+                                                                    Star:
+                                                                      leading_trivia: []
+                                                                      token:
+                                                                        start_position:
+                                                                          bytes: 457
+                                                                          line: 8
+                                                                          character: 52
+                                                                        end_position:
+                                                                          bytes: 458
+                                                                          line: 8
+                                                                          character: 53
+                                                                        token_type:
+                                                                          type: Symbol
+                                                                          symbol: "*"
+                                                                      trailing_trivia:
+                                                                        - start_position:
+                                                                            bytes: 458
+                                                                            line: 8
+                                                                            character: 53
+                                                                          end_position:
+                                                                            bytes: 459
+                                                                            line: 8
+                                                                            character: 54
+                                                                          token_type:
+                                                                            type: Whitespace
+                                                                            characters: " "
+                                                                  rhs:
+                                                                    Parentheses:
+                                                                      contained:
+                                                                        tokens:
+                                                                          - leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 459
+                                                                                line: 8
+                                                                                character: 54
+                                                                              end_position:
+                                                                                bytes: 460
+                                                                                line: 8
+                                                                                character: 55
+                                                                              token_type:
+                                                                                type: Symbol
+                                                                                symbol: (
+                                                                            trailing_trivia: []
+                                                                          - leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 511
+                                                                                line: 8
+                                                                                character: 106
+                                                                              end_position:
+                                                                                bytes: 512
+                                                                                line: 8
+                                                                                character: 107
+                                                                              token_type:
+                                                                                type: Symbol
+                                                                                symbol: )
+                                                                            trailing_trivia:
+                                                                              - start_position:
+                                                                                  bytes: 512
+                                                                                  line: 8
+                                                                                  character: 107
+                                                                                end_position:
+                                                                                  bytes: 513
+                                                                                  line: 8
+                                                                                  character: 108
+                                                                                token_type:
+                                                                                  type: Whitespace
+                                                                                  characters: " "
+                                                                      expression:
+                                                                        BinaryOperator:
+                                                                          lhs:
+                                                                            Var:
+                                                                              Expression:
+                                                                                prefix:
+                                                                                  Name:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 460
+                                                                                        line: 8
+                                                                                        character: 55
+                                                                                      end_position:
+                                                                                        bytes: 464
+                                                                                        line: 8
+                                                                                        character: 59
+                                                                                      token_type:
+                                                                                        type: Identifier
+                                                                                        identifier: self
+                                                                                    trailing_trivia: []
+                                                                                suffixes:
+                                                                                  - Index:
+                                                                                      Dot:
+                                                                                        dot:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 464
+                                                                                              line: 8
+                                                                                              character: 59
+                                                                                            end_position:
+                                                                                              bytes: 465
+                                                                                              line: 8
+                                                                                              character: 60
+                                                                                            token_type:
+                                                                                              type: Symbol
+                                                                                              symbol: "."
+                                                                                          trailing_trivia: []
+                                                                                        name:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 465
+                                                                                              line: 8
+                                                                                              character: 60
+                                                                                            end_position:
+                                                                                              bytes: 470
+                                                                                              line: 8
+                                                                                              character: 65
+                                                                                            token_type:
+                                                                                              type: Identifier
+                                                                                              identifier: props
+                                                                                          trailing_trivia: []
+                                                                                  - Index:
+                                                                                      Dot:
+                                                                                        dot:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 470
+                                                                                              line: 8
+                                                                                              character: 65
+                                                                                            end_position:
+                                                                                              bytes: 471
+                                                                                              line: 8
+                                                                                              character: 66
+                                                                                            token_type:
+                                                                                              type: Symbol
+                                                                                              symbol: "."
+                                                                                          trailing_trivia: []
+                                                                                        name:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 471
+                                                                                              line: 8
+                                                                                              character: 66
+                                                                                            end_position:
+                                                                                              bytes: 484
+                                                                                              line: 8
+                                                                                              character: 79
+                                                                                            token_type:
+                                                                                              type: Identifier
+                                                                                              identifier: maxScaleRatio
+                                                                                          trailing_trivia:
+                                                                                            - start_position:
+                                                                                                bytes: 484
+                                                                                                line: 8
+                                                                                                character: 79
+                                                                                              end_position:
+                                                                                                bytes: 485
+                                                                                                line: 8
+                                                                                                character: 80
+                                                                                              token_type:
+                                                                                                type: Whitespace
+                                                                                                characters: " "
+                                                                          binop:
+                                                                            Minus:
+                                                                              leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 485
+                                                                                  line: 8
+                                                                                  character: 80
+                                                                                end_position:
+                                                                                  bytes: 486
+                                                                                  line: 8
+                                                                                  character: 81
+                                                                                token_type:
+                                                                                  type: Symbol
+                                                                                  symbol: "-"
+                                                                              trailing_trivia:
+                                                                                - start_position:
+                                                                                    bytes: 486
+                                                                                    line: 8
+                                                                                    character: 81
+                                                                                  end_position:
+                                                                                    bytes: 487
+                                                                                    line: 8
+                                                                                    character: 82
+                                                                                  token_type:
+                                                                                    type: Whitespace
+                                                                                    characters: " "
+                                                                          rhs:
+                                                                            Var:
+                                                                              Expression:
+                                                                                prefix:
+                                                                                  Name:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 487
+                                                                                        line: 8
+                                                                                        character: 82
+                                                                                      end_position:
+                                                                                        bytes: 491
+                                                                                        line: 8
+                                                                                        character: 86
+                                                                                      token_type:
+                                                                                        type: Identifier
+                                                                                        identifier: self
+                                                                                    trailing_trivia: []
+                                                                                suffixes:
+                                                                                  - Index:
+                                                                                      Dot:
+                                                                                        dot:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 491
+                                                                                              line: 8
+                                                                                              character: 86
+                                                                                            end_position:
+                                                                                              bytes: 492
+                                                                                              line: 8
+                                                                                              character: 87
+                                                                                            token_type:
+                                                                                              type: Symbol
+                                                                                              symbol: "."
+                                                                                          trailing_trivia: []
+                                                                                        name:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 492
+                                                                                              line: 8
+                                                                                              character: 87
+                                                                                            end_position:
+                                                                                              bytes: 497
+                                                                                              line: 8
+                                                                                              character: 92
+                                                                                            token_type:
+                                                                                              type: Identifier
+                                                                                              identifier: props
+                                                                                          trailing_trivia: []
+                                                                                  - Index:
+                                                                                      Dot:
+                                                                                        dot:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 497
+                                                                                              line: 8
+                                                                                              character: 92
+                                                                                            end_position:
+                                                                                              bytes: 498
+                                                                                              line: 8
+                                                                                              character: 93
+                                                                                            token_type:
+                                                                                              type: Symbol
+                                                                                              symbol: "."
+                                                                                          trailing_trivia: []
+                                                                                        name:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 498
+                                                                                              line: 8
+                                                                                              character: 93
+                                                                                            end_position:
+                                                                                              bytes: 511
+                                                                                              line: 8
+                                                                                              character: 106
+                                                                                            token_type:
+                                                                                              type: Identifier
+                                                                                              identifier: minScaleRatio
+                                                                                          trailing_trivia: []
+                                                              binop:
+                                                                Star:
+                                                                  leading_trivia: []
+                                                                  token:
+                                                                    start_position:
+                                                                      bytes: 513
+                                                                      line: 8
+                                                                      character: 108
+                                                                    end_position:
+                                                                      bytes: 514
+                                                                      line: 8
+                                                                      character: 109
+                                                                    token_type:
+                                                                      type: Symbol
+                                                                      symbol: "*"
+                                                                  trailing_trivia:
+                                                                    - start_position:
+                                                                        bytes: 514
+                                                                        line: 8
+                                                                        character: 109
+                                                                      end_position:
+                                                                        bytes: 515
+                                                                        line: 8
+                                                                        character: 110
+                                                                      token_type:
+                                                                        type: Whitespace
+                                                                        characters: " "
+                                                              rhs:
+                                                                Var:
+                                                                  Expression:
+                                                                    prefix:
+                                                                      Name:
+                                                                        leading_trivia: []
+                                                                        token:
+                                                                          start_position:
+                                                                            bytes: 515
+                                                                            line: 8
+                                                                            character: 110
+                                                                          end_position:
+                                                                            bytes: 519
+                                                                            line: 8
+                                                                            character: 114
+                                                                          token_type:
+                                                                            type: Identifier
+                                                                            identifier: self
+                                                                        trailing_trivia: []
+                                                                    suffixes:
+                                                                      - Index:
+                                                                          Dot:
+                                                                            dot:
+                                                                              leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 519
+                                                                                  line: 8
+                                                                                  character: 114
+                                                                                end_position:
+                                                                                  bytes: 520
+                                                                                  line: 8
+                                                                                  character: 115
+                                                                                token_type:
+                                                                                  type: Symbol
+                                                                                  symbol: "."
+                                                                              trailing_trivia: []
+                                                                            name:
+                                                                              leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 520
+                                                                                  line: 8
+                                                                                  character: 115
+                                                                                end_position:
+                                                                                  bytes: 525
+                                                                                  line: 8
+                                                                                  character: 120
+                                                                                token_type:
+                                                                                  type: Identifier
+                                                                                  identifier: props
+                                                                              trailing_trivia: []
+                                                                      - Index:
+                                                                          Dot:
+                                                                            dot:
+                                                                              leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 525
+                                                                                  line: 8
+                                                                                  character: 120
+                                                                                end_position:
+                                                                                  bytes: 526
+                                                                                  line: 8
+                                                                                  character: 121
+                                                                                token_type:
+                                                                                  type: Symbol
+                                                                                  symbol: "."
+                                                                              trailing_trivia: []
+                                                                            name:
+                                                                              leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 526
+                                                                                  line: 8
+                                                                                  character: 121
+                                                                                end_position:
+                                                                                  bytes: 556
+                                                                                  line: 8
+                                                                                  character: 151
+                                                                                token_type:
+                                                                                  type: Identifier
+                                                                                  identifier: aRandomVariableWhichIsVeryLong
+                                                                              trailing_trivia:
+                                                                                - start_position:
+                                                                                    bytes: 556
+                                                                                    line: 8
+                                                                                    character: 151
+                                                                                  end_position:
+                                                                                    bytes: 557
+                                                                                    line: 8
+                                                                                    character: 152
+                                                                                  token_type:
+                                                                                    type: Whitespace
+                                                                                    characters: " "
+                                                          binop:
+                                                            Plus:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 557
+                                                                  line: 8
+                                                                  character: 152
+                                                                end_position:
+                                                                  bytes: 558
+                                                                  line: 8
+                                                                  character: 153
+                                                                token_type:
+                                                                  type: Symbol
+                                                                  symbol: +
+                                                              trailing_trivia:
+                                                                - start_position:
+                                                                    bytes: 558
+                                                                    line: 8
+                                                                    character: 153
+                                                                  end_position:
+                                                                    bytes: 559
+                                                                    line: 8
+                                                                    character: 154
+                                                                  token_type:
+                                                                    type: Whitespace
+                                                                    characters: " "
+                                                          rhs:
+                                                            Var:
+                                                              Expression:
+                                                                prefix:
+                                                                  Name:
+                                                                    leading_trivia: []
+                                                                    token:
+                                                                      start_position:
+                                                                        bytes: 559
+                                                                        line: 8
+                                                                        character: 154
+                                                                      end_position:
+                                                                        bytes: 563
+                                                                        line: 8
+                                                                        character: 158
+                                                                      token_type:
+                                                                        type: Identifier
+                                                                        identifier: self
+                                                                    trailing_trivia: []
+                                                                suffixes:
+                                                                  - Index:
+                                                                      Dot:
+                                                                        dot:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 563
+                                                                              line: 8
+                                                                              character: 158
+                                                                            end_position:
+                                                                              bytes: 564
+                                                                              line: 8
+                                                                              character: 159
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: "."
+                                                                          trailing_trivia: []
+                                                                        name:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 564
+                                                                              line: 8
+                                                                              character: 159
+                                                                            end_position:
+                                                                              bytes: 569
+                                                                              line: 8
+                                                                              character: 164
+                                                                            token_type:
+                                                                              type: Identifier
+                                                                              identifier: props
+                                                                          trailing_trivia: []
+                                                                  - Index:
+                                                                      Dot:
+                                                                        dot:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 569
+                                                                              line: 8
+                                                                              character: 164
+                                                                            end_position:
+                                                                              bytes: 570
+                                                                              line: 8
+                                                                              character: 165
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: "."
+                                                                          trailing_trivia: []
+                                                                        name:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 570
+                                                                              line: 8
+                                                                              character: 165
+                                                                            end_position:
+                                                                              bytes: 583
+                                                                              line: 8
+                                                                              character: 178
+                                                                            token_type:
+                                                                              type: Identifier
+                                                                              identifier: minScaleRatio
+                                                                          trailing_trivia:
+                                                                            - start_position:
+                                                                                bytes: 583
+                                                                                line: 8
+                                                                                character: 178
+                                                                              end_position:
+                                                                                bytes: 584
+                                                                                line: 8
+                                                                                character: 178
+                                                                              token_type:
+                                                                                type: Whitespace
+                                                                                characters: "\n"
+                                            - ~
+                                      end_token:
+                                        leading_trivia:
+                                          - start_position:
+                                              bytes: 584
+                                              line: 9
+                                              character: 1
+                                            end_position:
+                                              bytes: 587
+                                              line: 9
+                                              character: 4
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\t\t\t"
+                                        token:
+                                          start_position:
+                                            bytes: 587
+                                            line: 9
+                                            character: 4
+                                          end_position:
+                                            bytes: 590
+                                            line: 9
+                                            character: 7
+                                          token_type:
+                                            type: Symbol
+                                            symbol: end
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 590
+                                              line: 9
+                                              character: 7
+                                            end_position:
+                                              bytes: 591
+                                              line: 9
+                                              character: 7
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\n"
+                                  - ~
+                            end_token:
+                              leading_trivia:
+                                - start_position:
+                                    bytes: 591
+                                    line: 10
+                                    character: 1
+                                  end_position:
+                                    bytes: 593
+                                    line: 10
+                                    character: 3
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\t\t"
+                              token:
+                                start_position:
+                                  bytes: 593
+                                  line: 10
+                                  character: 3
+                                end_position:
+                                  bytes: 596
+                                  line: 10
+                                  character: 6
+                                token_type:
+                                  type: Symbol
+                                  symbol: end
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 596
+                                    line: 10
+                                    character: 6
+                                  end_position:
+                                    bytes: 597
+                                    line: 10
+                                    character: 6
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                        - ~
+                  end_token:
+                    leading_trivia:
+                      - start_position:
+                          bytes: 597
+                          line: 11
+                          character: 1
+                        end_position:
+                          bytes: 598
+                          line: 11
+                          character: 2
+                        token_type:
+                          type: Whitespace
+                          characters: "\t"
+                    token:
+                      start_position:
+                        bytes: 598
+                        line: 11
+                        character: 2
+                      end_position:
+                        bytes: 601
+                        line: 11
+                        character: 5
+                      token_type:
+                        type: Symbol
+                        symbol: end
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 601
+                          line: 11
+                          character: 5
+                        end_position:
+                          bytes: 602
+                          line: 11
+                          character: 5
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 602
+              line: 12
+              character: 1
+            end_position:
+              bytes: 605
+              line: 12
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 605
+                line: 12
+                character: 4
+              end_position:
+                bytes: 606
+                line: 12
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/source.lua
new file mode 100644
index 00000000..c899cbb5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/source.lua
@@ -0,0 +1,12 @@
+-- Taken from https://github.com/JohnnyMorganz/StyLua/blob/main/tests/inputs/multiline-expressions-3.lua
+do
+	do
+		do
+			do
+				local text = "Players: " .. #Server_Container.ARandomVariableWhichIsVeryLongSoThatThisGetsOverTheColumnLimit.Players_F:GetChildren() - 1 .. "/20"
+				local ratio = (minAxis - minAxisSize) / delta * (self.props.maxScaleRatio - self.props.minScaleRatio) + self.props.minScaleRatio
+				local ratio2 = (minAxis - minAxisSize) / delta * (self.props.maxScaleRatio - self.props.minScaleRatio) * self.props.aRandomVariableWhichIsVeryLong + self.props.minScaleRatio
+			end
+		end
+	end
+end
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/tokens.snap
new file mode 100644
index 00000000..5d2629e2
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/multiline_expressions/tokens.snap
@@ -0,0 +1,1689 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/roblox_cases/pass/multiline_expressions
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 104
+    line: 1
+    character: 105
+  token_type:
+    type: SingleLineComment
+    comment: " Taken from https://github.com/JohnnyMorganz/StyLua/blob/main/tests/inputs/multiline-expressions-3.lua"
+- start_position:
+    bytes: 104
+    line: 1
+    character: 105
+  end_position:
+    bytes: 105
+    line: 1
+    character: 105
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 105
+    line: 2
+    character: 1
+  end_position:
+    bytes: 107
+    line: 2
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 107
+    line: 2
+    character: 3
+  end_position:
+    bytes: 108
+    line: 2
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 108
+    line: 3
+    character: 1
+  end_position:
+    bytes: 109
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 109
+    line: 3
+    character: 2
+  end_position:
+    bytes: 111
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 111
+    line: 3
+    character: 4
+  end_position:
+    bytes: 112
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 112
+    line: 4
+    character: 1
+  end_position:
+    bytes: 114
+    line: 4
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\t\t"
+- start_position:
+    bytes: 114
+    line: 4
+    character: 3
+  end_position:
+    bytes: 116
+    line: 4
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 116
+    line: 4
+    character: 5
+  end_position:
+    bytes: 117
+    line: 4
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 117
+    line: 5
+    character: 1
+  end_position:
+    bytes: 120
+    line: 5
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 120
+    line: 5
+    character: 4
+  end_position:
+    bytes: 122
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 122
+    line: 5
+    character: 6
+  end_position:
+    bytes: 123
+    line: 5
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 123
+    line: 6
+    character: 1
+  end_position:
+    bytes: 127
+    line: 6
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t\t"
+- start_position:
+    bytes: 127
+    line: 6
+    character: 5
+  end_position:
+    bytes: 132
+    line: 6
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 132
+    line: 6
+    character: 10
+  end_position:
+    bytes: 133
+    line: 6
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 133
+    line: 6
+    character: 11
+  end_position:
+    bytes: 137
+    line: 6
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: text
+- start_position:
+    bytes: 137
+    line: 6
+    character: 15
+  end_position:
+    bytes: 138
+    line: 6
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 138
+    line: 6
+    character: 16
+  end_position:
+    bytes: 139
+    line: 6
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 139
+    line: 6
+    character: 17
+  end_position:
+    bytes: 140
+    line: 6
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 140
+    line: 6
+    character: 18
+  end_position:
+    bytes: 151
+    line: 6
+    character: 29
+  token_type:
+    type: StringLiteral
+    literal: "Players: "
+    quote_type: Double
+- start_position:
+    bytes: 151
+    line: 6
+    character: 29
+  end_position:
+    bytes: 152
+    line: 6
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 152
+    line: 6
+    character: 30
+  end_position:
+    bytes: 154
+    line: 6
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: ".."
+- start_position:
+    bytes: 154
+    line: 6
+    character: 32
+  end_position:
+    bytes: 155
+    line: 6
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 155
+    line: 6
+    character: 33
+  end_position:
+    bytes: 156
+    line: 6
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: "#"
+- start_position:
+    bytes: 156
+    line: 6
+    character: 34
+  end_position:
+    bytes: 172
+    line: 6
+    character: 50
+  token_type:
+    type: Identifier
+    identifier: Server_Container
+- start_position:
+    bytes: 172
+    line: 6
+    character: 50
+  end_position:
+    bytes: 173
+    line: 6
+    character: 51
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 173
+    line: 6
+    character: 51
+  end_position:
+    bytes: 235
+    line: 6
+    character: 113
+  token_type:
+    type: Identifier
+    identifier: ARandomVariableWhichIsVeryLongSoThatThisGetsOverTheColumnLimit
+- start_position:
+    bytes: 235
+    line: 6
+    character: 113
+  end_position:
+    bytes: 236
+    line: 6
+    character: 114
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 236
+    line: 6
+    character: 114
+  end_position:
+    bytes: 245
+    line: 6
+    character: 123
+  token_type:
+    type: Identifier
+    identifier: Players_F
+- start_position:
+    bytes: 245
+    line: 6
+    character: 123
+  end_position:
+    bytes: 246
+    line: 6
+    character: 124
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 246
+    line: 6
+    character: 124
+  end_position:
+    bytes: 257
+    line: 6
+    character: 135
+  token_type:
+    type: Identifier
+    identifier: GetChildren
+- start_position:
+    bytes: 257
+    line: 6
+    character: 135
+  end_position:
+    bytes: 258
+    line: 6
+    character: 136
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 258
+    line: 6
+    character: 136
+  end_position:
+    bytes: 259
+    line: 6
+    character: 137
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 259
+    line: 6
+    character: 137
+  end_position:
+    bytes: 260
+    line: 6
+    character: 138
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 260
+    line: 6
+    character: 138
+  end_position:
+    bytes: 261
+    line: 6
+    character: 139
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 261
+    line: 6
+    character: 139
+  end_position:
+    bytes: 262
+    line: 6
+    character: 140
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 262
+    line: 6
+    character: 140
+  end_position:
+    bytes: 263
+    line: 6
+    character: 141
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 263
+    line: 6
+    character: 141
+  end_position:
+    bytes: 264
+    line: 6
+    character: 142
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 264
+    line: 6
+    character: 142
+  end_position:
+    bytes: 266
+    line: 6
+    character: 144
+  token_type:
+    type: Symbol
+    symbol: ".."
+- start_position:
+    bytes: 266
+    line: 6
+    character: 144
+  end_position:
+    bytes: 267
+    line: 6
+    character: 145
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 267
+    line: 6
+    character: 145
+  end_position:
+    bytes: 272
+    line: 6
+    character: 150
+  token_type:
+    type: StringLiteral
+    literal: /20
+    quote_type: Double
+- start_position:
+    bytes: 272
+    line: 6
+    character: 150
+  end_position:
+    bytes: 273
+    line: 6
+    character: 150
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 273
+    line: 7
+    character: 1
+  end_position:
+    bytes: 277
+    line: 7
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t\t"
+- start_position:
+    bytes: 277
+    line: 7
+    character: 5
+  end_position:
+    bytes: 282
+    line: 7
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 282
+    line: 7
+    character: 10
+  end_position:
+    bytes: 283
+    line: 7
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 283
+    line: 7
+    character: 11
+  end_position:
+    bytes: 288
+    line: 7
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: ratio
+- start_position:
+    bytes: 288
+    line: 7
+    character: 16
+  end_position:
+    bytes: 289
+    line: 7
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 289
+    line: 7
+    character: 17
+  end_position:
+    bytes: 290
+    line: 7
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 290
+    line: 7
+    character: 18
+  end_position:
+    bytes: 291
+    line: 7
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 291
+    line: 7
+    character: 19
+  end_position:
+    bytes: 292
+    line: 7
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 292
+    line: 7
+    character: 20
+  end_position:
+    bytes: 299
+    line: 7
+    character: 27
+  token_type:
+    type: Identifier
+    identifier: minAxis
+- start_position:
+    bytes: 299
+    line: 7
+    character: 27
+  end_position:
+    bytes: 300
+    line: 7
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 300
+    line: 7
+    character: 28
+  end_position:
+    bytes: 301
+    line: 7
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 301
+    line: 7
+    character: 29
+  end_position:
+    bytes: 302
+    line: 7
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 302
+    line: 7
+    character: 30
+  end_position:
+    bytes: 313
+    line: 7
+    character: 41
+  token_type:
+    type: Identifier
+    identifier: minAxisSize
+- start_position:
+    bytes: 313
+    line: 7
+    character: 41
+  end_position:
+    bytes: 314
+    line: 7
+    character: 42
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 314
+    line: 7
+    character: 42
+  end_position:
+    bytes: 315
+    line: 7
+    character: 43
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 315
+    line: 7
+    character: 43
+  end_position:
+    bytes: 316
+    line: 7
+    character: 44
+  token_type:
+    type: Symbol
+    symbol: /
+- start_position:
+    bytes: 316
+    line: 7
+    character: 44
+  end_position:
+    bytes: 317
+    line: 7
+    character: 45
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 317
+    line: 7
+    character: 45
+  end_position:
+    bytes: 322
+    line: 7
+    character: 50
+  token_type:
+    type: Identifier
+    identifier: delta
+- start_position:
+    bytes: 322
+    line: 7
+    character: 50
+  end_position:
+    bytes: 323
+    line: 7
+    character: 51
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 323
+    line: 7
+    character: 51
+  end_position:
+    bytes: 324
+    line: 7
+    character: 52
+  token_type:
+    type: Symbol
+    symbol: "*"
+- start_position:
+    bytes: 324
+    line: 7
+    character: 52
+  end_position:
+    bytes: 325
+    line: 7
+    character: 53
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 325
+    line: 7
+    character: 53
+  end_position:
+    bytes: 326
+    line: 7
+    character: 54
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 326
+    line: 7
+    character: 54
+  end_position:
+    bytes: 330
+    line: 7
+    character: 58
+  token_type:
+    type: Identifier
+    identifier: self
+- start_position:
+    bytes: 330
+    line: 7
+    character: 58
+  end_position:
+    bytes: 331
+    line: 7
+    character: 59
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 331
+    line: 7
+    character: 59
+  end_position:
+    bytes: 336
+    line: 7
+    character: 64
+  token_type:
+    type: Identifier
+    identifier: props
+- start_position:
+    bytes: 336
+    line: 7
+    character: 64
+  end_position:
+    bytes: 337
+    line: 7
+    character: 65
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 337
+    line: 7
+    character: 65
+  end_position:
+    bytes: 350
+    line: 7
+    character: 78
+  token_type:
+    type: Identifier
+    identifier: maxScaleRatio
+- start_position:
+    bytes: 350
+    line: 7
+    character: 78
+  end_position:
+    bytes: 351
+    line: 7
+    character: 79
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 351
+    line: 7
+    character: 79
+  end_position:
+    bytes: 352
+    line: 7
+    character: 80
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 352
+    line: 7
+    character: 80
+  end_position:
+    bytes: 353
+    line: 7
+    character: 81
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 353
+    line: 7
+    character: 81
+  end_position:
+    bytes: 357
+    line: 7
+    character: 85
+  token_type:
+    type: Identifier
+    identifier: self
+- start_position:
+    bytes: 357
+    line: 7
+    character: 85
+  end_position:
+    bytes: 358
+    line: 7
+    character: 86
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 358
+    line: 7
+    character: 86
+  end_position:
+    bytes: 363
+    line: 7
+    character: 91
+  token_type:
+    type: Identifier
+    identifier: props
+- start_position:
+    bytes: 363
+    line: 7
+    character: 91
+  end_position:
+    bytes: 364
+    line: 7
+    character: 92
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 364
+    line: 7
+    character: 92
+  end_position:
+    bytes: 377
+    line: 7
+    character: 105
+  token_type:
+    type: Identifier
+    identifier: minScaleRatio
+- start_position:
+    bytes: 377
+    line: 7
+    character: 105
+  end_position:
+    bytes: 378
+    line: 7
+    character: 106
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 378
+    line: 7
+    character: 106
+  end_position:
+    bytes: 379
+    line: 7
+    character: 107
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 379
+    line: 7
+    character: 107
+  end_position:
+    bytes: 380
+    line: 7
+    character: 108
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 380
+    line: 7
+    character: 108
+  end_position:
+    bytes: 381
+    line: 7
+    character: 109
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 381
+    line: 7
+    character: 109
+  end_position:
+    bytes: 385
+    line: 7
+    character: 113
+  token_type:
+    type: Identifier
+    identifier: self
+- start_position:
+    bytes: 385
+    line: 7
+    character: 113
+  end_position:
+    bytes: 386
+    line: 7
+    character: 114
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 386
+    line: 7
+    character: 114
+  end_position:
+    bytes: 391
+    line: 7
+    character: 119
+  token_type:
+    type: Identifier
+    identifier: props
+- start_position:
+    bytes: 391
+    line: 7
+    character: 119
+  end_position:
+    bytes: 392
+    line: 7
+    character: 120
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 392
+    line: 7
+    character: 120
+  end_position:
+    bytes: 405
+    line: 7
+    character: 133
+  token_type:
+    type: Identifier
+    identifier: minScaleRatio
+- start_position:
+    bytes: 405
+    line: 7
+    character: 133
+  end_position:
+    bytes: 406
+    line: 7
+    character: 133
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 406
+    line: 8
+    character: 1
+  end_position:
+    bytes: 410
+    line: 8
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t\t"
+- start_position:
+    bytes: 410
+    line: 8
+    character: 5
+  end_position:
+    bytes: 415
+    line: 8
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 415
+    line: 8
+    character: 10
+  end_position:
+    bytes: 416
+    line: 8
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 416
+    line: 8
+    character: 11
+  end_position:
+    bytes: 422
+    line: 8
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: ratio2
+- start_position:
+    bytes: 422
+    line: 8
+    character: 17
+  end_position:
+    bytes: 423
+    line: 8
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 423
+    line: 8
+    character: 18
+  end_position:
+    bytes: 424
+    line: 8
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 424
+    line: 8
+    character: 19
+  end_position:
+    bytes: 425
+    line: 8
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 425
+    line: 8
+    character: 20
+  end_position:
+    bytes: 426
+    line: 8
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 426
+    line: 8
+    character: 21
+  end_position:
+    bytes: 433
+    line: 8
+    character: 28
+  token_type:
+    type: Identifier
+    identifier: minAxis
+- start_position:
+    bytes: 433
+    line: 8
+    character: 28
+  end_position:
+    bytes: 434
+    line: 8
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 434
+    line: 8
+    character: 29
+  end_position:
+    bytes: 435
+    line: 8
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 435
+    line: 8
+    character: 30
+  end_position:
+    bytes: 436
+    line: 8
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 436
+    line: 8
+    character: 31
+  end_position:
+    bytes: 447
+    line: 8
+    character: 42
+  token_type:
+    type: Identifier
+    identifier: minAxisSize
+- start_position:
+    bytes: 447
+    line: 8
+    character: 42
+  end_position:
+    bytes: 448
+    line: 8
+    character: 43
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 448
+    line: 8
+    character: 43
+  end_position:
+    bytes: 449
+    line: 8
+    character: 44
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 449
+    line: 8
+    character: 44
+  end_position:
+    bytes: 450
+    line: 8
+    character: 45
+  token_type:
+    type: Symbol
+    symbol: /
+- start_position:
+    bytes: 450
+    line: 8
+    character: 45
+  end_position:
+    bytes: 451
+    line: 8
+    character: 46
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 451
+    line: 8
+    character: 46
+  end_position:
+    bytes: 456
+    line: 8
+    character: 51
+  token_type:
+    type: Identifier
+    identifier: delta
+- start_position:
+    bytes: 456
+    line: 8
+    character: 51
+  end_position:
+    bytes: 457
+    line: 8
+    character: 52
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 457
+    line: 8
+    character: 52
+  end_position:
+    bytes: 458
+    line: 8
+    character: 53
+  token_type:
+    type: Symbol
+    symbol: "*"
+- start_position:
+    bytes: 458
+    line: 8
+    character: 53
+  end_position:
+    bytes: 459
+    line: 8
+    character: 54
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 459
+    line: 8
+    character: 54
+  end_position:
+    bytes: 460
+    line: 8
+    character: 55
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 460
+    line: 8
+    character: 55
+  end_position:
+    bytes: 464
+    line: 8
+    character: 59
+  token_type:
+    type: Identifier
+    identifier: self
+- start_position:
+    bytes: 464
+    line: 8
+    character: 59
+  end_position:
+    bytes: 465
+    line: 8
+    character: 60
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 465
+    line: 8
+    character: 60
+  end_position:
+    bytes: 470
+    line: 8
+    character: 65
+  token_type:
+    type: Identifier
+    identifier: props
+- start_position:
+    bytes: 470
+    line: 8
+    character: 65
+  end_position:
+    bytes: 471
+    line: 8
+    character: 66
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 471
+    line: 8
+    character: 66
+  end_position:
+    bytes: 484
+    line: 8
+    character: 79
+  token_type:
+    type: Identifier
+    identifier: maxScaleRatio
+- start_position:
+    bytes: 484
+    line: 8
+    character: 79
+  end_position:
+    bytes: 485
+    line: 8
+    character: 80
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 485
+    line: 8
+    character: 80
+  end_position:
+    bytes: 486
+    line: 8
+    character: 81
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 486
+    line: 8
+    character: 81
+  end_position:
+    bytes: 487
+    line: 8
+    character: 82
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 487
+    line: 8
+    character: 82
+  end_position:
+    bytes: 491
+    line: 8
+    character: 86
+  token_type:
+    type: Identifier
+    identifier: self
+- start_position:
+    bytes: 491
+    line: 8
+    character: 86
+  end_position:
+    bytes: 492
+    line: 8
+    character: 87
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 492
+    line: 8
+    character: 87
+  end_position:
+    bytes: 497
+    line: 8
+    character: 92
+  token_type:
+    type: Identifier
+    identifier: props
+- start_position:
+    bytes: 497
+    line: 8
+    character: 92
+  end_position:
+    bytes: 498
+    line: 8
+    character: 93
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 498
+    line: 8
+    character: 93
+  end_position:
+    bytes: 511
+    line: 8
+    character: 106
+  token_type:
+    type: Identifier
+    identifier: minScaleRatio
+- start_position:
+    bytes: 511
+    line: 8
+    character: 106
+  end_position:
+    bytes: 512
+    line: 8
+    character: 107
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 512
+    line: 8
+    character: 107
+  end_position:
+    bytes: 513
+    line: 8
+    character: 108
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 513
+    line: 8
+    character: 108
+  end_position:
+    bytes: 514
+    line: 8
+    character: 109
+  token_type:
+    type: Symbol
+    symbol: "*"
+- start_position:
+    bytes: 514
+    line: 8
+    character: 109
+  end_position:
+    bytes: 515
+    line: 8
+    character: 110
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 515
+    line: 8
+    character: 110
+  end_position:
+    bytes: 519
+    line: 8
+    character: 114
+  token_type:
+    type: Identifier
+    identifier: self
+- start_position:
+    bytes: 519
+    line: 8
+    character: 114
+  end_position:
+    bytes: 520
+    line: 8
+    character: 115
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 520
+    line: 8
+    character: 115
+  end_position:
+    bytes: 525
+    line: 8
+    character: 120
+  token_type:
+    type: Identifier
+    identifier: props
+- start_position:
+    bytes: 525
+    line: 8
+    character: 120
+  end_position:
+    bytes: 526
+    line: 8
+    character: 121
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 526
+    line: 8
+    character: 121
+  end_position:
+    bytes: 556
+    line: 8
+    character: 151
+  token_type:
+    type: Identifier
+    identifier: aRandomVariableWhichIsVeryLong
+- start_position:
+    bytes: 556
+    line: 8
+    character: 151
+  end_position:
+    bytes: 557
+    line: 8
+    character: 152
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 557
+    line: 8
+    character: 152
+  end_position:
+    bytes: 558
+    line: 8
+    character: 153
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 558
+    line: 8
+    character: 153
+  end_position:
+    bytes: 559
+    line: 8
+    character: 154
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 559
+    line: 8
+    character: 154
+  end_position:
+    bytes: 563
+    line: 8
+    character: 158
+  token_type:
+    type: Identifier
+    identifier: self
+- start_position:
+    bytes: 563
+    line: 8
+    character: 158
+  end_position:
+    bytes: 564
+    line: 8
+    character: 159
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 564
+    line: 8
+    character: 159
+  end_position:
+    bytes: 569
+    line: 8
+    character: 164
+  token_type:
+    type: Identifier
+    identifier: props
+- start_position:
+    bytes: 569
+    line: 8
+    character: 164
+  end_position:
+    bytes: 570
+    line: 8
+    character: 165
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 570
+    line: 8
+    character: 165
+  end_position:
+    bytes: 583
+    line: 8
+    character: 178
+  token_type:
+    type: Identifier
+    identifier: minScaleRatio
+- start_position:
+    bytes: 583
+    line: 8
+    character: 178
+  end_position:
+    bytes: 584
+    line: 8
+    character: 178
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 584
+    line: 9
+    character: 1
+  end_position:
+    bytes: 587
+    line: 9
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 587
+    line: 9
+    character: 4
+  end_position:
+    bytes: 590
+    line: 9
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 590
+    line: 9
+    character: 7
+  end_position:
+    bytes: 591
+    line: 9
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 591
+    line: 10
+    character: 1
+  end_position:
+    bytes: 593
+    line: 10
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\t\t"
+- start_position:
+    bytes: 593
+    line: 10
+    character: 3
+  end_position:
+    bytes: 596
+    line: 10
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 596
+    line: 10
+    character: 6
+  end_position:
+    bytes: 597
+    line: 10
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 597
+    line: 11
+    character: 1
+  end_position:
+    bytes: 598
+    line: 11
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 598
+    line: 11
+    character: 2
+  end_position:
+    bytes: 601
+    line: 11
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 601
+    line: 11
+    character: 5
+  end_position:
+    bytes: 602
+    line: 11
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 602
+    line: 12
+    character: 1
+  end_position:
+    bytes: 605
+    line: 12
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 605
+    line: 12
+    character: 4
+  end_position:
+    bytes: 606
+    line: 12
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 606
+    line: 13
+    character: 1
+  end_position:
+    bytes: 606
+    line: 13
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/ast.snap
new file mode 100644
index 00000000..5113175f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/ast.snap
@@ -0,0 +1,1983 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/roblox_cases/pass/named_function_arg_types
+---
+stmts:
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 19
+              line: 1
+              character: 20
+            token_type:
+              type: Identifier
+              identifier: MyCallbackType
+          trailing_trivia:
+            - start_position:
+                bytes: 19
+                line: 1
+                character: 20
+              end_position:
+                bytes: 20
+                line: 1
+                character: 21
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 20
+              line: 1
+              character: 21
+            end_position:
+              bytes: 21
+              line: 1
+              character: 22
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 21
+                line: 1
+                character: 22
+              end_position:
+                bytes: 22
+                line: 1
+                character: 23
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Callback:
+            parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 22
+                      line: 1
+                      character: 23
+                    end_position:
+                      bytes: 23
+                      line: 1
+                      character: 24
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 49
+                      line: 1
+                      character: 50
+                    end_position:
+                      bytes: 50
+                      line: 1
+                      character: 51
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 50
+                        line: 1
+                        character: 51
+                      end_position:
+                        bytes: 51
+                        line: 1
+                        character: 52
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            arguments:
+              pairs:
+                - Punctuated:
+                    - name:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 23
+                              line: 1
+                              character: 24
+                            end_position:
+                              bytes: 27
+                              line: 1
+                              character: 28
+                            token_type:
+                              type: Identifier
+                              identifier: cost
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 27
+                              line: 1
+                              character: 28
+                            end_position:
+                              bytes: 28
+                              line: 1
+                              character: 29
+                            token_type:
+                              type: Symbol
+                              symbol: ":"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 28
+                                line: 1
+                                character: 29
+                              end_position:
+                                bytes: 29
+                                line: 1
+                                character: 30
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                      type_info:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 29
+                              line: 1
+                              character: 30
+                            end_position:
+                              bytes: 35
+                              line: 1
+                              character: 36
+                            token_type:
+                              type: Identifier
+                              identifier: number
+                          trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 35
+                          line: 1
+                          character: 36
+                        end_position:
+                          bytes: 36
+                          line: 1
+                          character: 37
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 36
+                            line: 1
+                            character: 37
+                          end_position:
+                            bytes: 37
+                            line: 1
+                            character: 38
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                - End:
+                    name:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 37
+                            line: 1
+                            character: 38
+                          end_position:
+                            bytes: 41
+                            line: 1
+                            character: 42
+                          token_type:
+                            type: Identifier
+                            identifier: name
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 41
+                            line: 1
+                            character: 42
+                          end_position:
+                            bytes: 42
+                            line: 1
+                            character: 43
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 42
+                              line: 1
+                              character: 43
+                            end_position:
+                              bytes: 43
+                              line: 1
+                              character: 44
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                    type_info:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 43
+                            line: 1
+                            character: 44
+                          end_position:
+                            bytes: 49
+                            line: 1
+                            character: 50
+                          token_type:
+                            type: Identifier
+                            identifier: string
+                        trailing_trivia: []
+            arrow:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 51
+                  line: 1
+                  character: 52
+                end_position:
+                  bytes: 53
+                  line: 1
+                  character: 54
+                token_type:
+                  type: Symbol
+                  symbol: "->"
+              trailing_trivia:
+                - start_position:
+                    bytes: 53
+                    line: 1
+                    character: 54
+                  end_position:
+                    bytes: 54
+                    line: 1
+                    character: 55
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            return_type:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 54
+                    line: 1
+                    character: 55
+                  end_position:
+                    bytes: 60
+                    line: 1
+                    character: 61
+                  token_type:
+                    type: Identifier
+                    identifier: string
+                trailing_trivia:
+                  - start_position:
+                      bytes: 60
+                      line: 1
+                      character: 61
+                    end_position:
+                      bytes: 61
+                      line: 1
+                      character: 61
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 61
+                line: 2
+                character: 1
+              end_position:
+                bytes: 62
+                line: 2
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 62
+              line: 3
+              character: 1
+            end_position:
+              bytes: 67
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 67
+                line: 3
+                character: 6
+              end_position:
+                bytes: 68
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        type_specifiers:
+          - punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 70
+                  line: 3
+                  character: 9
+                end_position:
+                  bytes: 71
+                  line: 3
+                  character: 10
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 71
+                    line: 3
+                    character: 10
+                  end_position:
+                    bytes: 72
+                    line: 3
+                    character: 11
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Callback:
+                parentheses:
+                  tokens:
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 72
+                          line: 3
+                          character: 11
+                        end_position:
+                          bytes: 73
+                          line: 3
+                          character: 12
+                        token_type:
+                          type: Symbol
+                          symbol: (
+                      trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 87
+                          line: 3
+                          character: 26
+                        end_position:
+                          bytes: 88
+                          line: 3
+                          character: 27
+                        token_type:
+                          type: Symbol
+                          symbol: )
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 88
+                            line: 3
+                            character: 27
+                          end_position:
+                            bytes: 89
+                            line: 3
+                            character: 28
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                arguments:
+                  pairs:
+                    - End:
+                        name:
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 73
+                                line: 3
+                                character: 12
+                              end_position:
+                                bytes: 79
+                                line: 3
+                                character: 18
+                              token_type:
+                                type: Identifier
+                                identifier: amount
+                            trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 79
+                                line: 3
+                                character: 18
+                              end_position:
+                                bytes: 80
+                                line: 3
+                                character: 19
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 80
+                                  line: 3
+                                  character: 19
+                                end_position:
+                                  bytes: 81
+                                  line: 3
+                                  character: 20
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                        type_info:
+                          Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 81
+                                line: 3
+                                character: 20
+                              end_position:
+                                bytes: 87
+                                line: 3
+                                character: 26
+                              token_type:
+                                type: Identifier
+                                identifier: number
+                            trailing_trivia: []
+                arrow:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 89
+                      line: 3
+                      character: 28
+                    end_position:
+                      bytes: 91
+                      line: 3
+                      character: 30
+                    token_type:
+                      type: Symbol
+                      symbol: "->"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 91
+                        line: 3
+                        character: 30
+                      end_position:
+                        bytes: 92
+                        line: 3
+                        character: 31
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                return_type:
+                  Basic:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 92
+                        line: 3
+                        character: 31
+                      end_position:
+                        bytes: 98
+                        line: 3
+                        character: 37
+                      token_type:
+                        type: Identifier
+                        identifier: number
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 98
+                          line: 3
+                          character: 37
+                        end_position:
+                          bytes: 99
+                          line: 3
+                          character: 37
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 68
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 70
+                    line: 3
+                    character: 9
+                  token_type:
+                    type: Identifier
+                    identifier: cb
+                trailing_trivia: []
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+  - - LocalFunction:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 99
+              line: 4
+              character: 1
+            end_position:
+              bytes: 104
+              line: 4
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 104
+                line: 4
+                character: 6
+              end_position:
+                bytes: 105
+                line: 4
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 105
+              line: 4
+              character: 7
+            end_position:
+              bytes: 113
+              line: 4
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 113
+                line: 4
+                character: 15
+              end_position:
+                bytes: 114
+                line: 4
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 114
+              line: 4
+              character: 16
+            end_position:
+              bytes: 117
+              line: 4
+              character: 19
+            token_type:
+              type: Identifier
+              identifier: foo
+          trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 117
+                    line: 4
+                    character: 19
+                  end_position:
+                    bytes: 118
+                    line: 4
+                    character: 20
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 144
+                    line: 4
+                    character: 46
+                  end_position:
+                    bytes: 145
+                    line: 4
+                    character: 47
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 145
+                      line: 4
+                      character: 47
+                    end_position:
+                      bytes: 146
+                      line: 4
+                      character: 47
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          parameters:
+            pairs:
+              - End:
+                  name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 118
+                        line: 4
+                        character: 20
+                      end_position:
+                        bytes: 120
+                        line: 4
+                        character: 22
+                      token_type:
+                        type: Identifier
+                        identifier: cb
+                    trailing_trivia: []
+          type_specifiers:
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 120
+                    line: 4
+                    character: 22
+                  end_position:
+                    bytes: 121
+                    line: 4
+                    character: 23
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 121
+                      line: 4
+                      character: 23
+                    end_position:
+                      bytes: 122
+                      line: 4
+                      character: 24
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Callback:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 122
+                            line: 4
+                            character: 24
+                          end_position:
+                            bytes: 123
+                            line: 4
+                            character: 25
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 135
+                            line: 4
+                            character: 37
+                          end_position:
+                            bytes: 136
+                            line: 4
+                            character: 38
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 136
+                              line: 4
+                              character: 38
+                            end_position:
+                              bytes: 137
+                              line: 4
+                              character: 39
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  arguments:
+                    pairs:
+                      - End:
+                          name:
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 123
+                                  line: 4
+                                  character: 25
+                                end_position:
+                                  bytes: 127
+                                  line: 4
+                                  character: 29
+                                token_type:
+                                  type: Identifier
+                                  identifier: name
+                              trailing_trivia: []
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 127
+                                  line: 4
+                                  character: 29
+                                end_position:
+                                  bytes: 128
+                                  line: 4
+                                  character: 30
+                                token_type:
+                                  type: Symbol
+                                  symbol: ":"
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 128
+                                    line: 4
+                                    character: 30
+                                  end_position:
+                                    bytes: 129
+                                    line: 4
+                                    character: 31
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                          type_info:
+                            Basic:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 129
+                                  line: 4
+                                  character: 31
+                                end_position:
+                                  bytes: 135
+                                  line: 4
+                                  character: 37
+                                token_type:
+                                  type: Identifier
+                                  identifier: string
+                              trailing_trivia: []
+                  arrow:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 137
+                        line: 4
+                        character: 39
+                      end_position:
+                        bytes: 139
+                        line: 4
+                        character: 41
+                      token_type:
+                        type: Symbol
+                        symbol: "->"
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 139
+                          line: 4
+                          character: 41
+                        end_position:
+                          bytes: 140
+                          line: 4
+                          character: 42
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  return_type:
+                    Basic:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 140
+                          line: 4
+                          character: 42
+                        end_position:
+                          bytes: 144
+                          line: 4
+                          character: 46
+                        token_type:
+                          type: Identifier
+                          identifier: unit
+                      trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 146
+                line: 5
+                character: 1
+              end_position:
+                bytes: 149
+                line: 5
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 149
+                  line: 5
+                  character: 4
+                end_position:
+                  bytes: 150
+                  line: 5
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - LocalFunction:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 150
+                line: 6
+                character: 1
+              end_position:
+                bytes: 151
+                line: 6
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 151
+              line: 7
+              character: 1
+            end_position:
+              bytes: 156
+              line: 7
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 156
+                line: 7
+                character: 6
+              end_position:
+                bytes: 157
+                line: 7
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 157
+              line: 7
+              character: 7
+            end_position:
+              bytes: 165
+              line: 7
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 165
+                line: 7
+                character: 15
+              end_position:
+                bytes: 166
+                line: 7
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 166
+              line: 7
+              character: 16
+            end_position:
+              bytes: 169
+              line: 7
+              character: 19
+            token_type:
+              type: Identifier
+              identifier: bar
+          trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 169
+                    line: 7
+                    character: 19
+                  end_position:
+                    bytes: 170
+                    line: 7
+                    character: 20
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 180
+                    line: 7
+                    character: 30
+                  end_position:
+                    bytes: 181
+                    line: 7
+                    character: 31
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia: []
+          parameters:
+            pairs:
+              - End:
+                  name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 170
+                        line: 7
+                        character: 20
+                      end_position:
+                        bytes: 171
+                        line: 7
+                        character: 21
+                      token_type:
+                        type: Identifier
+                        identifier: x
+                    trailing_trivia: []
+          type_specifiers:
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 171
+                    line: 7
+                    character: 21
+                  end_position:
+                    bytes: 172
+                    line: 7
+                    character: 22
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 172
+                      line: 7
+                      character: 22
+                    end_position:
+                      bytes: 173
+                      line: 7
+                      character: 23
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Optional:
+                  base:
+                    Basic:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 173
+                          line: 7
+                          character: 23
+                        end_position:
+                          bytes: 179
+                          line: 7
+                          character: 29
+                        token_type:
+                          type: Identifier
+                          identifier: number
+                      trailing_trivia: []
+                  question_mark:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 179
+                        line: 7
+                        character: 29
+                      end_position:
+                        bytes: 180
+                        line: 7
+                        character: 30
+                      token_type:
+                        type: Symbol
+                        symbol: "?"
+                    trailing_trivia: []
+          return_type:
+            punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 181
+                  line: 7
+                  character: 31
+                end_position:
+                  bytes: 182
+                  line: 7
+                  character: 32
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 182
+                    line: 7
+                    character: 32
+                  end_position:
+                    bytes: 183
+                    line: 7
+                    character: 33
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Callback:
+                parentheses:
+                  tokens:
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 183
+                          line: 7
+                          character: 33
+                        end_position:
+                          bytes: 184
+                          line: 7
+                          character: 34
+                        token_type:
+                          type: Symbol
+                          symbol: (
+                      trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 195
+                          line: 7
+                          character: 45
+                        end_position:
+                          bytes: 196
+                          line: 7
+                          character: 46
+                        token_type:
+                          type: Symbol
+                          symbol: )
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 196
+                            line: 7
+                            character: 46
+                          end_position:
+                            bytes: 197
+                            line: 7
+                            character: 47
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                arguments:
+                  pairs:
+                    - End:
+                        name:
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 184
+                                line: 7
+                                character: 34
+                              end_position:
+                                bytes: 187
+                                line: 7
+                                character: 37
+                              token_type:
+                                type: Identifier
+                                identifier: baz
+                            trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 187
+                                line: 7
+                                character: 37
+                              end_position:
+                                bytes: 188
+                                line: 7
+                                character: 38
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 188
+                                  line: 7
+                                  character: 38
+                                end_position:
+                                  bytes: 189
+                                  line: 7
+                                  character: 39
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                        type_info:
+                          Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 189
+                                line: 7
+                                character: 39
+                              end_position:
+                                bytes: 195
+                                line: 7
+                                character: 45
+                              token_type:
+                                type: Identifier
+                                identifier: string
+                            trailing_trivia: []
+                arrow:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 197
+                      line: 7
+                      character: 47
+                    end_position:
+                      bytes: 199
+                      line: 7
+                      character: 49
+                    token_type:
+                      type: Symbol
+                      symbol: "->"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 199
+                        line: 7
+                        character: 49
+                      end_position:
+                        bytes: 200
+                        line: 7
+                        character: 50
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                return_type:
+                  Basic:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 200
+                        line: 7
+                        character: 50
+                      end_position:
+                        bytes: 206
+                        line: 7
+                        character: 56
+                      token_type:
+                        type: Identifier
+                        identifier: string
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 206
+                          line: 7
+                          character: 56
+                        end_position:
+                          bytes: 207
+                          line: 7
+                          character: 56
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 207
+                line: 8
+                character: 1
+              end_position:
+                bytes: 210
+                line: 8
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 210
+                  line: 8
+                  character: 4
+                end_position:
+                  bytes: 211
+                  line: 8
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - LocalFunction:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 211
+                line: 9
+                character: 1
+              end_position:
+                bytes: 212
+                line: 9
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 212
+              line: 10
+              character: 1
+            end_position:
+              bytes: 217
+              line: 10
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 217
+                line: 10
+                character: 6
+              end_position:
+                bytes: 218
+                line: 10
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 218
+              line: 10
+              character: 7
+            end_position:
+              bytes: 226
+              line: 10
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 226
+                line: 10
+                character: 15
+              end_position:
+                bytes: 227
+                line: 10
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 227
+              line: 10
+              character: 16
+            end_position:
+              bytes: 230
+              line: 10
+              character: 19
+            token_type:
+              type: Identifier
+              identifier: bar
+          trailing_trivia: []
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 230
+                    line: 10
+                    character: 19
+                  end_position:
+                    bytes: 231
+                    line: 10
+                    character: 20
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 241
+                    line: 10
+                    character: 30
+                  end_position:
+                    bytes: 242
+                    line: 10
+                    character: 31
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia: []
+          parameters:
+            pairs:
+              - End:
+                  name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 231
+                        line: 10
+                        character: 20
+                      end_position:
+                        bytes: 232
+                        line: 10
+                        character: 21
+                      token_type:
+                        type: Identifier
+                        identifier: x
+                    trailing_trivia: []
+          type_specifiers:
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 232
+                    line: 10
+                    character: 21
+                  end_position:
+                    bytes: 233
+                    line: 10
+                    character: 22
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 233
+                      line: 10
+                      character: 22
+                    end_position:
+                      bytes: 234
+                      line: 10
+                      character: 23
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Optional:
+                  base:
+                    Basic:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 234
+                          line: 10
+                          character: 23
+                        end_position:
+                          bytes: 240
+                          line: 10
+                          character: 29
+                        token_type:
+                          type: Identifier
+                          identifier: number
+                      trailing_trivia: []
+                  question_mark:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 240
+                        line: 10
+                        character: 29
+                      end_position:
+                        bytes: 241
+                        line: 10
+                        character: 30
+                      token_type:
+                        type: Symbol
+                        symbol: "?"
+                    trailing_trivia: []
+          return_type:
+            punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 242
+                  line: 10
+                  character: 31
+                end_position:
+                  bytes: 243
+                  line: 10
+                  character: 32
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 243
+                    line: 10
+                    character: 32
+                  end_position:
+                    bytes: 244
+                    line: 10
+                    character: 33
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Callback:
+                parentheses:
+                  tokens:
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 244
+                          line: 10
+                          character: 33
+                        end_position:
+                          bytes: 245
+                          line: 10
+                          character: 34
+                        token_type:
+                          type: Symbol
+                          symbol: (
+                      trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 256
+                          line: 10
+                          character: 45
+                        end_position:
+                          bytes: 257
+                          line: 10
+                          character: 46
+                        token_type:
+                          type: Symbol
+                          symbol: )
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 257
+                            line: 10
+                            character: 46
+                          end_position:
+                            bytes: 258
+                            line: 10
+                            character: 47
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                arguments:
+                  pairs:
+                    - End:
+                        name:
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 245
+                                line: 10
+                                character: 34
+                              end_position:
+                                bytes: 248
+                                line: 10
+                                character: 37
+                              token_type:
+                                type: Identifier
+                                identifier: baz
+                            trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 248
+                                line: 10
+                                character: 37
+                              end_position:
+                                bytes: 249
+                                line: 10
+                                character: 38
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 249
+                                  line: 10
+                                  character: 38
+                                end_position:
+                                  bytes: 250
+                                  line: 10
+                                  character: 39
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                        type_info:
+                          Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 250
+                                line: 10
+                                character: 39
+                              end_position:
+                                bytes: 256
+                                line: 10
+                                character: 45
+                              token_type:
+                                type: Identifier
+                                identifier: string
+                            trailing_trivia: []
+                arrow:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 258
+                      line: 10
+                      character: 47
+                    end_position:
+                      bytes: 260
+                      line: 10
+                      character: 49
+                    token_type:
+                      type: Symbol
+                      symbol: "->"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 260
+                        line: 10
+                        character: 49
+                      end_position:
+                        bytes: 261
+                        line: 10
+                        character: 50
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                return_type:
+                  Tuple:
+                    parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 261
+                              line: 10
+                              character: 50
+                            end_position:
+                              bytes: 262
+                              line: 10
+                              character: 51
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 298
+                              line: 10
+                              character: 87
+                            end_position:
+                              bytes: 299
+                              line: 10
+                              character: 88
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 299
+                                line: 10
+                                character: 88
+                              end_position:
+                                bytes: 300
+                                line: 10
+                                character: 88
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    types:
+                      pairs:
+                        - End:
+                            Callback:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 262
+                                        line: 10
+                                        character: 51
+                                      end_position:
+                                        bytes: 263
+                                        line: 10
+                                        character: 52
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 290
+                                        line: 10
+                                        character: 79
+                                      end_position:
+                                        bytes: 291
+                                        line: 10
+                                        character: 80
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 291
+                                          line: 10
+                                          character: 80
+                                        end_position:
+                                          bytes: 292
+                                          line: 10
+                                          character: 81
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                              arguments:
+                                pairs:
+                                  - End:
+                                      name:
+                                        - leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 263
+                                              line: 10
+                                              character: 52
+                                            end_position:
+                                              bytes: 268
+                                              line: 10
+                                              character: 57
+                                            token_type:
+                                              type: Identifier
+                                              identifier: names
+                                          trailing_trivia: []
+                                        - leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 268
+                                              line: 10
+                                              character: 57
+                                            end_position:
+                                              bytes: 269
+                                              line: 10
+                                              character: 58
+                                            token_type:
+                                              type: Symbol
+                                              symbol: ":"
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 269
+                                                line: 10
+                                                character: 58
+                                              end_position:
+                                                bytes: 270
+                                                line: 10
+                                                character: 59
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                      type_info:
+                                        Table:
+                                          braces:
+                                            tokens:
+                                              - leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 270
+                                                    line: 10
+                                                    character: 59
+                                                  end_position:
+                                                    bytes: 271
+                                                    line: 10
+                                                    character: 60
+                                                  token_type:
+                                                    type: Symbol
+                                                    symbol: "{"
+                                                trailing_trivia:
+                                                  - start_position:
+                                                      bytes: 271
+                                                      line: 10
+                                                      character: 60
+                                                    end_position:
+                                                      bytes: 272
+                                                      line: 10
+                                                      character: 61
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: " "
+                                              - leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 289
+                                                    line: 10
+                                                    character: 78
+                                                  end_position:
+                                                    bytes: 290
+                                                    line: 10
+                                                    character: 79
+                                                  token_type:
+                                                    type: Symbol
+                                                    symbol: "}"
+                                                trailing_trivia: []
+                                          fields:
+                                            pairs:
+                                              - End:
+                                                  key:
+                                                    IndexSignature:
+                                                      brackets:
+                                                        tokens:
+                                                          - leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 272
+                                                                line: 10
+                                                                character: 61
+                                                              end_position:
+                                                                bytes: 273
+                                                                line: 10
+                                                                character: 62
+                                                              token_type:
+                                                                type: Symbol
+                                                                symbol: "["
+                                                            trailing_trivia: []
+                                                          - leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 279
+                                                                line: 10
+                                                                character: 68
+                                                              end_position:
+                                                                bytes: 280
+                                                                line: 10
+                                                                character: 69
+                                                              token_type:
+                                                                type: Symbol
+                                                                symbol: "]"
+                                                            trailing_trivia: []
+                                                      inner:
+                                                        Basic:
+                                                          leading_trivia: []
+                                                          token:
+                                                            start_position:
+                                                              bytes: 273
+                                                              line: 10
+                                                              character: 62
+                                                            end_position:
+                                                              bytes: 279
+                                                              line: 10
+                                                              character: 68
+                                                            token_type:
+                                                              type: Identifier
+                                                              identifier: number
+                                                          trailing_trivia: []
+                                                  colon:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 280
+                                                        line: 10
+                                                        character: 69
+                                                      end_position:
+                                                        bytes: 281
+                                                        line: 10
+                                                        character: 70
+                                                      token_type:
+                                                        type: Symbol
+                                                        symbol: ":"
+                                                    trailing_trivia:
+                                                      - start_position:
+                                                          bytes: 281
+                                                          line: 10
+                                                          character: 70
+                                                        end_position:
+                                                          bytes: 282
+                                                          line: 10
+                                                          character: 71
+                                                        token_type:
+                                                          type: Whitespace
+                                                          characters: " "
+                                                  value:
+                                                    Basic:
+                                                      leading_trivia: []
+                                                      token:
+                                                        start_position:
+                                                          bytes: 282
+                                                          line: 10
+                                                          character: 71
+                                                        end_position:
+                                                          bytes: 288
+                                                          line: 10
+                                                          character: 77
+                                                        token_type:
+                                                          type: Identifier
+                                                          identifier: string
+                                                      trailing_trivia:
+                                                        - start_position:
+                                                            bytes: 288
+                                                            line: 10
+                                                            character: 77
+                                                          end_position:
+                                                            bytes: 289
+                                                            line: 10
+                                                            character: 78
+                                                          token_type:
+                                                            type: Whitespace
+                                                            characters: " "
+                              arrow:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 292
+                                    line: 10
+                                    character: 81
+                                  end_position:
+                                    bytes: 294
+                                    line: 10
+                                    character: 83
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "->"
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 294
+                                      line: 10
+                                      character: 83
+                                    end_position:
+                                      bytes: 295
+                                      line: 10
+                                      character: 84
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              return_type:
+                                Basic:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 295
+                                      line: 10
+                                      character: 84
+                                    end_position:
+                                      bytes: 298
+                                      line: 10
+                                      character: 87
+                                    token_type:
+                                      type: Identifier
+                                      identifier: any
+                                  trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 300
+                line: 11
+                character: 1
+              end_position:
+                bytes: 303
+                line: 11
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 303
+                  line: 11
+                  character: 4
+                end_position:
+                  bytes: 304
+                  line: 11
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/source.lua
new file mode 100644
index 00000000..8b18eb9f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/source.lua
@@ -0,0 +1,11 @@
+type MyCallbackType = (cost: number, name: string) -> string
+
+local cb: (amount: number) -> number
+local function foo(cb: (name: string) -> unit)
+end
+
+local function bar(x: number?): (baz: string) -> string
+end
+
+local function bar(x: number?): (baz: string) -> ((names: { [number]: string }) -> any)
+end
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/tokens.snap
new file mode 100644
index 00000000..be7270ec
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/named_function_arg_types/tokens.snap
@@ -0,0 +1,1544 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/roblox_cases/pass/named_function_arg_types
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: MyCallbackType
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 27
+    line: 1
+    character: 28
+  token_type:
+    type: Identifier
+    identifier: cost
+- start_position:
+    bytes: 27
+    line: 1
+    character: 28
+  end_position:
+    bytes: 28
+    line: 1
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 28
+    line: 1
+    character: 29
+  end_position:
+    bytes: 29
+    line: 1
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 29
+    line: 1
+    character: 30
+  end_position:
+    bytes: 35
+    line: 1
+    character: 36
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 35
+    line: 1
+    character: 36
+  end_position:
+    bytes: 36
+    line: 1
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 36
+    line: 1
+    character: 37
+  end_position:
+    bytes: 37
+    line: 1
+    character: 38
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 37
+    line: 1
+    character: 38
+  end_position:
+    bytes: 41
+    line: 1
+    character: 42
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 41
+    line: 1
+    character: 42
+  end_position:
+    bytes: 42
+    line: 1
+    character: 43
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 42
+    line: 1
+    character: 43
+  end_position:
+    bytes: 43
+    line: 1
+    character: 44
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 43
+    line: 1
+    character: 44
+  end_position:
+    bytes: 49
+    line: 1
+    character: 50
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 49
+    line: 1
+    character: 50
+  end_position:
+    bytes: 50
+    line: 1
+    character: 51
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 50
+    line: 1
+    character: 51
+  end_position:
+    bytes: 51
+    line: 1
+    character: 52
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 51
+    line: 1
+    character: 52
+  end_position:
+    bytes: 53
+    line: 1
+    character: 54
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 53
+    line: 1
+    character: 54
+  end_position:
+    bytes: 54
+    line: 1
+    character: 55
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 54
+    line: 1
+    character: 55
+  end_position:
+    bytes: 60
+    line: 1
+    character: 61
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 60
+    line: 1
+    character: 61
+  end_position:
+    bytes: 61
+    line: 1
+    character: 61
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 61
+    line: 2
+    character: 1
+  end_position:
+    bytes: 62
+    line: 2
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 62
+    line: 3
+    character: 1
+  end_position:
+    bytes: 67
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 67
+    line: 3
+    character: 6
+  end_position:
+    bytes: 68
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 68
+    line: 3
+    character: 7
+  end_position:
+    bytes: 70
+    line: 3
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: cb
+- start_position:
+    bytes: 70
+    line: 3
+    character: 9
+  end_position:
+    bytes: 71
+    line: 3
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 71
+    line: 3
+    character: 10
+  end_position:
+    bytes: 72
+    line: 3
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 72
+    line: 3
+    character: 11
+  end_position:
+    bytes: 73
+    line: 3
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 73
+    line: 3
+    character: 12
+  end_position:
+    bytes: 79
+    line: 3
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: amount
+- start_position:
+    bytes: 79
+    line: 3
+    character: 18
+  end_position:
+    bytes: 80
+    line: 3
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 80
+    line: 3
+    character: 19
+  end_position:
+    bytes: 81
+    line: 3
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 81
+    line: 3
+    character: 20
+  end_position:
+    bytes: 87
+    line: 3
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 87
+    line: 3
+    character: 26
+  end_position:
+    bytes: 88
+    line: 3
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 88
+    line: 3
+    character: 27
+  end_position:
+    bytes: 89
+    line: 3
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 89
+    line: 3
+    character: 28
+  end_position:
+    bytes: 91
+    line: 3
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 91
+    line: 3
+    character: 30
+  end_position:
+    bytes: 92
+    line: 3
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 92
+    line: 3
+    character: 31
+  end_position:
+    bytes: 98
+    line: 3
+    character: 37
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 98
+    line: 3
+    character: 37
+  end_position:
+    bytes: 99
+    line: 3
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 99
+    line: 4
+    character: 1
+  end_position:
+    bytes: 104
+    line: 4
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 104
+    line: 4
+    character: 6
+  end_position:
+    bytes: 105
+    line: 4
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 105
+    line: 4
+    character: 7
+  end_position:
+    bytes: 113
+    line: 4
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 113
+    line: 4
+    character: 15
+  end_position:
+    bytes: 114
+    line: 4
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 114
+    line: 4
+    character: 16
+  end_position:
+    bytes: 117
+    line: 4
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: foo
+- start_position:
+    bytes: 117
+    line: 4
+    character: 19
+  end_position:
+    bytes: 118
+    line: 4
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 118
+    line: 4
+    character: 20
+  end_position:
+    bytes: 120
+    line: 4
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: cb
+- start_position:
+    bytes: 120
+    line: 4
+    character: 22
+  end_position:
+    bytes: 121
+    line: 4
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 121
+    line: 4
+    character: 23
+  end_position:
+    bytes: 122
+    line: 4
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 122
+    line: 4
+    character: 24
+  end_position:
+    bytes: 123
+    line: 4
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 123
+    line: 4
+    character: 25
+  end_position:
+    bytes: 127
+    line: 4
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: name
+- start_position:
+    bytes: 127
+    line: 4
+    character: 29
+  end_position:
+    bytes: 128
+    line: 4
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 128
+    line: 4
+    character: 30
+  end_position:
+    bytes: 129
+    line: 4
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 129
+    line: 4
+    character: 31
+  end_position:
+    bytes: 135
+    line: 4
+    character: 37
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 135
+    line: 4
+    character: 37
+  end_position:
+    bytes: 136
+    line: 4
+    character: 38
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 136
+    line: 4
+    character: 38
+  end_position:
+    bytes: 137
+    line: 4
+    character: 39
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 137
+    line: 4
+    character: 39
+  end_position:
+    bytes: 139
+    line: 4
+    character: 41
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 139
+    line: 4
+    character: 41
+  end_position:
+    bytes: 140
+    line: 4
+    character: 42
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 140
+    line: 4
+    character: 42
+  end_position:
+    bytes: 144
+    line: 4
+    character: 46
+  token_type:
+    type: Identifier
+    identifier: unit
+- start_position:
+    bytes: 144
+    line: 4
+    character: 46
+  end_position:
+    bytes: 145
+    line: 4
+    character: 47
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 145
+    line: 4
+    character: 47
+  end_position:
+    bytes: 146
+    line: 4
+    character: 47
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 146
+    line: 5
+    character: 1
+  end_position:
+    bytes: 149
+    line: 5
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 149
+    line: 5
+    character: 4
+  end_position:
+    bytes: 150
+    line: 5
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 150
+    line: 6
+    character: 1
+  end_position:
+    bytes: 151
+    line: 6
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 151
+    line: 7
+    character: 1
+  end_position:
+    bytes: 156
+    line: 7
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 156
+    line: 7
+    character: 6
+  end_position:
+    bytes: 157
+    line: 7
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 157
+    line: 7
+    character: 7
+  end_position:
+    bytes: 165
+    line: 7
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 165
+    line: 7
+    character: 15
+  end_position:
+    bytes: 166
+    line: 7
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 166
+    line: 7
+    character: 16
+  end_position:
+    bytes: 169
+    line: 7
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 169
+    line: 7
+    character: 19
+  end_position:
+    bytes: 170
+    line: 7
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 170
+    line: 7
+    character: 20
+  end_position:
+    bytes: 171
+    line: 7
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 171
+    line: 7
+    character: 21
+  end_position:
+    bytes: 172
+    line: 7
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 172
+    line: 7
+    character: 22
+  end_position:
+    bytes: 173
+    line: 7
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 173
+    line: 7
+    character: 23
+  end_position:
+    bytes: 179
+    line: 7
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 179
+    line: 7
+    character: 29
+  end_position:
+    bytes: 180
+    line: 7
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 180
+    line: 7
+    character: 30
+  end_position:
+    bytes: 181
+    line: 7
+    character: 31
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 181
+    line: 7
+    character: 31
+  end_position:
+    bytes: 182
+    line: 7
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 182
+    line: 7
+    character: 32
+  end_position:
+    bytes: 183
+    line: 7
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 183
+    line: 7
+    character: 33
+  end_position:
+    bytes: 184
+    line: 7
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 184
+    line: 7
+    character: 34
+  end_position:
+    bytes: 187
+    line: 7
+    character: 37
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 187
+    line: 7
+    character: 37
+  end_position:
+    bytes: 188
+    line: 7
+    character: 38
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 188
+    line: 7
+    character: 38
+  end_position:
+    bytes: 189
+    line: 7
+    character: 39
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 189
+    line: 7
+    character: 39
+  end_position:
+    bytes: 195
+    line: 7
+    character: 45
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 195
+    line: 7
+    character: 45
+  end_position:
+    bytes: 196
+    line: 7
+    character: 46
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 196
+    line: 7
+    character: 46
+  end_position:
+    bytes: 197
+    line: 7
+    character: 47
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 197
+    line: 7
+    character: 47
+  end_position:
+    bytes: 199
+    line: 7
+    character: 49
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 199
+    line: 7
+    character: 49
+  end_position:
+    bytes: 200
+    line: 7
+    character: 50
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 200
+    line: 7
+    character: 50
+  end_position:
+    bytes: 206
+    line: 7
+    character: 56
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 206
+    line: 7
+    character: 56
+  end_position:
+    bytes: 207
+    line: 7
+    character: 56
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 207
+    line: 8
+    character: 1
+  end_position:
+    bytes: 210
+    line: 8
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 210
+    line: 8
+    character: 4
+  end_position:
+    bytes: 211
+    line: 8
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 211
+    line: 9
+    character: 1
+  end_position:
+    bytes: 212
+    line: 9
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 212
+    line: 10
+    character: 1
+  end_position:
+    bytes: 217
+    line: 10
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 217
+    line: 10
+    character: 6
+  end_position:
+    bytes: 218
+    line: 10
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 218
+    line: 10
+    character: 7
+  end_position:
+    bytes: 226
+    line: 10
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 226
+    line: 10
+    character: 15
+  end_position:
+    bytes: 227
+    line: 10
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 227
+    line: 10
+    character: 16
+  end_position:
+    bytes: 230
+    line: 10
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 230
+    line: 10
+    character: 19
+  end_position:
+    bytes: 231
+    line: 10
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 231
+    line: 10
+    character: 20
+  end_position:
+    bytes: 232
+    line: 10
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 232
+    line: 10
+    character: 21
+  end_position:
+    bytes: 233
+    line: 10
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 233
+    line: 10
+    character: 22
+  end_position:
+    bytes: 234
+    line: 10
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 234
+    line: 10
+    character: 23
+  end_position:
+    bytes: 240
+    line: 10
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 240
+    line: 10
+    character: 29
+  end_position:
+    bytes: 241
+    line: 10
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 241
+    line: 10
+    character: 30
+  end_position:
+    bytes: 242
+    line: 10
+    character: 31
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 242
+    line: 10
+    character: 31
+  end_position:
+    bytes: 243
+    line: 10
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 243
+    line: 10
+    character: 32
+  end_position:
+    bytes: 244
+    line: 10
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 244
+    line: 10
+    character: 33
+  end_position:
+    bytes: 245
+    line: 10
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 245
+    line: 10
+    character: 34
+  end_position:
+    bytes: 248
+    line: 10
+    character: 37
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 248
+    line: 10
+    character: 37
+  end_position:
+    bytes: 249
+    line: 10
+    character: 38
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 249
+    line: 10
+    character: 38
+  end_position:
+    bytes: 250
+    line: 10
+    character: 39
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 250
+    line: 10
+    character: 39
+  end_position:
+    bytes: 256
+    line: 10
+    character: 45
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 256
+    line: 10
+    character: 45
+  end_position:
+    bytes: 257
+    line: 10
+    character: 46
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 257
+    line: 10
+    character: 46
+  end_position:
+    bytes: 258
+    line: 10
+    character: 47
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 258
+    line: 10
+    character: 47
+  end_position:
+    bytes: 260
+    line: 10
+    character: 49
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 260
+    line: 10
+    character: 49
+  end_position:
+    bytes: 261
+    line: 10
+    character: 50
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 261
+    line: 10
+    character: 50
+  end_position:
+    bytes: 262
+    line: 10
+    character: 51
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 262
+    line: 10
+    character: 51
+  end_position:
+    bytes: 263
+    line: 10
+    character: 52
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 263
+    line: 10
+    character: 52
+  end_position:
+    bytes: 268
+    line: 10
+    character: 57
+  token_type:
+    type: Identifier
+    identifier: names
+- start_position:
+    bytes: 268
+    line: 10
+    character: 57
+  end_position:
+    bytes: 269
+    line: 10
+    character: 58
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 269
+    line: 10
+    character: 58
+  end_position:
+    bytes: 270
+    line: 10
+    character: 59
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 270
+    line: 10
+    character: 59
+  end_position:
+    bytes: 271
+    line: 10
+    character: 60
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 271
+    line: 10
+    character: 60
+  end_position:
+    bytes: 272
+    line: 10
+    character: 61
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 272
+    line: 10
+    character: 61
+  end_position:
+    bytes: 273
+    line: 10
+    character: 62
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 273
+    line: 10
+    character: 62
+  end_position:
+    bytes: 279
+    line: 10
+    character: 68
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 279
+    line: 10
+    character: 68
+  end_position:
+    bytes: 280
+    line: 10
+    character: 69
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 280
+    line: 10
+    character: 69
+  end_position:
+    bytes: 281
+    line: 10
+    character: 70
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 281
+    line: 10
+    character: 70
+  end_position:
+    bytes: 282
+    line: 10
+    character: 71
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 282
+    line: 10
+    character: 71
+  end_position:
+    bytes: 288
+    line: 10
+    character: 77
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 288
+    line: 10
+    character: 77
+  end_position:
+    bytes: 289
+    line: 10
+    character: 78
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 289
+    line: 10
+    character: 78
+  end_position:
+    bytes: 290
+    line: 10
+    character: 79
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 290
+    line: 10
+    character: 79
+  end_position:
+    bytes: 291
+    line: 10
+    character: 80
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 291
+    line: 10
+    character: 80
+  end_position:
+    bytes: 292
+    line: 10
+    character: 81
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 292
+    line: 10
+    character: 81
+  end_position:
+    bytes: 294
+    line: 10
+    character: 83
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 294
+    line: 10
+    character: 83
+  end_position:
+    bytes: 295
+    line: 10
+    character: 84
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 295
+    line: 10
+    character: 84
+  end_position:
+    bytes: 298
+    line: 10
+    character: 87
+  token_type:
+    type: Identifier
+    identifier: any
+- start_position:
+    bytes: 298
+    line: 10
+    character: 87
+  end_position:
+    bytes: 299
+    line: 10
+    character: 88
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 299
+    line: 10
+    character: 88
+  end_position:
+    bytes: 300
+    line: 10
+    character: 88
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 300
+    line: 11
+    character: 1
+  end_position:
+    bytes: 303
+    line: 11
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 303
+    line: 11
+    character: 4
+  end_position:
+    bytes: 304
+    line: 11
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 304
+    line: 12
+    character: 1
+  end_position:
+    bytes: 304
+    line: 12
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/ast.snap
new file mode 100644
index 00000000..d8d3dfb5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/ast.snap
@@ -0,0 +1,5623 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/roblox_cases/pass/no_roblox_syntax
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 97
+                line: 1
+                character: 98
+              token_type:
+                type: SingleLineComment
+                comment: " Taken from https://raw.githubusercontent.com/Kampfkarren/Roblox/master/Modules/LineOfSight.lua"
+            - start_position:
+                bytes: 97
+                line: 1
+                character: 98
+              end_position:
+                bytes: 98
+                line: 1
+                character: 98
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 98
+              line: 2
+              character: 1
+            end_position:
+              bytes: 103
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 103
+                line: 2
+                character: 6
+              end_position:
+                bytes: 104
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 104
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 121
+                    line: 2
+                    character: 24
+                  token_type:
+                    type: Identifier
+                    identifier: ReplicatedStorage
+                trailing_trivia:
+                  - start_position:
+                      bytes: 121
+                      line: 2
+                      character: 24
+                    end_position:
+                      bytes: 122
+                      line: 2
+                      character: 25
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 122
+              line: 2
+              character: 25
+            end_position:
+              bytes: 123
+              line: 2
+              character: 26
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 123
+                line: 2
+                character: 26
+              end_position:
+                bytes: 124
+                line: 2
+                character: 27
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 124
+                          line: 2
+                          character: 27
+                        end_position:
+                          bytes: 128
+                          line: 2
+                          character: 31
+                        token_type:
+                          type: Identifier
+                          identifier: game
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        MethodCall:
+                          colon_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 128
+                                line: 2
+                                character: 31
+                              end_position:
+                                bytes: 129
+                                line: 2
+                                character: 32
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 129
+                                line: 2
+                                character: 32
+                              end_position:
+                                bytes: 139
+                                line: 2
+                                character: 42
+                              token_type:
+                                type: Identifier
+                                identifier: GetService
+                            trailing_trivia: []
+                          args:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 139
+                                        line: 2
+                                        character: 42
+                                      end_position:
+                                        bytes: 140
+                                        line: 2
+                                        character: 43
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 159
+                                        line: 2
+                                        character: 62
+                                      end_position:
+                                        bytes: 160
+                                        line: 2
+                                        character: 63
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 160
+                                          line: 2
+                                          character: 63
+                                        end_position:
+                                          bytes: 161
+                                          line: 2
+                                          character: 63
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs:
+                                  - End:
+                                      String:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 140
+                                            line: 2
+                                            character: 43
+                                          end_position:
+                                            bytes: 159
+                                            line: 2
+                                            character: 62
+                                          token_type:
+                                            type: StringLiteral
+                                            literal: ReplicatedStorage
+                                            quote_type: Double
+                                        trailing_trivia: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 161
+              line: 3
+              character: 1
+            end_position:
+              bytes: 166
+              line: 3
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 166
+                line: 3
+                character: 6
+              end_position:
+                bytes: 167
+                line: 3
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 167
+                    line: 3
+                    character: 7
+                  end_position:
+                    bytes: 177
+                    line: 3
+                    character: 17
+                  token_type:
+                    type: Identifier
+                    identifier: RunService
+                trailing_trivia:
+                  - start_position:
+                      bytes: 177
+                      line: 3
+                      character: 17
+                    end_position:
+                      bytes: 178
+                      line: 3
+                      character: 18
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 178
+              line: 3
+              character: 18
+            end_position:
+              bytes: 179
+              line: 3
+              character: 19
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 179
+                line: 3
+                character: 19
+              end_position:
+                bytes: 180
+                line: 3
+                character: 20
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 180
+                          line: 3
+                          character: 20
+                        end_position:
+                          bytes: 184
+                          line: 3
+                          character: 24
+                        token_type:
+                          type: Identifier
+                          identifier: game
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        MethodCall:
+                          colon_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 184
+                                line: 3
+                                character: 24
+                              end_position:
+                                bytes: 185
+                                line: 3
+                                character: 25
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia: []
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 185
+                                line: 3
+                                character: 25
+                              end_position:
+                                bytes: 195
+                                line: 3
+                                character: 35
+                              token_type:
+                                type: Identifier
+                                identifier: GetService
+                            trailing_trivia: []
+                          args:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 195
+                                        line: 3
+                                        character: 35
+                                      end_position:
+                                        bytes: 196
+                                        line: 3
+                                        character: 36
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 208
+                                        line: 3
+                                        character: 48
+                                      end_position:
+                                        bytes: 209
+                                        line: 3
+                                        character: 49
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 209
+                                          line: 3
+                                          character: 49
+                                        end_position:
+                                          bytes: 210
+                                          line: 3
+                                          character: 49
+                                        token_type:
+                                          type: Whitespace
+                                          characters: "\n"
+                              arguments:
+                                pairs:
+                                  - End:
+                                      String:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 196
+                                            line: 3
+                                            character: 36
+                                          end_position:
+                                            bytes: 208
+                                            line: 3
+                                            character: 48
+                                          token_type:
+                                            type: StringLiteral
+                                            literal: RunService
+                                            quote_type: Double
+                                        trailing_trivia: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 210
+                line: 4
+                character: 1
+              end_position:
+                bytes: 211
+                line: 4
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 211
+              line: 5
+              character: 1
+            end_position:
+              bytes: 216
+              line: 5
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 216
+                line: 5
+                character: 6
+              end_position:
+                bytes: 217
+                line: 5
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 217
+                    line: 5
+                    character: 7
+                  end_position:
+                    bytes: 224
+                    line: 5
+                    character: 14
+                  token_type:
+                    type: Identifier
+                    identifier: Raycast
+                trailing_trivia:
+                  - start_position:
+                      bytes: 224
+                      line: 5
+                      character: 14
+                    end_position:
+                      bytes: 225
+                      line: 5
+                      character: 15
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 225
+              line: 5
+              character: 15
+            end_position:
+              bytes: 226
+              line: 5
+              character: 16
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 226
+                line: 5
+                character: 16
+              end_position:
+                bytes: 227
+                line: 5
+                character: 17
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 227
+                          line: 5
+                          character: 17
+                        end_position:
+                          bytes: 234
+                          line: 5
+                          character: 24
+                        token_type:
+                          type: Identifier
+                          identifier: require
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 234
+                                      line: 5
+                                      character: 24
+                                    end_position:
+                                      bytes: 235
+                                      line: 5
+                                      character: 25
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 268
+                                      line: 5
+                                      character: 58
+                                    end_position:
+                                      bytes: 269
+                                      line: 5
+                                      character: 59
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 269
+                                        line: 5
+                                        character: 59
+                                      end_position:
+                                        bytes: 270
+                                        line: 5
+                                        character: 59
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\n"
+                            arguments:
+                              pairs:
+                                - End:
+                                    Var:
+                                      Expression:
+                                        prefix:
+                                          Name:
+                                            leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 235
+                                                line: 5
+                                                character: 25
+                                              end_position:
+                                                bytes: 252
+                                                line: 5
+                                                character: 42
+                                              token_type:
+                                                type: Identifier
+                                                identifier: ReplicatedStorage
+                                            trailing_trivia: []
+                                        suffixes:
+                                          - Index:
+                                              Dot:
+                                                dot:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 252
+                                                      line: 5
+                                                      character: 42
+                                                    end_position:
+                                                      bytes: 253
+                                                      line: 5
+                                                      character: 43
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: "."
+                                                  trailing_trivia: []
+                                                name:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 253
+                                                      line: 5
+                                                      character: 43
+                                                    end_position:
+                                                      bytes: 260
+                                                      line: 5
+                                                      character: 50
+                                                    token_type:
+                                                      type: Identifier
+                                                      identifier: Modules
+                                                  trailing_trivia: []
+                                          - Index:
+                                              Dot:
+                                                dot:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 260
+                                                      line: 5
+                                                      character: 50
+                                                    end_position:
+                                                      bytes: 261
+                                                      line: 5
+                                                      character: 51
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: "."
+                                                  trailing_trivia: []
+                                                name:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 261
+                                                      line: 5
+                                                      character: 51
+                                                    end_position:
+                                                      bytes: 268
+                                                      line: 5
+                                                      character: 58
+                                                    token_type:
+                                                      type: Identifier
+                                                      identifier: Raycast
+                                                  trailing_trivia: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 270
+                line: 6
+                character: 1
+              end_position:
+                bytes: 271
+                line: 6
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 271
+              line: 7
+              character: 1
+            end_position:
+              bytes: 276
+              line: 7
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 276
+                line: 7
+                character: 6
+              end_position:
+                bytes: 277
+                line: 7
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 277
+                    line: 7
+                    character: 7
+                  end_position:
+                    bytes: 282
+                    line: 7
+                    character: 12
+                  token_type:
+                    type: Identifier
+                    identifier: DEBUG
+                trailing_trivia:
+                  - start_position:
+                      bytes: 282
+                      line: 7
+                      character: 12
+                    end_position:
+                      bytes: 283
+                      line: 7
+                      character: 13
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 283
+              line: 7
+              character: 13
+            end_position:
+              bytes: 284
+              line: 7
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 284
+                line: 7
+                character: 14
+              end_position:
+                bytes: 285
+                line: 7
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Symbol:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 285
+                      line: 7
+                      character: 15
+                    end_position:
+                      bytes: 289
+                      line: 7
+                      character: 19
+                    token_type:
+                      type: Symbol
+                      symbol: "true"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 289
+                        line: 7
+                        character: 19
+                      end_position:
+                        bytes: 290
+                        line: 7
+                        character: 19
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - Assignment:
+        var_list:
+          pairs:
+            - End:
+                Name:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 290
+                      line: 8
+                      character: 1
+                    end_position:
+                      bytes: 295
+                      line: 8
+                      character: 6
+                    token_type:
+                      type: Identifier
+                      identifier: DEBUG
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 295
+                        line: 8
+                        character: 6
+                      end_position:
+                        bytes: 296
+                        line: 8
+                        character: 7
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 296
+              line: 8
+              character: 7
+            end_position:
+              bytes: 297
+              line: 8
+              character: 8
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 297
+                line: 8
+                character: 8
+              end_position:
+                bytes: 298
+                line: 8
+                character: 9
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                BinaryOperator:
+                  lhs:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 298
+                            line: 8
+                            character: 9
+                          end_position:
+                            bytes: 303
+                            line: 8
+                            character: 14
+                          token_type:
+                            type: Identifier
+                            identifier: DEBUG
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 303
+                              line: 8
+                              character: 14
+                            end_position:
+                              bytes: 304
+                              line: 8
+                              character: 15
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  binop:
+                    And:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 304
+                          line: 8
+                          character: 15
+                        end_position:
+                          bytes: 307
+                          line: 8
+                          character: 18
+                        token_type:
+                          type: Symbol
+                          symbol: and
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 307
+                            line: 8
+                            character: 18
+                          end_position:
+                            bytes: 308
+                            line: 8
+                            character: 19
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                  rhs:
+                    FunctionCall:
+                      prefix:
+                        Name:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 308
+                              line: 8
+                              character: 19
+                            end_position:
+                              bytes: 318
+                              line: 8
+                              character: 29
+                            token_type:
+                              type: Identifier
+                              identifier: RunService
+                          trailing_trivia: []
+                      suffixes:
+                        - Call:
+                            MethodCall:
+                              colon_token:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 318
+                                    line: 8
+                                    character: 29
+                                  end_position:
+                                    bytes: 319
+                                    line: 8
+                                    character: 30
+                                  token_type:
+                                    type: Symbol
+                                    symbol: ":"
+                                trailing_trivia: []
+                              name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 319
+                                    line: 8
+                                    character: 30
+                                  end_position:
+                                    bytes: 327
+                                    line: 8
+                                    character: 38
+                                  token_type:
+                                    type: Identifier
+                                    identifier: IsStudio
+                                trailing_trivia: []
+                              args:
+                                Parentheses:
+                                  parentheses:
+                                    tokens:
+                                      - leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 327
+                                            line: 8
+                                            character: 38
+                                          end_position:
+                                            bytes: 328
+                                            line: 8
+                                            character: 39
+                                          token_type:
+                                            type: Symbol
+                                            symbol: (
+                                        trailing_trivia: []
+                                      - leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 328
+                                            line: 8
+                                            character: 39
+                                          end_position:
+                                            bytes: 329
+                                            line: 8
+                                            character: 40
+                                          token_type:
+                                            type: Symbol
+                                            symbol: )
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 329
+                                              line: 8
+                                              character: 40
+                                            end_position:
+                                              bytes: 330
+                                              line: 8
+                                              character: 40
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\n"
+                                  arguments:
+                                    pairs: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 330
+                line: 9
+                character: 1
+              end_position:
+                bytes: 331
+                line: 9
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 331
+              line: 10
+              character: 1
+            end_position:
+              bytes: 336
+              line: 10
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 336
+                line: 10
+                character: 6
+              end_position:
+                bytes: 337
+                line: 10
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 337
+                    line: 10
+                    character: 7
+                  end_position:
+                    bytes: 342
+                    line: 10
+                    character: 12
+                  token_type:
+                    type: Identifier
+                    identifier: debug
+                trailing_trivia:
+                  - start_position:
+                      bytes: 342
+                      line: 10
+                      character: 12
+                    end_position:
+                      bytes: 343
+                      line: 10
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+  - - If:
+        if_token:
+          leading_trivia:
+            - start_position:
+                bytes: 343
+                line: 11
+                character: 1
+              end_position:
+                bytes: 344
+                line: 11
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 344
+              line: 12
+              character: 1
+            end_position:
+              bytes: 346
+              line: 12
+              character: 3
+            token_type:
+              type: Symbol
+              symbol: if
+          trailing_trivia:
+            - start_position:
+                bytes: 346
+                line: 12
+                character: 3
+              end_position:
+                bytes: 347
+                line: 12
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: " "
+        condition:
+          Var:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 347
+                  line: 12
+                  character: 4
+                end_position:
+                  bytes: 352
+                  line: 12
+                  character: 9
+                token_type:
+                  type: Identifier
+                  identifier: DEBUG
+              trailing_trivia:
+                - start_position:
+                    bytes: 352
+                    line: 12
+                    character: 9
+                  end_position:
+                    bytes: 353
+                    line: 12
+                    character: 10
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+        then_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 353
+              line: 12
+              character: 10
+            end_position:
+              bytes: 357
+              line: 12
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: then
+          trailing_trivia:
+            - start_position:
+                bytes: 357
+                line: 12
+                character: 14
+              end_position:
+                bytes: 358
+                line: 12
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts:
+            - - FunctionDeclaration:
+                  function_token:
+                    leading_trivia:
+                      - start_position:
+                          bytes: 358
+                          line: 13
+                          character: 1
+                        end_position:
+                          bytes: 359
+                          line: 13
+                          character: 2
+                        token_type:
+                          type: Whitespace
+                          characters: "\t"
+                    token:
+                      start_position:
+                        bytes: 359
+                        line: 13
+                        character: 2
+                      end_position:
+                        bytes: 367
+                        line: 13
+                        character: 10
+                      token_type:
+                        type: Symbol
+                        symbol: function
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 367
+                          line: 13
+                          character: 10
+                        end_position:
+                          bytes: 368
+                          line: 13
+                          character: 11
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  name:
+                    names:
+                      pairs:
+                        - End:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 368
+                                line: 13
+                                character: 11
+                              end_position:
+                                bytes: 373
+                                line: 13
+                                character: 16
+                              token_type:
+                                type: Identifier
+                                identifier: debug
+                            trailing_trivia: []
+                    colon_name: ~
+                  body:
+                    parameters_parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 373
+                              line: 13
+                              character: 16
+                            end_position:
+                              bytes: 374
+                              line: 13
+                              character: 17
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 379
+                              line: 13
+                              character: 22
+                            end_position:
+                              bytes: 380
+                              line: 13
+                              character: 23
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 380
+                                line: 13
+                                character: 23
+                              end_position:
+                                bytes: 381
+                                line: 13
+                                character: 23
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    parameters:
+                      pairs:
+                        - End:
+                            name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 374
+                                  line: 13
+                                  character: 17
+                                end_position:
+                                  bytes: 379
+                                  line: 13
+                                  character: 22
+                                token_type:
+                                  type: Identifier
+                                  identifier: table
+                              trailing_trivia: []
+                    type_specifiers:
+                      - ~
+                    block:
+                      stmts:
+                        - - FunctionCall:
+                              prefix:
+                                Name:
+                                  leading_trivia:
+                                    - start_position:
+                                        bytes: 381
+                                        line: 14
+                                        character: 1
+                                      end_position:
+                                        bytes: 383
+                                        line: 14
+                                        character: 3
+                                      token_type:
+                                        type: Whitespace
+                                        characters: "\t\t"
+                                  token:
+                                    start_position:
+                                      bytes: 383
+                                      line: 14
+                                      character: 3
+                                    end_position:
+                                      bytes: 388
+                                      line: 14
+                                      character: 8
+                                    token_type:
+                                      type: Identifier
+                                      identifier: print
+                                  trailing_trivia: []
+                              suffixes:
+                                - Call:
+                                    AnonymousCall:
+                                      Parentheses:
+                                        parentheses:
+                                          tokens:
+                                            - leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 388
+                                                  line: 14
+                                                  character: 8
+                                                end_position:
+                                                  bytes: 389
+                                                  line: 14
+                                                  character: 9
+                                                token_type:
+                                                  type: Symbol
+                                                  symbol: (
+                                              trailing_trivia: []
+                                            - leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 411
+                                                  line: 14
+                                                  character: 31
+                                                end_position:
+                                                  bytes: 412
+                                                  line: 14
+                                                  character: 32
+                                                token_type:
+                                                  type: Symbol
+                                                  symbol: )
+                                              trailing_trivia:
+                                                - start_position:
+                                                    bytes: 412
+                                                    line: 14
+                                                    character: 32
+                                                  end_position:
+                                                    bytes: 413
+                                                    line: 14
+                                                    character: 32
+                                                  token_type:
+                                                    type: Whitespace
+                                                    characters: "\n"
+                                        arguments:
+                                          pairs:
+                                            - Punctuated:
+                                                - String:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 389
+                                                        line: 14
+                                                        character: 9
+                                                      end_position:
+                                                        bytes: 404
+                                                        line: 14
+                                                        character: 24
+                                                      token_type:
+                                                        type: StringLiteral
+                                                        literal: "[LineOfSight]"
+                                                        quote_type: Double
+                                                    trailing_trivia: []
+                                                - leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 404
+                                                      line: 14
+                                                      character: 24
+                                                    end_position:
+                                                      bytes: 405
+                                                      line: 14
+                                                      character: 25
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: ","
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 405
+                                                        line: 14
+                                                        character: 25
+                                                      end_position:
+                                                        bytes: 406
+                                                        line: 14
+                                                        character: 26
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                            - End:
+                                                Var:
+                                                  Name:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 406
+                                                        line: 14
+                                                        character: 26
+                                                      end_position:
+                                                        bytes: 411
+                                                        line: 14
+                                                        character: 31
+                                                      token_type:
+                                                        type: Identifier
+                                                        identifier: table
+                                                    trailing_trivia: []
+                          - ~
+                    end_token:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 413
+                            line: 15
+                            character: 1
+                          end_position:
+                            bytes: 414
+                            line: 15
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 414
+                          line: 15
+                          character: 2
+                        end_position:
+                          bytes: 417
+                          line: 15
+                          character: 5
+                        token_type:
+                          type: Symbol
+                          symbol: end
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 417
+                            line: 15
+                            character: 5
+                          end_position:
+                            bytes: 418
+                            line: 15
+                            character: 5
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+              - ~
+        else_if: ~
+        else_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 418
+              line: 16
+              character: 1
+            end_position:
+              bytes: 422
+              line: 16
+              character: 5
+            token_type:
+              type: Symbol
+              symbol: else
+          trailing_trivia:
+            - start_position:
+                bytes: 422
+                line: 16
+                character: 5
+              end_position:
+                bytes: 423
+                line: 16
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        else:
+          stmts:
+            - - FunctionDeclaration:
+                  function_token:
+                    leading_trivia:
+                      - start_position:
+                          bytes: 423
+                          line: 17
+                          character: 1
+                        end_position:
+                          bytes: 424
+                          line: 17
+                          character: 2
+                        token_type:
+                          type: Whitespace
+                          characters: "\t"
+                    token:
+                      start_position:
+                        bytes: 424
+                        line: 17
+                        character: 2
+                      end_position:
+                        bytes: 432
+                        line: 17
+                        character: 10
+                      token_type:
+                        type: Symbol
+                        symbol: function
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 432
+                          line: 17
+                          character: 10
+                        end_position:
+                          bytes: 433
+                          line: 17
+                          character: 11
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  name:
+                    names:
+                      pairs:
+                        - End:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 433
+                                line: 17
+                                character: 11
+                              end_position:
+                                bytes: 438
+                                line: 17
+                                character: 16
+                              token_type:
+                                type: Identifier
+                                identifier: debug
+                            trailing_trivia: []
+                    colon_name: ~
+                  body:
+                    parameters_parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 438
+                              line: 17
+                              character: 16
+                            end_position:
+                              bytes: 439
+                              line: 17
+                              character: 17
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 439
+                              line: 17
+                              character: 17
+                            end_position:
+                              bytes: 440
+                              line: 17
+                              character: 18
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 440
+                                line: 17
+                                character: 18
+                              end_position:
+                                bytes: 441
+                                line: 17
+                                character: 18
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    parameters:
+                      pairs: []
+                    type_specifiers: []
+                    block:
+                      stmts: []
+                    end_token:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 441
+                            line: 18
+                            character: 1
+                          end_position:
+                            bytes: 442
+                            line: 18
+                            character: 2
+                          token_type:
+                            type: Whitespace
+                            characters: "\t"
+                      token:
+                        start_position:
+                          bytes: 442
+                          line: 18
+                          character: 2
+                        end_position:
+                          bytes: 445
+                          line: 18
+                          character: 5
+                        token_type:
+                          type: Symbol
+                          symbol: end
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 445
+                            line: 18
+                            character: 5
+                          end_position:
+                            bytes: 446
+                            line: 18
+                            character: 5
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+              - ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 446
+              line: 19
+              character: 1
+            end_position:
+              bytes: 449
+              line: 19
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 449
+                line: 19
+                character: 4
+              end_position:
+                bytes: 450
+                line: 19
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
+last_stmt:
+  - Return:
+      token:
+        leading_trivia:
+          - start_position:
+              bytes: 450
+              line: 20
+              character: 1
+            end_position:
+              bytes: 451
+              line: 20
+              character: 1
+            token_type:
+              type: Whitespace
+              characters: "\n"
+        token:
+          start_position:
+            bytes: 451
+            line: 21
+            character: 1
+          end_position:
+            bytes: 457
+            line: 21
+            character: 7
+          token_type:
+            type: Symbol
+            symbol: return
+        trailing_trivia:
+          - start_position:
+              bytes: 457
+              line: 21
+              character: 7
+            end_position:
+              bytes: 458
+              line: 21
+              character: 8
+            token_type:
+              type: Whitespace
+              characters: " "
+      returns:
+        pairs:
+          - End:
+              Function:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 458
+                      line: 21
+                      character: 8
+                    end_position:
+                      bytes: 466
+                      line: 21
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: function
+                  trailing_trivia: []
+                - parameters_parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 466
+                            line: 21
+                            character: 16
+                          end_position:
+                            bytes: 467
+                            line: 21
+                            character: 17
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 512
+                            line: 21
+                            character: 62
+                          end_position:
+                            bytes: 513
+                            line: 21
+                            character: 63
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 513
+                              line: 21
+                              character: 63
+                            end_position:
+                              bytes: 514
+                              line: 21
+                              character: 63
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  parameters:
+                    pairs:
+                      - Punctuated:
+                          - name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 467
+                                  line: 21
+                                  character: 17
+                                end_position:
+                                  bytes: 473
+                                  line: 21
+                                  character: 23
+                                token_type:
+                                  type: Identifier
+                                  identifier: origin
+                              trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 473
+                                line: 21
+                                character: 23
+                              end_position:
+                                bytes: 474
+                                line: 21
+                                character: 24
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 474
+                                  line: 21
+                                  character: 24
+                                end_position:
+                                  bytes: 475
+                                  line: 21
+                                  character: 25
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      - Punctuated:
+                          - name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 475
+                                  line: 21
+                                  character: 25
+                                end_position:
+                                  bytes: 484
+                                  line: 21
+                                  character: 34
+                                token_type:
+                                  type: Identifier
+                                  identifier: character
+                              trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 484
+                                line: 21
+                                character: 34
+                              end_position:
+                                bytes: 485
+                                line: 21
+                                character: 35
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 485
+                                  line: 21
+                                  character: 35
+                                end_position:
+                                  bytes: 486
+                                  line: 21
+                                  character: 36
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      - Punctuated:
+                          - name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 486
+                                  line: 21
+                                  character: 36
+                                end_position:
+                                  bytes: 491
+                                  line: 21
+                                  character: 41
+                                token_type:
+                                  type: Identifier
+                                  identifier: range
+                              trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 491
+                                line: 21
+                                character: 41
+                              end_position:
+                                bytes: 492
+                                line: 21
+                                character: 42
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 492
+                                  line: 21
+                                  character: 42
+                                end_position:
+                                  bytes: 493
+                                  line: 21
+                                  character: 43
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      - Punctuated:
+                          - name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 493
+                                  line: 21
+                                  character: 43
+                                end_position:
+                                  bytes: 501
+                                  line: 21
+                                  character: 51
+                                token_type:
+                                  type: Identifier
+                                  identifier: ignoreIf
+                              trailing_trivia: []
+                          - leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 501
+                                line: 21
+                                character: 51
+                              end_position:
+                                bytes: 502
+                                line: 21
+                                character: 52
+                              token_type:
+                                type: Symbol
+                                symbol: ","
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 502
+                                  line: 21
+                                  character: 52
+                                end_position:
+                                  bytes: 503
+                                  line: 21
+                                  character: 53
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                      - End:
+                          name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 503
+                                line: 21
+                                character: 53
+                              end_position:
+                                bytes: 512
+                                line: 21
+                                character: 62
+                              token_type:
+                                type: Identifier
+                                identifier: blacklist
+                            trailing_trivia: []
+                  type_specifiers:
+                    - ~
+                    - ~
+                    - ~
+                    - ~
+                    - ~
+                  block:
+                    stmts:
+                      - - If:
+                            if_token:
+                              leading_trivia:
+                                - start_position:
+                                    bytes: 514
+                                    line: 22
+                                    character: 1
+                                  end_position:
+                                    bytes: 515
+                                    line: 22
+                                    character: 2
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\t"
+                              token:
+                                start_position:
+                                  bytes: 515
+                                  line: 22
+                                  character: 2
+                                end_position:
+                                  bytes: 517
+                                  line: 22
+                                  character: 4
+                                token_type:
+                                  type: Symbol
+                                  symbol: if
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 517
+                                    line: 22
+                                    character: 4
+                                  end_position:
+                                    bytes: 518
+                                    line: 22
+                                    character: 5
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            condition:
+                              BinaryOperator:
+                                lhs:
+                                  FunctionCall:
+                                    prefix:
+                                      Name:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 518
+                                            line: 22
+                                            character: 5
+                                          end_position:
+                                            bytes: 524
+                                            line: 22
+                                            character: 11
+                                          token_type:
+                                            type: Identifier
+                                            identifier: typeof
+                                        trailing_trivia: []
+                                    suffixes:
+                                      - Call:
+                                          AnonymousCall:
+                                            Parentheses:
+                                              parentheses:
+                                                tokens:
+                                                  - leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 524
+                                                        line: 22
+                                                        character: 11
+                                                      end_position:
+                                                        bytes: 525
+                                                        line: 22
+                                                        character: 12
+                                                      token_type:
+                                                        type: Symbol
+                                                        symbol: (
+                                                    trailing_trivia: []
+                                                  - leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 531
+                                                        line: 22
+                                                        character: 18
+                                                      end_position:
+                                                        bytes: 532
+                                                        line: 22
+                                                        character: 19
+                                                      token_type:
+                                                        type: Symbol
+                                                        symbol: )
+                                                    trailing_trivia:
+                                                      - start_position:
+                                                          bytes: 532
+                                                          line: 22
+                                                          character: 19
+                                                        end_position:
+                                                          bytes: 533
+                                                          line: 22
+                                                          character: 20
+                                                        token_type:
+                                                          type: Whitespace
+                                                          characters: " "
+                                              arguments:
+                                                pairs:
+                                                  - End:
+                                                      Var:
+                                                        Name:
+                                                          leading_trivia: []
+                                                          token:
+                                                            start_position:
+                                                              bytes: 525
+                                                              line: 22
+                                                              character: 12
+                                                            end_position:
+                                                              bytes: 531
+                                                              line: 22
+                                                              character: 18
+                                                            token_type:
+                                                              type: Identifier
+                                                              identifier: origin
+                                                          trailing_trivia: []
+                                binop:
+                                  TwoEqual:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 533
+                                        line: 22
+                                        character: 20
+                                      end_position:
+                                        bytes: 535
+                                        line: 22
+                                        character: 22
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "=="
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 535
+                                          line: 22
+                                          character: 22
+                                        end_position:
+                                          bytes: 536
+                                          line: 22
+                                          character: 23
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                                rhs:
+                                  String:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 536
+                                        line: 22
+                                        character: 23
+                                      end_position:
+                                        bytes: 546
+                                        line: 22
+                                        character: 33
+                                      token_type:
+                                        type: StringLiteral
+                                        literal: Instance
+                                        quote_type: Double
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 546
+                                          line: 22
+                                          character: 33
+                                        end_position:
+                                          bytes: 547
+                                          line: 22
+                                          character: 34
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                            then_token:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 547
+                                  line: 22
+                                  character: 34
+                                end_position:
+                                  bytes: 551
+                                  line: 22
+                                  character: 38
+                                token_type:
+                                  type: Symbol
+                                  symbol: then
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 551
+                                    line: 22
+                                    character: 38
+                                  end_position:
+                                    bytes: 552
+                                    line: 22
+                                    character: 38
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                            block:
+                              stmts:
+                                - - If:
+                                      if_token:
+                                        leading_trivia:
+                                          - start_position:
+                                              bytes: 552
+                                              line: 23
+                                              character: 1
+                                            end_position:
+                                              bytes: 554
+                                              line: 23
+                                              character: 3
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\t\t"
+                                        token:
+                                          start_position:
+                                            bytes: 554
+                                            line: 23
+                                            character: 3
+                                          end_position:
+                                            bytes: 556
+                                            line: 23
+                                            character: 5
+                                          token_type:
+                                            type: Symbol
+                                            symbol: if
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 556
+                                              line: 23
+                                              character: 5
+                                            end_position:
+                                              bytes: 557
+                                              line: 23
+                                              character: 6
+                                            token_type:
+                                              type: Whitespace
+                                              characters: " "
+                                      condition:
+                                        FunctionCall:
+                                          prefix:
+                                            Name:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 557
+                                                  line: 23
+                                                  character: 6
+                                                end_position:
+                                                  bytes: 563
+                                                  line: 23
+                                                  character: 12
+                                                token_type:
+                                                  type: Identifier
+                                                  identifier: origin
+                                              trailing_trivia: []
+                                          suffixes:
+                                            - Index:
+                                                Dot:
+                                                  dot:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 563
+                                                        line: 23
+                                                        character: 12
+                                                      end_position:
+                                                        bytes: 564
+                                                        line: 23
+                                                        character: 13
+                                                      token_type:
+                                                        type: Symbol
+                                                        symbol: "."
+                                                    trailing_trivia: []
+                                                  name:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 564
+                                                        line: 23
+                                                        character: 13
+                                                      end_position:
+                                                        bytes: 572
+                                                        line: 23
+                                                        character: 21
+                                                      token_type:
+                                                        type: Identifier
+                                                        identifier: Position
+                                                    trailing_trivia: []
+                                            - Call:
+                                                MethodCall:
+                                                  colon_token:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 572
+                                                        line: 23
+                                                        character: 21
+                                                      end_position:
+                                                        bytes: 573
+                                                        line: 23
+                                                        character: 22
+                                                      token_type:
+                                                        type: Symbol
+                                                        symbol: ":"
+                                                    trailing_trivia: []
+                                                  name:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 573
+                                                        line: 23
+                                                        character: 22
+                                                      end_position:
+                                                        bytes: 580
+                                                        line: 23
+                                                        character: 29
+                                                      token_type:
+                                                        type: Identifier
+                                                        identifier: FuzzyEq
+                                                    trailing_trivia: []
+                                                  args:
+                                                    Parentheses:
+                                                      parentheses:
+                                                        tokens:
+                                                          - leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 580
+                                                                line: 23
+                                                                character: 29
+                                                              end_position:
+                                                                bytes: 581
+                                                                line: 23
+                                                                character: 30
+                                                              token_type:
+                                                                type: Symbol
+                                                                symbol: (
+                                                            trailing_trivia: []
+                                                          - leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 611
+                                                                line: 23
+                                                                character: 60
+                                                              end_position:
+                                                                bytes: 612
+                                                                line: 23
+                                                                character: 61
+                                                              token_type:
+                                                                type: Symbol
+                                                                symbol: )
+                                                            trailing_trivia:
+                                                              - start_position:
+                                                                  bytes: 612
+                                                                  line: 23
+                                                                  character: 61
+                                                                end_position:
+                                                                  bytes: 613
+                                                                  line: 23
+                                                                  character: 62
+                                                                token_type:
+                                                                  type: Whitespace
+                                                                  characters: " "
+                                                      arguments:
+                                                        pairs:
+                                                          - End:
+                                                              Var:
+                                                                Expression:
+                                                                  prefix:
+                                                                    Name:
+                                                                      leading_trivia: []
+                                                                      token:
+                                                                        start_position:
+                                                                          bytes: 581
+                                                                          line: 23
+                                                                          character: 30
+                                                                        end_position:
+                                                                          bytes: 590
+                                                                          line: 23
+                                                                          character: 39
+                                                                        token_type:
+                                                                          type: Identifier
+                                                                          identifier: character
+                                                                      trailing_trivia: []
+                                                                  suffixes:
+                                                                    - Index:
+                                                                        Dot:
+                                                                          dot:
+                                                                            leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 590
+                                                                                line: 23
+                                                                                character: 39
+                                                                              end_position:
+                                                                                bytes: 591
+                                                                                line: 23
+                                                                                character: 40
+                                                                              token_type:
+                                                                                type: Symbol
+                                                                                symbol: "."
+                                                                            trailing_trivia: []
+                                                                          name:
+                                                                            leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 591
+                                                                                line: 23
+                                                                                character: 40
+                                                                              end_position:
+                                                                                bytes: 602
+                                                                                line: 23
+                                                                                character: 51
+                                                                              token_type:
+                                                                                type: Identifier
+                                                                                identifier: PrimaryPart
+                                                                            trailing_trivia: []
+                                                                    - Index:
+                                                                        Dot:
+                                                                          dot:
+                                                                            leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 602
+                                                                                line: 23
+                                                                                character: 51
+                                                                              end_position:
+                                                                                bytes: 603
+                                                                                line: 23
+                                                                                character: 52
+                                                                              token_type:
+                                                                                type: Symbol
+                                                                                symbol: "."
+                                                                            trailing_trivia: []
+                                                                          name:
+                                                                            leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 603
+                                                                                line: 23
+                                                                                character: 52
+                                                                              end_position:
+                                                                                bytes: 611
+                                                                                line: 23
+                                                                                character: 60
+                                                                              token_type:
+                                                                                type: Identifier
+                                                                                identifier: Position
+                                                                            trailing_trivia: []
+                                      then_token:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 613
+                                            line: 23
+                                            character: 62
+                                          end_position:
+                                            bytes: 617
+                                            line: 23
+                                            character: 66
+                                          token_type:
+                                            type: Symbol
+                                            symbol: then
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 617
+                                              line: 23
+                                              character: 66
+                                            end_position:
+                                              bytes: 618
+                                              line: 23
+                                              character: 66
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\n"
+                                      block:
+                                        stmts:
+                                          - - FunctionCall:
+                                                prefix:
+                                                  Name:
+                                                    leading_trivia:
+                                                      - start_position:
+                                                          bytes: 618
+                                                          line: 24
+                                                          character: 1
+                                                        end_position:
+                                                          bytes: 621
+                                                          line: 24
+                                                          character: 4
+                                                        token_type:
+                                                          type: Whitespace
+                                                          characters: "\t\t\t"
+                                                    token:
+                                                      start_position:
+                                                        bytes: 621
+                                                        line: 24
+                                                        character: 4
+                                                      end_position:
+                                                        bytes: 626
+                                                        line: 24
+                                                        character: 9
+                                                      token_type:
+                                                        type: Identifier
+                                                        identifier: debug
+                                                    trailing_trivia: []
+                                                suffixes:
+                                                  - Call:
+                                                      AnonymousCall:
+                                                        Parentheses:
+                                                          parentheses:
+                                                            tokens:
+                                                              - leading_trivia: []
+                                                                token:
+                                                                  start_position:
+                                                                    bytes: 626
+                                                                    line: 24
+                                                                    character: 9
+                                                                  end_position:
+                                                                    bytes: 627
+                                                                    line: 24
+                                                                    character: 10
+                                                                  token_type:
+                                                                    type: Symbol
+                                                                    symbol: (
+                                                                trailing_trivia: []
+                                                              - leading_trivia: []
+                                                                token:
+                                                                  start_position:
+                                                                    bytes: 649
+                                                                    line: 24
+                                                                    character: 32
+                                                                  end_position:
+                                                                    bytes: 650
+                                                                    line: 24
+                                                                    character: 33
+                                                                  token_type:
+                                                                    type: Symbol
+                                                                    symbol: )
+                                                                trailing_trivia:
+                                                                  - start_position:
+                                                                      bytes: 650
+                                                                      line: 24
+                                                                      character: 33
+                                                                    end_position:
+                                                                      bytes: 651
+                                                                      line: 24
+                                                                      character: 33
+                                                                    token_type:
+                                                                      type: Whitespace
+                                                                      characters: "\n"
+                                                          arguments:
+                                                            pairs:
+                                                              - End:
+                                                                  String:
+                                                                    leading_trivia: []
+                                                                    token:
+                                                                      start_position:
+                                                                        bytes: 627
+                                                                        line: 24
+                                                                        character: 10
+                                                                      end_position:
+                                                                        bytes: 649
+                                                                        line: 24
+                                                                        character: 32
+                                                                      token_type:
+                                                                        type: StringLiteral
+                                                                        literal: ORIGIN WAS CHARACTER
+                                                                        quote_type: Double
+                                                                    trailing_trivia: []
+                                            - ~
+                                        last_stmt:
+                                          - Return:
+                                              token:
+                                                leading_trivia:
+                                                  - start_position:
+                                                      bytes: 651
+                                                      line: 25
+                                                      character: 1
+                                                    end_position:
+                                                      bytes: 654
+                                                      line: 25
+                                                      character: 4
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: "\t\t\t"
+                                                token:
+                                                  start_position:
+                                                    bytes: 654
+                                                    line: 25
+                                                    character: 4
+                                                  end_position:
+                                                    bytes: 660
+                                                    line: 25
+                                                    character: 10
+                                                  token_type:
+                                                    type: Symbol
+                                                    symbol: return
+                                                trailing_trivia:
+                                                  - start_position:
+                                                      bytes: 660
+                                                      line: 25
+                                                      character: 10
+                                                    end_position:
+                                                      bytes: 661
+                                                      line: 25
+                                                      character: 11
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: " "
+                                              returns:
+                                                pairs:
+                                                  - Punctuated:
+                                                      - Var:
+                                                          Name:
+                                                            leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 661
+                                                                line: 25
+                                                                character: 11
+                                                              end_position:
+                                                                bytes: 667
+                                                                line: 25
+                                                                character: 17
+                                                              token_type:
+                                                                type: Identifier
+                                                                identifier: origin
+                                                            trailing_trivia: []
+                                                      - leading_trivia: []
+                                                        token:
+                                                          start_position:
+                                                            bytes: 667
+                                                            line: 25
+                                                            character: 17
+                                                          end_position:
+                                                            bytes: 668
+                                                            line: 25
+                                                            character: 18
+                                                          token_type:
+                                                            type: Symbol
+                                                            symbol: ","
+                                                        trailing_trivia:
+                                                          - start_position:
+                                                              bytes: 668
+                                                              line: 25
+                                                              character: 18
+                                                            end_position:
+                                                              bytes: 669
+                                                              line: 25
+                                                              character: 19
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: " "
+                                                  - End:
+                                                      Var:
+                                                        Expression:
+                                                          prefix:
+                                                            Name:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 669
+                                                                  line: 25
+                                                                  character: 19
+                                                                end_position:
+                                                                  bytes: 675
+                                                                  line: 25
+                                                                  character: 25
+                                                                token_type:
+                                                                  type: Identifier
+                                                                  identifier: origin
+                                                              trailing_trivia: []
+                                                          suffixes:
+                                                            - Index:
+                                                                Dot:
+                                                                  dot:
+                                                                    leading_trivia: []
+                                                                    token:
+                                                                      start_position:
+                                                                        bytes: 675
+                                                                        line: 25
+                                                                        character: 25
+                                                                      end_position:
+                                                                        bytes: 676
+                                                                        line: 25
+                                                                        character: 26
+                                                                      token_type:
+                                                                        type: Symbol
+                                                                        symbol: "."
+                                                                    trailing_trivia: []
+                                                                  name:
+                                                                    leading_trivia: []
+                                                                    token:
+                                                                      start_position:
+                                                                        bytes: 676
+                                                                        line: 25
+                                                                        character: 26
+                                                                      end_position:
+                                                                        bytes: 684
+                                                                        line: 25
+                                                                        character: 34
+                                                                      token_type:
+                                                                        type: Identifier
+                                                                        identifier: Position
+                                                                    trailing_trivia:
+                                                                      - start_position:
+                                                                          bytes: 684
+                                                                          line: 25
+                                                                          character: 34
+                                                                        end_position:
+                                                                          bytes: 685
+                                                                          line: 25
+                                                                          character: 34
+                                                                        token_type:
+                                                                          type: Whitespace
+                                                                          characters: "\n"
+                                          - ~
+                                      else_if: ~
+                                      else_token: ~
+                                      else: ~
+                                      end_token:
+                                        leading_trivia:
+                                          - start_position:
+                                              bytes: 685
+                                              line: 26
+                                              character: 1
+                                            end_position:
+                                              bytes: 687
+                                              line: 26
+                                              character: 3
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\t\t"
+                                        token:
+                                          start_position:
+                                            bytes: 687
+                                            line: 26
+                                            character: 3
+                                          end_position:
+                                            bytes: 690
+                                            line: 26
+                                            character: 6
+                                          token_type:
+                                            type: Symbol
+                                            symbol: end
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 690
+                                              line: 26
+                                              character: 6
+                                            end_position:
+                                              bytes: 691
+                                              line: 26
+                                              character: 6
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\n"
+                                  - ~
+                                - - Assignment:
+                                      var_list:
+                                        pairs:
+                                          - End:
+                                              Name:
+                                                leading_trivia:
+                                                  - start_position:
+                                                      bytes: 691
+                                                      line: 27
+                                                      character: 1
+                                                    end_position:
+                                                      bytes: 692
+                                                      line: 27
+                                                      character: 1
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: "\n"
+                                                  - start_position:
+                                                      bytes: 692
+                                                      line: 28
+                                                      character: 1
+                                                    end_position:
+                                                      bytes: 694
+                                                      line: 28
+                                                      character: 3
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: "\t\t"
+                                                token:
+                                                  start_position:
+                                                    bytes: 694
+                                                    line: 28
+                                                    character: 3
+                                                  end_position:
+                                                    bytes: 700
+                                                    line: 28
+                                                    character: 9
+                                                  token_type:
+                                                    type: Identifier
+                                                    identifier: origin
+                                                trailing_trivia:
+                                                  - start_position:
+                                                      bytes: 700
+                                                      line: 28
+                                                      character: 9
+                                                    end_position:
+                                                      bytes: 701
+                                                      line: 28
+                                                      character: 10
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: " "
+                                      equal_token:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 701
+                                            line: 28
+                                            character: 10
+                                          end_position:
+                                            bytes: 702
+                                            line: 28
+                                            character: 11
+                                          token_type:
+                                            type: Symbol
+                                            symbol: "="
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 702
+                                              line: 28
+                                              character: 11
+                                            end_position:
+                                              bytes: 703
+                                              line: 28
+                                              character: 12
+                                            token_type:
+                                              type: Whitespace
+                                              characters: " "
+                                      expr_list:
+                                        pairs:
+                                          - End:
+                                              Var:
+                                                Expression:
+                                                  prefix:
+                                                    Name:
+                                                      leading_trivia: []
+                                                      token:
+                                                        start_position:
+                                                          bytes: 703
+                                                          line: 28
+                                                          character: 12
+                                                        end_position:
+                                                          bytes: 709
+                                                          line: 28
+                                                          character: 18
+                                                        token_type:
+                                                          type: Identifier
+                                                          identifier: origin
+                                                      trailing_trivia: []
+                                                  suffixes:
+                                                    - Index:
+                                                        Dot:
+                                                          dot:
+                                                            leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 709
+                                                                line: 28
+                                                                character: 18
+                                                              end_position:
+                                                                bytes: 710
+                                                                line: 28
+                                                                character: 19
+                                                              token_type:
+                                                                type: Symbol
+                                                                symbol: "."
+                                                            trailing_trivia: []
+                                                          name:
+                                                            leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 710
+                                                                line: 28
+                                                                character: 19
+                                                              end_position:
+                                                                bytes: 718
+                                                                line: 28
+                                                                character: 27
+                                                              token_type:
+                                                                type: Identifier
+                                                                identifier: Position
+                                                            trailing_trivia:
+                                                              - start_position:
+                                                                  bytes: 718
+                                                                  line: 28
+                                                                  character: 27
+                                                                end_position:
+                                                                  bytes: 719
+                                                                  line: 28
+                                                                  character: 27
+                                                                token_type:
+                                                                  type: Whitespace
+                                                                  characters: "\n"
+                                  - ~
+                            else_if: ~
+                            else_token: ~
+                            else: ~
+                            end_token:
+                              leading_trivia:
+                                - start_position:
+                                    bytes: 719
+                                    line: 29
+                                    character: 1
+                                  end_position:
+                                    bytes: 720
+                                    line: 29
+                                    character: 2
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\t"
+                              token:
+                                start_position:
+                                  bytes: 720
+                                  line: 29
+                                  character: 2
+                                end_position:
+                                  bytes: 723
+                                  line: 29
+                                  character: 5
+                                token_type:
+                                  type: Symbol
+                                  symbol: end
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 723
+                                    line: 29
+                                    character: 5
+                                  end_position:
+                                    bytes: 724
+                                    line: 29
+                                    character: 5
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                        - ~
+                      - - Assignment:
+                            var_list:
+                              pairs:
+                                - End:
+                                    Name:
+                                      leading_trivia:
+                                        - start_position:
+                                            bytes: 724
+                                            line: 30
+                                            character: 1
+                                          end_position:
+                                            bytes: 725
+                                            line: 30
+                                            character: 1
+                                          token_type:
+                                            type: Whitespace
+                                            characters: "\n"
+                                        - start_position:
+                                            bytes: 725
+                                            line: 31
+                                            character: 1
+                                          end_position:
+                                            bytes: 726
+                                            line: 31
+                                            character: 2
+                                          token_type:
+                                            type: Whitespace
+                                            characters: "\t"
+                                      token:
+                                        start_position:
+                                          bytes: 726
+                                          line: 31
+                                          character: 2
+                                        end_position:
+                                          bytes: 735
+                                          line: 31
+                                          character: 11
+                                        token_type:
+                                          type: Identifier
+                                          identifier: blacklist
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 735
+                                            line: 31
+                                            character: 11
+                                          end_position:
+                                            bytes: 736
+                                            line: 31
+                                            character: 12
+                                          token_type:
+                                            type: Whitespace
+                                            characters: " "
+                            equal_token:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 736
+                                  line: 31
+                                  character: 12
+                                end_position:
+                                  bytes: 737
+                                  line: 31
+                                  character: 13
+                                token_type:
+                                  type: Symbol
+                                  symbol: "="
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 737
+                                    line: 31
+                                    character: 13
+                                  end_position:
+                                    bytes: 738
+                                    line: 31
+                                    character: 14
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            expr_list:
+                              pairs:
+                                - End:
+                                    BinaryOperator:
+                                      lhs:
+                                        Var:
+                                          Name:
+                                            leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 738
+                                                line: 31
+                                                character: 14
+                                              end_position:
+                                                bytes: 747
+                                                line: 31
+                                                character: 23
+                                              token_type:
+                                                type: Identifier
+                                                identifier: blacklist
+                                            trailing_trivia:
+                                              - start_position:
+                                                  bytes: 747
+                                                  line: 31
+                                                  character: 23
+                                                end_position:
+                                                  bytes: 748
+                                                  line: 31
+                                                  character: 24
+                                                token_type:
+                                                  type: Whitespace
+                                                  characters: " "
+                                      binop:
+                                        Or:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 748
+                                              line: 31
+                                              character: 24
+                                            end_position:
+                                              bytes: 750
+                                              line: 31
+                                              character: 26
+                                            token_type:
+                                              type: Symbol
+                                              symbol: or
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 750
+                                                line: 31
+                                                character: 26
+                                              end_position:
+                                                bytes: 751
+                                                line: 31
+                                                character: 27
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                      rhs:
+                                        TableConstructor:
+                                          braces:
+                                            tokens:
+                                              - leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 751
+                                                    line: 31
+                                                    character: 27
+                                                  end_position:
+                                                    bytes: 752
+                                                    line: 31
+                                                    character: 28
+                                                  token_type:
+                                                    type: Symbol
+                                                    symbol: "{"
+                                                trailing_trivia: []
+                                              - leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 752
+                                                    line: 31
+                                                    character: 28
+                                                  end_position:
+                                                    bytes: 753
+                                                    line: 31
+                                                    character: 29
+                                                  token_type:
+                                                    type: Symbol
+                                                    symbol: "}"
+                                                trailing_trivia:
+                                                  - start_position:
+                                                      bytes: 753
+                                                      line: 31
+                                                      character: 29
+                                                    end_position:
+                                                      bytes: 754
+                                                      line: 31
+                                                      character: 29
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: "\n"
+                                          fields:
+                                            pairs: []
+                        - ~
+                      - - LocalAssignment:
+                            local_token:
+                              leading_trivia:
+                                - start_position:
+                                    bytes: 754
+                                    line: 32
+                                    character: 1
+                                  end_position:
+                                    bytes: 755
+                                    line: 32
+                                    character: 1
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                                - start_position:
+                                    bytes: 755
+                                    line: 33
+                                    character: 1
+                                  end_position:
+                                    bytes: 756
+                                    line: 33
+                                    character: 2
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\t"
+                              token:
+                                start_position:
+                                  bytes: 756
+                                  line: 33
+                                  character: 2
+                                end_position:
+                                  bytes: 761
+                                  line: 33
+                                  character: 7
+                                token_type:
+                                  type: Symbol
+                                  symbol: local
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 761
+                                    line: 33
+                                    character: 7
+                                  end_position:
+                                    bytes: 762
+                                    line: 33
+                                    character: 8
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            name_list:
+                              pairs:
+                                - Punctuated:
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 762
+                                          line: 33
+                                          character: 8
+                                        end_position:
+                                          bytes: 765
+                                          line: 33
+                                          character: 11
+                                        token_type:
+                                          type: Identifier
+                                          identifier: hit
+                                      trailing_trivia: []
+                                    - leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 765
+                                          line: 33
+                                          character: 11
+                                        end_position:
+                                          bytes: 766
+                                          line: 33
+                                          character: 12
+                                        token_type:
+                                          type: Symbol
+                                          symbol: ","
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 766
+                                            line: 33
+                                            character: 12
+                                          end_position:
+                                            bytes: 767
+                                            line: 33
+                                            character: 13
+                                          token_type:
+                                            type: Whitespace
+                                            characters: " "
+                                - End:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 767
+                                        line: 33
+                                        character: 13
+                                      end_position:
+                                        bytes: 772
+                                        line: 33
+                                        character: 18
+                                      token_type:
+                                        type: Identifier
+                                        identifier: point
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 772
+                                          line: 33
+                                          character: 18
+                                        end_position:
+                                          bytes: 773
+                                          line: 33
+                                          character: 19
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                            equal_token: ~
+                            expr_list:
+                              pairs: []
+                        - ~
+                      - - Do:
+                            do_token:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 773
+                                  line: 33
+                                  character: 19
+                                end_position:
+                                  bytes: 775
+                                  line: 33
+                                  character: 21
+                                token_type:
+                                  type: Symbol
+                                  symbol: do
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 775
+                                    line: 33
+                                    character: 21
+                                  end_position:
+                                    bytes: 776
+                                    line: 33
+                                    character: 21
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                            block:
+                              stmts:
+                                - - While:
+                                      while_token:
+                                        leading_trivia:
+                                          - start_position:
+                                              bytes: 776
+                                              line: 34
+                                              character: 1
+                                            end_position:
+                                              bytes: 778
+                                              line: 34
+                                              character: 3
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\t\t"
+                                        token:
+                                          start_position:
+                                            bytes: 778
+                                            line: 34
+                                            character: 3
+                                          end_position:
+                                            bytes: 783
+                                            line: 34
+                                            character: 8
+                                          token_type:
+                                            type: Symbol
+                                            symbol: while
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 783
+                                              line: 34
+                                              character: 8
+                                            end_position:
+                                              bytes: 784
+                                              line: 34
+                                              character: 9
+                                            token_type:
+                                              type: Whitespace
+                                              characters: " "
+                                      condition:
+                                        Symbol:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 784
+                                              line: 34
+                                              character: 9
+                                            end_position:
+                                              bytes: 788
+                                              line: 34
+                                              character: 13
+                                            token_type:
+                                              type: Symbol
+                                              symbol: "true"
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 788
+                                                line: 34
+                                                character: 13
+                                              end_position:
+                                                bytes: 789
+                                                line: 34
+                                                character: 14
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                      do_token:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 789
+                                            line: 34
+                                            character: 14
+                                          end_position:
+                                            bytes: 791
+                                            line: 34
+                                            character: 16
+                                          token_type:
+                                            type: Symbol
+                                            symbol: do
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 791
+                                              line: 34
+                                              character: 16
+                                            end_position:
+                                              bytes: 792
+                                              line: 34
+                                              character: 16
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\n"
+                                      block:
+                                        stmts:
+                                          - - Assignment:
+                                                var_list:
+                                                  pairs:
+                                                    - Punctuated:
+                                                        - Name:
+                                                            leading_trivia:
+                                                              - start_position:
+                                                                  bytes: 792
+                                                                  line: 35
+                                                                  character: 1
+                                                                end_position:
+                                                                  bytes: 795
+                                                                  line: 35
+                                                                  character: 4
+                                                                token_type:
+                                                                  type: Whitespace
+                                                                  characters: "\t\t\t"
+                                                            token:
+                                                              start_position:
+                                                                bytes: 795
+                                                                line: 35
+                                                                character: 4
+                                                              end_position:
+                                                                bytes: 798
+                                                                line: 35
+                                                                character: 7
+                                                              token_type:
+                                                                type: Identifier
+                                                                identifier: hit
+                                                            trailing_trivia: []
+                                                        - leading_trivia: []
+                                                          token:
+                                                            start_position:
+                                                              bytes: 798
+                                                              line: 35
+                                                              character: 7
+                                                            end_position:
+                                                              bytes: 799
+                                                              line: 35
+                                                              character: 8
+                                                            token_type:
+                                                              type: Symbol
+                                                              symbol: ","
+                                                          trailing_trivia:
+                                                            - start_position:
+                                                                bytes: 799
+                                                                line: 35
+                                                                character: 8
+                                                              end_position:
+                                                                bytes: 800
+                                                                line: 35
+                                                                character: 9
+                                                              token_type:
+                                                                type: Whitespace
+                                                                characters: " "
+                                                    - End:
+                                                        Name:
+                                                          leading_trivia: []
+                                                          token:
+                                                            start_position:
+                                                              bytes: 800
+                                                              line: 35
+                                                              character: 9
+                                                            end_position:
+                                                              bytes: 805
+                                                              line: 35
+                                                              character: 14
+                                                            token_type:
+                                                              type: Identifier
+                                                              identifier: point
+                                                          trailing_trivia:
+                                                            - start_position:
+                                                                bytes: 805
+                                                                line: 35
+                                                                character: 14
+                                                              end_position:
+                                                                bytes: 806
+                                                                line: 35
+                                                                character: 15
+                                                              token_type:
+                                                                type: Whitespace
+                                                                characters: " "
+                                                equal_token:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 806
+                                                      line: 35
+                                                      character: 15
+                                                    end_position:
+                                                      bytes: 807
+                                                      line: 35
+                                                      character: 16
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: "="
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 807
+                                                        line: 35
+                                                        character: 16
+                                                      end_position:
+                                                        bytes: 808
+                                                        line: 35
+                                                        character: 17
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                                expr_list:
+                                                  pairs:
+                                                    - End:
+                                                        FunctionCall:
+                                                          prefix:
+                                                            Name:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 808
+                                                                  line: 35
+                                                                  character: 17
+                                                                end_position:
+                                                                  bytes: 815
+                                                                  line: 35
+                                                                  character: 24
+                                                                token_type:
+                                                                  type: Identifier
+                                                                  identifier: Raycast
+                                                              trailing_trivia: []
+                                                          suffixes:
+                                                            - Call:
+                                                                AnonymousCall:
+                                                                  Parentheses:
+                                                                    parentheses:
+                                                                      tokens:
+                                                                        - leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 815
+                                                                              line: 35
+                                                                              character: 24
+                                                                            end_position:
+                                                                              bytes: 816
+                                                                              line: 35
+                                                                              character: 25
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: (
+                                                                          trailing_trivia: []
+                                                                        - leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 899
+                                                                              line: 35
+                                                                              character: 108
+                                                                            end_position:
+                                                                              bytes: 900
+                                                                              line: 35
+                                                                              character: 109
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: )
+                                                                          trailing_trivia:
+                                                                            - start_position:
+                                                                                bytes: 900
+                                                                                line: 35
+                                                                                character: 109
+                                                                              end_position:
+                                                                                bytes: 901
+                                                                                line: 35
+                                                                                character: 109
+                                                                              token_type:
+                                                                                type: Whitespace
+                                                                                characters: "\n"
+                                                                    arguments:
+                                                                      pairs:
+                                                                        - Punctuated:
+                                                                            - FunctionCall:
+                                                                                prefix:
+                                                                                  Name:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 816
+                                                                                        line: 35
+                                                                                        character: 25
+                                                                                      end_position:
+                                                                                        bytes: 819
+                                                                                        line: 35
+                                                                                        character: 28
+                                                                                      token_type:
+                                                                                        type: Identifier
+                                                                                        identifier: Ray
+                                                                                    trailing_trivia: []
+                                                                                suffixes:
+                                                                                  - Index:
+                                                                                      Dot:
+                                                                                        dot:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 819
+                                                                                              line: 35
+                                                                                              character: 28
+                                                                                            end_position:
+                                                                                              bytes: 820
+                                                                                              line: 35
+                                                                                              character: 29
+                                                                                            token_type:
+                                                                                              type: Symbol
+                                                                                              symbol: "."
+                                                                                          trailing_trivia: []
+                                                                                        name:
+                                                                                          leading_trivia: []
+                                                                                          token:
+                                                                                            start_position:
+                                                                                              bytes: 820
+                                                                                              line: 35
+                                                                                              character: 29
+                                                                                            end_position:
+                                                                                              bytes: 823
+                                                                                              line: 35
+                                                                                              character: 32
+                                                                                            token_type:
+                                                                                              type: Identifier
+                                                                                              identifier: new
+                                                                                          trailing_trivia: []
+                                                                                  - Call:
+                                                                                      AnonymousCall:
+                                                                                        Parentheses:
+                                                                                          parentheses:
+                                                                                            tokens:
+                                                                                              - leading_trivia: []
+                                                                                                token:
+                                                                                                  start_position:
+                                                                                                    bytes: 823
+                                                                                                    line: 35
+                                                                                                    character: 32
+                                                                                                  end_position:
+                                                                                                    bytes: 824
+                                                                                                    line: 35
+                                                                                                    character: 33
+                                                                                                  token_type:
+                                                                                                    type: Symbol
+                                                                                                    symbol: (
+                                                                                                trailing_trivia: []
+                                                                                              - leading_trivia: []
+                                                                                                token:
+                                                                                                  start_position:
+                                                                                                    bytes: 887
+                                                                                                    line: 35
+                                                                                                    character: 96
+                                                                                                  end_position:
+                                                                                                    bytes: 888
+                                                                                                    line: 35
+                                                                                                    character: 97
+                                                                                                  token_type:
+                                                                                                    type: Symbol
+                                                                                                    symbol: )
+                                                                                                trailing_trivia: []
+                                                                                          arguments:
+                                                                                            pairs:
+                                                                                              - Punctuated:
+                                                                                                  - Var:
+                                                                                                      Name:
+                                                                                                        leading_trivia: []
+                                                                                                        token:
+                                                                                                          start_position:
+                                                                                                            bytes: 824
+                                                                                                            line: 35
+                                                                                                            character: 33
+                                                                                                          end_position:
+                                                                                                            bytes: 830
+                                                                                                            line: 35
+                                                                                                            character: 39
+                                                                                                          token_type:
+                                                                                                            type: Identifier
+                                                                                                            identifier: origin
+                                                                                                        trailing_trivia: []
+                                                                                                  - leading_trivia: []
+                                                                                                    token:
+                                                                                                      start_position:
+                                                                                                        bytes: 830
+                                                                                                        line: 35
+                                                                                                        character: 39
+                                                                                                      end_position:
+                                                                                                        bytes: 831
+                                                                                                        line: 35
+                                                                                                        character: 40
+                                                                                                      token_type:
+                                                                                                        type: Symbol
+                                                                                                        symbol: ","
+                                                                                                    trailing_trivia:
+                                                                                                      - start_position:
+                                                                                                          bytes: 831
+                                                                                                          line: 35
+                                                                                                          character: 40
+                                                                                                        end_position:
+                                                                                                          bytes: 832
+                                                                                                          line: 35
+                                                                                                          character: 41
+                                                                                                        token_type:
+                                                                                                          type: Whitespace
+                                                                                                          characters: " "
+                                                                                              - End:
+                                                                                                  BinaryOperator:
+                                                                                                    lhs:
+                                                                                                      Var:
+                                                                                                        Expression:
+                                                                                                          prefix:
+                                                                                                            Expression:
+                                                                                                              Parentheses:
+                                                                                                                contained:
+                                                                                                                  tokens:
+                                                                                                                    - leading_trivia: []
+                                                                                                                      token:
+                                                                                                                        start_position:
+                                                                                                                          bytes: 832
+                                                                                                                          line: 35
+                                                                                                                          character: 41
+                                                                                                                        end_position:
+                                                                                                                          bytes: 833
+                                                                                                                          line: 35
+                                                                                                                          character: 42
+                                                                                                                        token_type:
+                                                                                                                          type: Symbol
+                                                                                                                          symbol: (
+                                                                                                                      trailing_trivia: []
+                                                                                                                    - leading_trivia: []
+                                                                                                                      token:
+                                                                                                                        start_position:
+                                                                                                                          bytes: 872
+                                                                                                                          line: 35
+                                                                                                                          character: 81
+                                                                                                                        end_position:
+                                                                                                                          bytes: 873
+                                                                                                                          line: 35
+                                                                                                                          character: 82
+                                                                                                                        token_type:
+                                                                                                                          type: Symbol
+                                                                                                                          symbol: )
+                                                                                                                      trailing_trivia: []
+                                                                                                                expression:
+                                                                                                                  BinaryOperator:
+                                                                                                                    lhs:
+                                                                                                                      Var:
+                                                                                                                        Name:
+                                                                                                                          leading_trivia: []
+                                                                                                                          token:
+                                                                                                                            start_position:
+                                                                                                                              bytes: 833
+                                                                                                                              line: 35
+                                                                                                                              character: 42
+                                                                                                                            end_position:
+                                                                                                                              bytes: 839
+                                                                                                                              line: 35
+                                                                                                                              character: 48
+                                                                                                                            token_type:
+                                                                                                                              type: Identifier
+                                                                                                                              identifier: origin
+                                                                                                                          trailing_trivia:
+                                                                                                                            - start_position:
+                                                                                                                                bytes: 839
+                                                                                                                                line: 35
+                                                                                                                                character: 48
+                                                                                                                              end_position:
+                                                                                                                                bytes: 840
+                                                                                                                                line: 35
+                                                                                                                                character: 49
+                                                                                                                              token_type:
+                                                                                                                                type: Whitespace
+                                                                                                                                characters: " "
+                                                                                                                    binop:
+                                                                                                                      Minus:
+                                                                                                                        leading_trivia: []
+                                                                                                                        token:
+                                                                                                                          start_position:
+                                                                                                                            bytes: 840
+                                                                                                                            line: 35
+                                                                                                                            character: 49
+                                                                                                                          end_position:
+                                                                                                                            bytes: 841
+                                                                                                                            line: 35
+                                                                                                                            character: 50
+                                                                                                                          token_type:
+                                                                                                                            type: Symbol
+                                                                                                                            symbol: "-"
+                                                                                                                        trailing_trivia:
+                                                                                                                          - start_position:
+                                                                                                                              bytes: 841
+                                                                                                                              line: 35
+                                                                                                                              character: 50
+                                                                                                                            end_position:
+                                                                                                                              bytes: 842
+                                                                                                                              line: 35
+                                                                                                                              character: 51
+                                                                                                                            token_type:
+                                                                                                                              type: Whitespace
+                                                                                                                              characters: " "
+                                                                                                                    rhs:
+                                                                                                                      Var:
+                                                                                                                        Expression:
+                                                                                                                          prefix:
+                                                                                                                            Name:
+                                                                                                                              leading_trivia: []
+                                                                                                                              token:
+                                                                                                                                start_position:
+                                                                                                                                  bytes: 842
+                                                                                                                                  line: 35
+                                                                                                                                  character: 51
+                                                                                                                                end_position:
+                                                                                                                                  bytes: 851
+                                                                                                                                  line: 35
+                                                                                                                                  character: 60
+                                                                                                                                token_type:
+                                                                                                                                  type: Identifier
+                                                                                                                                  identifier: character
+                                                                                                                              trailing_trivia: []
+                                                                                                                          suffixes:
+                                                                                                                            - Index:
+                                                                                                                                Dot:
+                                                                                                                                  dot:
+                                                                                                                                    leading_trivia: []
+                                                                                                                                    token:
+                                                                                                                                      start_position:
+                                                                                                                                        bytes: 851
+                                                                                                                                        line: 35
+                                                                                                                                        character: 60
+                                                                                                                                      end_position:
+                                                                                                                                        bytes: 852
+                                                                                                                                        line: 35
+                                                                                                                                        character: 61
+                                                                                                                                      token_type:
+                                                                                                                                        type: Symbol
+                                                                                                                                        symbol: "."
+                                                                                                                                    trailing_trivia: []
+                                                                                                                                  name:
+                                                                                                                                    leading_trivia: []
+                                                                                                                                    token:
+                                                                                                                                      start_position:
+                                                                                                                                        bytes: 852
+                                                                                                                                        line: 35
+                                                                                                                                        character: 61
+                                                                                                                                      end_position:
+                                                                                                                                        bytes: 863
+                                                                                                                                        line: 35
+                                                                                                                                        character: 72
+                                                                                                                                      token_type:
+                                                                                                                                        type: Identifier
+                                                                                                                                        identifier: PrimaryPart
+                                                                                                                                    trailing_trivia: []
+                                                                                                                            - Index:
+                                                                                                                                Dot:
+                                                                                                                                  dot:
+                                                                                                                                    leading_trivia: []
+                                                                                                                                    token:
+                                                                                                                                      start_position:
+                                                                                                                                        bytes: 863
+                                                                                                                                        line: 35
+                                                                                                                                        character: 72
+                                                                                                                                      end_position:
+                                                                                                                                        bytes: 864
+                                                                                                                                        line: 35
+                                                                                                                                        character: 73
+                                                                                                                                      token_type:
+                                                                                                                                        type: Symbol
+                                                                                                                                        symbol: "."
+                                                                                                                                    trailing_trivia: []
+                                                                                                                                  name:
+                                                                                                                                    leading_trivia: []
+                                                                                                                                    token:
+                                                                                                                                      start_position:
+                                                                                                                                        bytes: 864
+                                                                                                                                        line: 35
+                                                                                                                                        character: 73
+                                                                                                                                      end_position:
+                                                                                                                                        bytes: 872
+                                                                                                                                        line: 35
+                                                                                                                                        character: 81
+                                                                                                                                      token_type:
+                                                                                                                                        type: Identifier
+                                                                                                                                        identifier: Position
+                                                                                                                                    trailing_trivia: []
+                                                                                                          suffixes:
+                                                                                                            - Index:
+                                                                                                                Dot:
+                                                                                                                  dot:
+                                                                                                                    leading_trivia: []
+                                                                                                                    token:
+                                                                                                                      start_position:
+                                                                                                                        bytes: 873
+                                                                                                                        line: 35
+                                                                                                                        character: 82
+                                                                                                                      end_position:
+                                                                                                                        bytes: 874
+                                                                                                                        line: 35
+                                                                                                                        character: 83
+                                                                                                                      token_type:
+                                                                                                                        type: Symbol
+                                                                                                                        symbol: "."
+                                                                                                                    trailing_trivia: []
+                                                                                                                  name:
+                                                                                                                    leading_trivia: []
+                                                                                                                    token:
+                                                                                                                      start_position:
+                                                                                                                        bytes: 874
+                                                                                                                        line: 35
+                                                                                                                        character: 83
+                                                                                                                      end_position:
+                                                                                                                        bytes: 878
+                                                                                                                        line: 35
+                                                                                                                        character: 87
+                                                                                                                      token_type:
+                                                                                                                        type: Identifier
+                                                                                                                        identifier: Unit
+                                                                                                                    trailing_trivia:
+                                                                                                                      - start_position:
+                                                                                                                          bytes: 878
+                                                                                                                          line: 35
+                                                                                                                          character: 87
+                                                                                                                        end_position:
+                                                                                                                          bytes: 879
+                                                                                                                          line: 35
+                                                                                                                          character: 88
+                                                                                                                        token_type:
+                                                                                                                          type: Whitespace
+                                                                                                                          characters: " "
+                                                                                                    binop:
+                                                                                                      Star:
+                                                                                                        leading_trivia: []
+                                                                                                        token:
+                                                                                                          start_position:
+                                                                                                            bytes: 879
+                                                                                                            line: 35
+                                                                                                            character: 88
+                                                                                                          end_position:
+                                                                                                            bytes: 880
+                                                                                                            line: 35
+                                                                                                            character: 89
+                                                                                                          token_type:
+                                                                                                            type: Symbol
+                                                                                                            symbol: "*"
+                                                                                                        trailing_trivia:
+                                                                                                          - start_position:
+                                                                                                              bytes: 880
+                                                                                                              line: 35
+                                                                                                              character: 89
+                                                                                                            end_position:
+                                                                                                              bytes: 881
+                                                                                                              line: 35
+                                                                                                              character: 90
+                                                                                                            token_type:
+                                                                                                              type: Whitespace
+                                                                                                              characters: " "
+                                                                                                    rhs:
+                                                                                                      UnaryOperator:
+                                                                                                        unop:
+                                                                                                          Minus:
+                                                                                                            leading_trivia: []
+                                                                                                            token:
+                                                                                                              start_position:
+                                                                                                                bytes: 881
+                                                                                                                line: 35
+                                                                                                                character: 90
+                                                                                                              end_position:
+                                                                                                                bytes: 882
+                                                                                                                line: 35
+                                                                                                                character: 91
+                                                                                                              token_type:
+                                                                                                                type: Symbol
+                                                                                                                symbol: "-"
+                                                                                                            trailing_trivia: []
+                                                                                                        expression:
+                                                                                                          Var:
+                                                                                                            Name:
+                                                                                                              leading_trivia: []
+                                                                                                              token:
+                                                                                                                start_position:
+                                                                                                                  bytes: 882
+                                                                                                                  line: 35
+                                                                                                                  character: 91
+                                                                                                                end_position:
+                                                                                                                  bytes: 887
+                                                                                                                  line: 35
+                                                                                                                  character: 96
+                                                                                                                token_type:
+                                                                                                                  type: Identifier
+                                                                                                                  identifier: range
+                                                                                                              trailing_trivia: []
+                                                                            - leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 888
+                                                                                  line: 35
+                                                                                  character: 97
+                                                                                end_position:
+                                                                                  bytes: 889
+                                                                                  line: 35
+                                                                                  character: 98
+                                                                                token_type:
+                                                                                  type: Symbol
+                                                                                  symbol: ","
+                                                                              trailing_trivia:
+                                                                                - start_position:
+                                                                                    bytes: 889
+                                                                                    line: 35
+                                                                                    character: 98
+                                                                                  end_position:
+                                                                                    bytes: 890
+                                                                                    line: 35
+                                                                                    character: 99
+                                                                                  token_type:
+                                                                                    type: Whitespace
+                                                                                    characters: " "
+                                                                        - End:
+                                                                            Var:
+                                                                              Name:
+                                                                                leading_trivia: []
+                                                                                token:
+                                                                                  start_position:
+                                                                                    bytes: 890
+                                                                                    line: 35
+                                                                                    character: 99
+                                                                                  end_position:
+                                                                                    bytes: 899
+                                                                                    line: 35
+                                                                                    character: 108
+                                                                                  token_type:
+                                                                                    type: Identifier
+                                                                                    identifier: blacklist
+                                                                                trailing_trivia: []
+                                            - ~
+                                          - - If:
+                                                if_token:
+                                                  leading_trivia:
+                                                    - start_position:
+                                                        bytes: 901
+                                                        line: 36
+                                                        character: 1
+                                                      end_position:
+                                                        bytes: 902
+                                                        line: 36
+                                                        character: 1
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\n"
+                                                    - start_position:
+                                                        bytes: 902
+                                                        line: 37
+                                                        character: 1
+                                                      end_position:
+                                                        bytes: 905
+                                                        line: 37
+                                                        character: 4
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\t\t\t"
+                                                  token:
+                                                    start_position:
+                                                      bytes: 905
+                                                      line: 37
+                                                      character: 4
+                                                    end_position:
+                                                      bytes: 907
+                                                      line: 37
+                                                      character: 6
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: if
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 907
+                                                        line: 37
+                                                        character: 6
+                                                      end_position:
+                                                        bytes: 908
+                                                        line: 37
+                                                        character: 7
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: " "
+                                                condition:
+                                                  BinaryOperator:
+                                                    lhs:
+                                                      Var:
+                                                        Name:
+                                                          leading_trivia: []
+                                                          token:
+                                                            start_position:
+                                                              bytes: 908
+                                                              line: 37
+                                                              character: 7
+                                                            end_position:
+                                                              bytes: 911
+                                                              line: 37
+                                                              character: 10
+                                                            token_type:
+                                                              type: Identifier
+                                                              identifier: hit
+                                                          trailing_trivia:
+                                                            - start_position:
+                                                                bytes: 911
+                                                                line: 37
+                                                                character: 10
+                                                              end_position:
+                                                                bytes: 912
+                                                                line: 37
+                                                                character: 11
+                                                              token_type:
+                                                                type: Whitespace
+                                                                characters: " "
+                                                    binop:
+                                                      And:
+                                                        leading_trivia: []
+                                                        token:
+                                                          start_position:
+                                                            bytes: 912
+                                                            line: 37
+                                                            character: 11
+                                                          end_position:
+                                                            bytes: 915
+                                                            line: 37
+                                                            character: 14
+                                                          token_type:
+                                                            type: Symbol
+                                                            symbol: and
+                                                        trailing_trivia:
+                                                          - start_position:
+                                                              bytes: 915
+                                                              line: 37
+                                                              character: 14
+                                                            end_position:
+                                                              bytes: 916
+                                                              line: 37
+                                                              character: 15
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: " "
+                                                    rhs:
+                                                      FunctionCall:
+                                                        prefix:
+                                                          Name:
+                                                            leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 916
+                                                                line: 37
+                                                                character: 15
+                                                              end_position:
+                                                                bytes: 919
+                                                                line: 37
+                                                                character: 18
+                                                              token_type:
+                                                                type: Identifier
+                                                                identifier: hit
+                                                            trailing_trivia: []
+                                                        suffixes:
+                                                          - Call:
+                                                              MethodCall:
+                                                                colon_token:
+                                                                  leading_trivia: []
+                                                                  token:
+                                                                    start_position:
+                                                                      bytes: 919
+                                                                      line: 37
+                                                                      character: 18
+                                                                    end_position:
+                                                                      bytes: 920
+                                                                      line: 37
+                                                                      character: 19
+                                                                    token_type:
+                                                                      type: Symbol
+                                                                      symbol: ":"
+                                                                  trailing_trivia: []
+                                                                name:
+                                                                  leading_trivia: []
+                                                                  token:
+                                                                    start_position:
+                                                                      bytes: 920
+                                                                      line: 37
+                                                                      character: 19
+                                                                    end_position:
+                                                                      bytes: 934
+                                                                      line: 37
+                                                                      character: 33
+                                                                    token_type:
+                                                                      type: Identifier
+                                                                      identifier: IsDescendantOf
+                                                                  trailing_trivia: []
+                                                                args:
+                                                                  Parentheses:
+                                                                    parentheses:
+                                                                      tokens:
+                                                                        - leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 934
+                                                                              line: 37
+                                                                              character: 33
+                                                                            end_position:
+                                                                              bytes: 935
+                                                                              line: 37
+                                                                              character: 34
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: (
+                                                                          trailing_trivia: []
+                                                                        - leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 944
+                                                                              line: 37
+                                                                              character: 43
+                                                                            end_position:
+                                                                              bytes: 945
+                                                                              line: 37
+                                                                              character: 44
+                                                                            token_type:
+                                                                              type: Symbol
+                                                                              symbol: )
+                                                                          trailing_trivia:
+                                                                            - start_position:
+                                                                                bytes: 945
+                                                                                line: 37
+                                                                                character: 44
+                                                                              end_position:
+                                                                                bytes: 946
+                                                                                line: 37
+                                                                                character: 45
+                                                                              token_type:
+                                                                                type: Whitespace
+                                                                                characters: " "
+                                                                    arguments:
+                                                                      pairs:
+                                                                        - End:
+                                                                            Var:
+                                                                              Name:
+                                                                                leading_trivia: []
+                                                                                token:
+                                                                                  start_position:
+                                                                                    bytes: 935
+                                                                                    line: 37
+                                                                                    character: 34
+                                                                                  end_position:
+                                                                                    bytes: 944
+                                                                                    line: 37
+                                                                                    character: 43
+                                                                                  token_type:
+                                                                                    type: Identifier
+                                                                                    identifier: character
+                                                                                trailing_trivia: []
+                                                then_token:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 946
+                                                      line: 37
+                                                      character: 45
+                                                    end_position:
+                                                      bytes: 950
+                                                      line: 37
+                                                      character: 49
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: then
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 950
+                                                        line: 37
+                                                        character: 49
+                                                      end_position:
+                                                        bytes: 951
+                                                        line: 37
+                                                        character: 49
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\n"
+                                                block:
+                                                  stmts: []
+                                                  last_stmt:
+                                                    - Break:
+                                                        leading_trivia:
+                                                          - start_position:
+                                                              bytes: 951
+                                                              line: 38
+                                                              character: 1
+                                                            end_position:
+                                                              bytes: 955
+                                                              line: 38
+                                                              character: 5
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: "\t\t\t\t"
+                                                        token:
+                                                          start_position:
+                                                            bytes: 955
+                                                            line: 38
+                                                            character: 5
+                                                          end_position:
+                                                            bytes: 960
+                                                            line: 38
+                                                            character: 10
+                                                          token_type:
+                                                            type: Symbol
+                                                            symbol: break
+                                                        trailing_trivia:
+                                                          - start_position:
+                                                              bytes: 960
+                                                              line: 38
+                                                              character: 10
+                                                            end_position:
+                                                              bytes: 961
+                                                              line: 38
+                                                              character: 10
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: "\n"
+                                                    - ~
+                                                else_if:
+                                                  - else_if_token:
+                                                      leading_trivia:
+                                                        - start_position:
+                                                            bytes: 961
+                                                            line: 39
+                                                            character: 1
+                                                          end_position:
+                                                            bytes: 964
+                                                            line: 39
+                                                            character: 4
+                                                          token_type:
+                                                            type: Whitespace
+                                                            characters: "\t\t\t"
+                                                      token:
+                                                        start_position:
+                                                          bytes: 964
+                                                          line: 39
+                                                          character: 4
+                                                        end_position:
+                                                          bytes: 970
+                                                          line: 39
+                                                          character: 10
+                                                        token_type:
+                                                          type: Symbol
+                                                          symbol: elseif
+                                                      trailing_trivia:
+                                                        - start_position:
+                                                            bytes: 970
+                                                            line: 39
+                                                            character: 10
+                                                          end_position:
+                                                            bytes: 971
+                                                            line: 39
+                                                            character: 11
+                                                          token_type:
+                                                            type: Whitespace
+                                                            characters: " "
+                                                    condition:
+                                                      BinaryOperator:
+                                                        lhs:
+                                                          Var:
+                                                            Name:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 971
+                                                                  line: 39
+                                                                  character: 11
+                                                                end_position:
+                                                                  bytes: 974
+                                                                  line: 39
+                                                                  character: 14
+                                                                token_type:
+                                                                  type: Identifier
+                                                                  identifier: hit
+                                                              trailing_trivia:
+                                                                - start_position:
+                                                                    bytes: 974
+                                                                    line: 39
+                                                                    character: 14
+                                                                  end_position:
+                                                                    bytes: 975
+                                                                    line: 39
+                                                                    character: 15
+                                                                  token_type:
+                                                                    type: Whitespace
+                                                                    characters: " "
+                                                        binop:
+                                                          And:
+                                                            leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 975
+                                                                line: 39
+                                                                character: 15
+                                                              end_position:
+                                                                bytes: 978
+                                                                line: 39
+                                                                character: 18
+                                                              token_type:
+                                                                type: Symbol
+                                                                symbol: and
+                                                            trailing_trivia:
+                                                              - start_position:
+                                                                  bytes: 978
+                                                                  line: 39
+                                                                  character: 18
+                                                                end_position:
+                                                                  bytes: 979
+                                                                  line: 39
+                                                                  character: 19
+                                                                token_type:
+                                                                  type: Whitespace
+                                                                  characters: " "
+                                                        rhs:
+                                                          FunctionCall:
+                                                            prefix:
+                                                              Name:
+                                                                leading_trivia: []
+                                                                token:
+                                                                  start_position:
+                                                                    bytes: 979
+                                                                    line: 39
+                                                                    character: 19
+                                                                  end_position:
+                                                                    bytes: 987
+                                                                    line: 39
+                                                                    character: 27
+                                                                  token_type:
+                                                                    type: Identifier
+                                                                    identifier: ignoreIf
+                                                                trailing_trivia: []
+                                                            suffixes:
+                                                              - Call:
+                                                                  AnonymousCall:
+                                                                    Parentheses:
+                                                                      parentheses:
+                                                                        tokens:
+                                                                          - leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 987
+                                                                                line: 39
+                                                                                character: 27
+                                                                              end_position:
+                                                                                bytes: 988
+                                                                                line: 39
+                                                                                character: 28
+                                                                              token_type:
+                                                                                type: Symbol
+                                                                                symbol: (
+                                                                            trailing_trivia: []
+                                                                          - leading_trivia: []
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 991
+                                                                                line: 39
+                                                                                character: 31
+                                                                              end_position:
+                                                                                bytes: 992
+                                                                                line: 39
+                                                                                character: 32
+                                                                              token_type:
+                                                                                type: Symbol
+                                                                                symbol: )
+                                                                            trailing_trivia:
+                                                                              - start_position:
+                                                                                  bytes: 992
+                                                                                  line: 39
+                                                                                  character: 32
+                                                                                end_position:
+                                                                                  bytes: 993
+                                                                                  line: 39
+                                                                                  character: 33
+                                                                                token_type:
+                                                                                  type: Whitespace
+                                                                                  characters: " "
+                                                                      arguments:
+                                                                        pairs:
+                                                                          - End:
+                                                                              Var:
+                                                                                Name:
+                                                                                  leading_trivia: []
+                                                                                  token:
+                                                                                    start_position:
+                                                                                      bytes: 988
+                                                                                      line: 39
+                                                                                      character: 28
+                                                                                    end_position:
+                                                                                      bytes: 991
+                                                                                      line: 39
+                                                                                      character: 31
+                                                                                    token_type:
+                                                                                      type: Identifier
+                                                                                      identifier: hit
+                                                                                  trailing_trivia: []
+                                                    then_token:
+                                                      leading_trivia: []
+                                                      token:
+                                                        start_position:
+                                                          bytes: 993
+                                                          line: 39
+                                                          character: 33
+                                                        end_position:
+                                                          bytes: 997
+                                                          line: 39
+                                                          character: 37
+                                                        token_type:
+                                                          type: Symbol
+                                                          symbol: then
+                                                      trailing_trivia:
+                                                        - start_position:
+                                                            bytes: 997
+                                                            line: 39
+                                                            character: 37
+                                                          end_position:
+                                                            bytes: 998
+                                                            line: 39
+                                                            character: 37
+                                                          token_type:
+                                                            type: Whitespace
+                                                            characters: "\n"
+                                                    block:
+                                                      stmts:
+                                                        - - FunctionCall:
+                                                              prefix:
+                                                                Name:
+                                                                  leading_trivia:
+                                                                    - start_position:
+                                                                        bytes: 998
+                                                                        line: 40
+                                                                        character: 1
+                                                                      end_position:
+                                                                        bytes: 1002
+                                                                        line: 40
+                                                                        character: 5
+                                                                      token_type:
+                                                                        type: Whitespace
+                                                                        characters: "\t\t\t\t"
+                                                                  token:
+                                                                    start_position:
+                                                                      bytes: 1002
+                                                                      line: 40
+                                                                      character: 5
+                                                                    end_position:
+                                                                      bytes: 1007
+                                                                      line: 40
+                                                                      character: 10
+                                                                    token_type:
+                                                                      type: Identifier
+                                                                      identifier: debug
+                                                                  trailing_trivia: []
+                                                              suffixes:
+                                                                - Call:
+                                                                    AnonymousCall:
+                                                                      Parentheses:
+                                                                        parentheses:
+                                                                          tokens:
+                                                                            - leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 1007
+                                                                                  line: 40
+                                                                                  character: 10
+                                                                                end_position:
+                                                                                  bytes: 1008
+                                                                                  line: 40
+                                                                                  character: 11
+                                                                                token_type:
+                                                                                  type: Symbol
+                                                                                  symbol: (
+                                                                              trailing_trivia: []
+                                                                            - leading_trivia: []
+                                                                              token:
+                                                                                start_position:
+                                                                                  bytes: 1044
+                                                                                  line: 40
+                                                                                  character: 47
+                                                                                end_position:
+                                                                                  bytes: 1045
+                                                                                  line: 40
+                                                                                  character: 48
+                                                                                token_type:
+                                                                                  type: Symbol
+                                                                                  symbol: )
+                                                                              trailing_trivia:
+                                                                                - start_position:
+                                                                                    bytes: 1045
+                                                                                    line: 40
+                                                                                    character: 48
+                                                                                  end_position:
+                                                                                    bytes: 1046
+                                                                                    line: 40
+                                                                                    character: 48
+                                                                                  token_type:
+                                                                                    type: Whitespace
+                                                                                    characters: "\n"
+                                                                        arguments:
+                                                                          pairs:
+                                                                            - Punctuated:
+                                                                                - String:
+                                                                                    leading_trivia: []
+                                                                                    token:
+                                                                                      start_position:
+                                                                                        bytes: 1008
+                                                                                        line: 40
+                                                                                        character: 11
+                                                                                      end_position:
+                                                                                        bytes: 1025
+                                                                                        line: 40
+                                                                                        character: 28
+                                                                                      token_type:
+                                                                                        type: StringLiteral
+                                                                                        literal: IGNORING OFF IF
+                                                                                        quote_type: Double
+                                                                                    trailing_trivia: []
+                                                                                - leading_trivia: []
+                                                                                  token:
+                                                                                    start_position:
+                                                                                      bytes: 1025
+                                                                                      line: 40
+                                                                                      character: 28
+                                                                                    end_position:
+                                                                                      bytes: 1026
+                                                                                      line: 40
+                                                                                      character: 29
+                                                                                    token_type:
+                                                                                      type: Symbol
+                                                                                      symbol: ","
+                                                                                  trailing_trivia:
+                                                                                    - start_position:
+                                                                                        bytes: 1026
+                                                                                        line: 40
+                                                                                        character: 29
+                                                                                      end_position:
+                                                                                        bytes: 1027
+                                                                                        line: 40
+                                                                                        character: 30
+                                                                                      token_type:
+                                                                                        type: Whitespace
+                                                                                        characters: " "
+                                                                            - End:
+                                                                                FunctionCall:
+                                                                                  prefix:
+                                                                                    Name:
+                                                                                      leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 1027
+                                                                                          line: 40
+                                                                                          character: 30
+                                                                                        end_position:
+                                                                                          bytes: 1030
+                                                                                          line: 40
+                                                                                          character: 33
+                                                                                        token_type:
+                                                                                          type: Identifier
+                                                                                          identifier: hit
+                                                                                      trailing_trivia: []
+                                                                                  suffixes:
+                                                                                    - Call:
+                                                                                        MethodCall:
+                                                                                          colon_token:
+                                                                                            leading_trivia: []
+                                                                                            token:
+                                                                                              start_position:
+                                                                                                bytes: 1030
+                                                                                                line: 40
+                                                                                                character: 33
+                                                                                              end_position:
+                                                                                                bytes: 1031
+                                                                                                line: 40
+                                                                                                character: 34
+                                                                                              token_type:
+                                                                                                type: Symbol
+                                                                                                symbol: ":"
+                                                                                            trailing_trivia: []
+                                                                                          name:
+                                                                                            leading_trivia: []
+                                                                                            token:
+                                                                                              start_position:
+                                                                                                bytes: 1031
+                                                                                                line: 40
+                                                                                                character: 34
+                                                                                              end_position:
+                                                                                                bytes: 1042
+                                                                                                line: 40
+                                                                                                character: 45
+                                                                                              token_type:
+                                                                                                type: Identifier
+                                                                                                identifier: GetFullName
+                                                                                            trailing_trivia: []
+                                                                                          args:
+                                                                                            Parentheses:
+                                                                                              parentheses:
+                                                                                                tokens:
+                                                                                                  - leading_trivia: []
+                                                                                                    token:
+                                                                                                      start_position:
+                                                                                                        bytes: 1042
+                                                                                                        line: 40
+                                                                                                        character: 45
+                                                                                                      end_position:
+                                                                                                        bytes: 1043
+                                                                                                        line: 40
+                                                                                                        character: 46
+                                                                                                      token_type:
+                                                                                                        type: Symbol
+                                                                                                        symbol: (
+                                                                                                    trailing_trivia: []
+                                                                                                  - leading_trivia: []
+                                                                                                    token:
+                                                                                                      start_position:
+                                                                                                        bytes: 1043
+                                                                                                        line: 40
+                                                                                                        character: 46
+                                                                                                      end_position:
+                                                                                                        bytes: 1044
+                                                                                                        line: 40
+                                                                                                        character: 47
+                                                                                                      token_type:
+                                                                                                        type: Symbol
+                                                                                                        symbol: )
+                                                                                                    trailing_trivia: []
+                                                                                              arguments:
+                                                                                                pairs: []
+                                                          - ~
+                                                        - - Assignment:
+                                                              var_list:
+                                                                pairs:
+                                                                  - End:
+                                                                      Expression:
+                                                                        prefix:
+                                                                          Name:
+                                                                            leading_trivia:
+                                                                              - start_position:
+                                                                                  bytes: 1046
+                                                                                  line: 41
+                                                                                  character: 1
+                                                                                end_position:
+                                                                                  bytes: 1050
+                                                                                  line: 41
+                                                                                  character: 5
+                                                                                token_type:
+                                                                                  type: Whitespace
+                                                                                  characters: "\t\t\t\t"
+                                                                            token:
+                                                                              start_position:
+                                                                                bytes: 1050
+                                                                                line: 41
+                                                                                character: 5
+                                                                              end_position:
+                                                                                bytes: 1059
+                                                                                line: 41
+                                                                                character: 14
+                                                                              token_type:
+                                                                                type: Identifier
+                                                                                identifier: blacklist
+                                                                            trailing_trivia: []
+                                                                        suffixes:
+                                                                          - Index:
+                                                                              Brackets:
+                                                                                brackets:
+                                                                                  tokens:
+                                                                                    - leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 1059
+                                                                                          line: 41
+                                                                                          character: 14
+                                                                                        end_position:
+                                                                                          bytes: 1060
+                                                                                          line: 41
+                                                                                          character: 15
+                                                                                        token_type:
+                                                                                          type: Symbol
+                                                                                          symbol: "["
+                                                                                      trailing_trivia: []
+                                                                                    - leading_trivia: []
+                                                                                      token:
+                                                                                        start_position:
+                                                                                          bytes: 1074
+                                                                                          line: 41
+                                                                                          character: 29
+                                                                                        end_position:
+                                                                                          bytes: 1075
+                                                                                          line: 41
+                                                                                          character: 30
+                                                                                        token_type:
+                                                                                          type: Symbol
+                                                                                          symbol: "]"
+                                                                                      trailing_trivia:
+                                                                                        - start_position:
+                                                                                            bytes: 1075
+                                                                                            line: 41
+                                                                                            character: 30
+                                                                                          end_position:
+                                                                                            bytes: 1076
+                                                                                            line: 41
+                                                                                            character: 31
+                                                                                          token_type:
+                                                                                            type: Whitespace
+                                                                                            characters: " "
+                                                                                expression:
+                                                                                  BinaryOperator:
+                                                                                    lhs:
+                                                                                      UnaryOperator:
+                                                                                        unop:
+                                                                                          Hash:
+                                                                                            leading_trivia: []
+                                                                                            token:
+                                                                                              start_position:
+                                                                                                bytes: 1060
+                                                                                                line: 41
+                                                                                                character: 15
+                                                                                              end_position:
+                                                                                                bytes: 1061
+                                                                                                line: 41
+                                                                                                character: 16
+                                                                                              token_type:
+                                                                                                type: Symbol
+                                                                                                symbol: "#"
+                                                                                            trailing_trivia: []
+                                                                                        expression:
+                                                                                          Var:
+                                                                                            Name:
+                                                                                              leading_trivia: []
+                                                                                              token:
+                                                                                                start_position:
+                                                                                                  bytes: 1061
+                                                                                                  line: 41
+                                                                                                  character: 16
+                                                                                                end_position:
+                                                                                                  bytes: 1070
+                                                                                                  line: 41
+                                                                                                  character: 25
+                                                                                                token_type:
+                                                                                                  type: Identifier
+                                                                                                  identifier: blacklist
+                                                                                              trailing_trivia:
+                                                                                                - start_position:
+                                                                                                    bytes: 1070
+                                                                                                    line: 41
+                                                                                                    character: 25
+                                                                                                  end_position:
+                                                                                                    bytes: 1071
+                                                                                                    line: 41
+                                                                                                    character: 26
+                                                                                                  token_type:
+                                                                                                    type: Whitespace
+                                                                                                    characters: " "
+                                                                                    binop:
+                                                                                      Plus:
+                                                                                        leading_trivia: []
+                                                                                        token:
+                                                                                          start_position:
+                                                                                            bytes: 1071
+                                                                                            line: 41
+                                                                                            character: 26
+                                                                                          end_position:
+                                                                                            bytes: 1072
+                                                                                            line: 41
+                                                                                            character: 27
+                                                                                          token_type:
+                                                                                            type: Symbol
+                                                                                            symbol: +
+                                                                                        trailing_trivia:
+                                                                                          - start_position:
+                                                                                              bytes: 1072
+                                                                                              line: 41
+                                                                                              character: 27
+                                                                                            end_position:
+                                                                                              bytes: 1073
+                                                                                              line: 41
+                                                                                              character: 28
+                                                                                            token_type:
+                                                                                              type: Whitespace
+                                                                                              characters: " "
+                                                                                    rhs:
+                                                                                      Number:
+                                                                                        leading_trivia: []
+                                                                                        token:
+                                                                                          start_position:
+                                                                                            bytes: 1073
+                                                                                            line: 41
+                                                                                            character: 28
+                                                                                          end_position:
+                                                                                            bytes: 1074
+                                                                                            line: 41
+                                                                                            character: 29
+                                                                                          token_type:
+                                                                                            type: Number
+                                                                                            text: "1"
+                                                                                        trailing_trivia: []
+                                                              equal_token:
+                                                                leading_trivia: []
+                                                                token:
+                                                                  start_position:
+                                                                    bytes: 1076
+                                                                    line: 41
+                                                                    character: 31
+                                                                  end_position:
+                                                                    bytes: 1077
+                                                                    line: 41
+                                                                    character: 32
+                                                                  token_type:
+                                                                    type: Symbol
+                                                                    symbol: "="
+                                                                trailing_trivia:
+                                                                  - start_position:
+                                                                      bytes: 1077
+                                                                      line: 41
+                                                                      character: 32
+                                                                    end_position:
+                                                                      bytes: 1078
+                                                                      line: 41
+                                                                      character: 33
+                                                                    token_type:
+                                                                      type: Whitespace
+                                                                      characters: " "
+                                                              expr_list:
+                                                                pairs:
+                                                                  - End:
+                                                                      Var:
+                                                                        Name:
+                                                                          leading_trivia: []
+                                                                          token:
+                                                                            start_position:
+                                                                              bytes: 1078
+                                                                              line: 41
+                                                                              character: 33
+                                                                            end_position:
+                                                                              bytes: 1081
+                                                                              line: 41
+                                                                              character: 36
+                                                                            token_type:
+                                                                              type: Identifier
+                                                                              identifier: hit
+                                                                          trailing_trivia:
+                                                                            - start_position:
+                                                                                bytes: 1081
+                                                                                line: 41
+                                                                                character: 36
+                                                                              end_position:
+                                                                                bytes: 1082
+                                                                                line: 41
+                                                                                character: 36
+                                                                              token_type:
+                                                                                type: Whitespace
+                                                                                characters: "\n"
+                                                          - ~
+                                                else_token:
+                                                  leading_trivia:
+                                                    - start_position:
+                                                        bytes: 1082
+                                                        line: 42
+                                                        character: 1
+                                                      end_position:
+                                                        bytes: 1085
+                                                        line: 42
+                                                        character: 4
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\t\t\t"
+                                                  token:
+                                                    start_position:
+                                                      bytes: 1085
+                                                      line: 42
+                                                      character: 4
+                                                    end_position:
+                                                      bytes: 1089
+                                                      line: 42
+                                                      character: 8
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: else
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 1089
+                                                        line: 42
+                                                        character: 8
+                                                      end_position:
+                                                        bytes: 1090
+                                                        line: 42
+                                                        character: 8
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\n"
+                                                else:
+                                                  stmts: []
+                                                  last_stmt:
+                                                    - Break:
+                                                        leading_trivia:
+                                                          - start_position:
+                                                              bytes: 1090
+                                                              line: 43
+                                                              character: 1
+                                                            end_position:
+                                                              bytes: 1094
+                                                              line: 43
+                                                              character: 5
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: "\t\t\t\t"
+                                                        token:
+                                                          start_position:
+                                                            bytes: 1094
+                                                            line: 43
+                                                            character: 5
+                                                          end_position:
+                                                            bytes: 1099
+                                                            line: 43
+                                                            character: 10
+                                                          token_type:
+                                                            type: Symbol
+                                                            symbol: break
+                                                        trailing_trivia:
+                                                          - start_position:
+                                                              bytes: 1099
+                                                              line: 43
+                                                              character: 10
+                                                            end_position:
+                                                              bytes: 1100
+                                                              line: 43
+                                                              character: 10
+                                                            token_type:
+                                                              type: Whitespace
+                                                              characters: "\n"
+                                                    - ~
+                                                end_token:
+                                                  leading_trivia:
+                                                    - start_position:
+                                                        bytes: 1100
+                                                        line: 44
+                                                        character: 1
+                                                      end_position:
+                                                        bytes: 1103
+                                                        line: 44
+                                                        character: 4
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\t\t\t"
+                                                  token:
+                                                    start_position:
+                                                      bytes: 1103
+                                                      line: 44
+                                                      character: 4
+                                                    end_position:
+                                                      bytes: 1106
+                                                      line: 44
+                                                      character: 7
+                                                    token_type:
+                                                      type: Symbol
+                                                      symbol: end
+                                                  trailing_trivia:
+                                                    - start_position:
+                                                        bytes: 1106
+                                                        line: 44
+                                                        character: 7
+                                                      end_position:
+                                                        bytes: 1107
+                                                        line: 44
+                                                        character: 7
+                                                      token_type:
+                                                        type: Whitespace
+                                                        characters: "\n"
+                                            - ~
+                                      end_token:
+                                        leading_trivia:
+                                          - start_position:
+                                              bytes: 1107
+                                              line: 45
+                                              character: 1
+                                            end_position:
+                                              bytes: 1109
+                                              line: 45
+                                              character: 3
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\t\t"
+                                        token:
+                                          start_position:
+                                            bytes: 1109
+                                            line: 45
+                                            character: 3
+                                          end_position:
+                                            bytes: 1112
+                                            line: 45
+                                            character: 6
+                                          token_type:
+                                            type: Symbol
+                                            symbol: end
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 1112
+                                              line: 45
+                                              character: 6
+                                            end_position:
+                                              bytes: 1113
+                                              line: 45
+                                              character: 6
+                                            token_type:
+                                              type: Whitespace
+                                              characters: "\n"
+                                  - ~
+                            end_token:
+                              leading_trivia:
+                                - start_position:
+                                    bytes: 1113
+                                    line: 46
+                                    character: 1
+                                  end_position:
+                                    bytes: 1114
+                                    line: 46
+                                    character: 2
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\t"
+                              token:
+                                start_position:
+                                  bytes: 1114
+                                  line: 46
+                                  character: 2
+                                end_position:
+                                  bytes: 1117
+                                  line: 46
+                                  character: 5
+                                token_type:
+                                  type: Symbol
+                                  symbol: end
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 1117
+                                    line: 46
+                                    character: 5
+                                  end_position:
+                                    bytes: 1118
+                                    line: 46
+                                    character: 5
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+                        - ~
+                      - - FunctionCall:
+                            prefix:
+                              Name:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 1118
+                                      line: 47
+                                      character: 1
+                                    end_position:
+                                      bytes: 1119
+                                      line: 47
+                                      character: 1
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\n"
+                                  - start_position:
+                                      bytes: 1119
+                                      line: 48
+                                      character: 1
+                                    end_position:
+                                      bytes: 1120
+                                      line: 48
+                                      character: 2
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\t"
+                                token:
+                                  start_position:
+                                    bytes: 1120
+                                    line: 48
+                                    character: 2
+                                  end_position:
+                                    bytes: 1125
+                                    line: 48
+                                    character: 7
+                                  token_type:
+                                    type: Identifier
+                                    identifier: debug
+                                trailing_trivia: []
+                            suffixes:
+                              - Call:
+                                  AnonymousCall:
+                                    Parentheses:
+                                      parentheses:
+                                        tokens:
+                                          - leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 1125
+                                                line: 48
+                                                character: 7
+                                              end_position:
+                                                bytes: 1126
+                                                line: 48
+                                                character: 8
+                                              token_type:
+                                                type: Symbol
+                                                symbol: (
+                                            trailing_trivia: []
+                                          - leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 1165
+                                                line: 48
+                                                character: 47
+                                              end_position:
+                                                bytes: 1166
+                                                line: 48
+                                                character: 48
+                                              token_type:
+                                                type: Symbol
+                                                symbol: )
+                                            trailing_trivia:
+                                              - start_position:
+                                                  bytes: 1166
+                                                  line: 48
+                                                  character: 48
+                                                end_position:
+                                                  bytes: 1167
+                                                  line: 48
+                                                  character: 48
+                                                token_type:
+                                                  type: Whitespace
+                                                  characters: "\n"
+                                      arguments:
+                                        pairs:
+                                          - Punctuated:
+                                              - String:
+                                                  leading_trivia: []
+                                                  token:
+                                                    start_position:
+                                                      bytes: 1126
+                                                      line: 48
+                                                      character: 8
+                                                    end_position:
+                                                      bytes: 1138
+                                                      line: 48
+                                                      character: 20
+                                                    token_type:
+                                                      type: StringLiteral
+                                                      literal: LOS RESULT
+                                                      quote_type: Double
+                                                  trailing_trivia: []
+                                              - leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 1138
+                                                    line: 48
+                                                    character: 20
+                                                  end_position:
+                                                    bytes: 1139
+                                                    line: 48
+                                                    character: 21
+                                                  token_type:
+                                                    type: Symbol
+                                                    symbol: ","
+                                                trailing_trivia:
+                                                  - start_position:
+                                                      bytes: 1139
+                                                      line: 48
+                                                      character: 21
+                                                    end_position:
+                                                      bytes: 1140
+                                                      line: 48
+                                                      character: 22
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: " "
+                                          - End:
+                                              BinaryOperator:
+                                                lhs:
+                                                  Var:
+                                                    Name:
+                                                      leading_trivia: []
+                                                      token:
+                                                        start_position:
+                                                          bytes: 1140
+                                                          line: 48
+                                                          character: 22
+                                                        end_position:
+                                                          bytes: 1143
+                                                          line: 48
+                                                          character: 25
+                                                        token_type:
+                                                          type: Identifier
+                                                          identifier: hit
+                                                      trailing_trivia:
+                                                        - start_position:
+                                                            bytes: 1143
+                                                            line: 48
+                                                            character: 25
+                                                          end_position:
+                                                            bytes: 1144
+                                                            line: 48
+                                                            character: 26
+                                                          token_type:
+                                                            type: Whitespace
+                                                            characters: " "
+                                                binop:
+                                                  And:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 1144
+                                                        line: 48
+                                                        character: 26
+                                                      end_position:
+                                                        bytes: 1147
+                                                        line: 48
+                                                        character: 29
+                                                      token_type:
+                                                        type: Symbol
+                                                        symbol: and
+                                                    trailing_trivia:
+                                                      - start_position:
+                                                          bytes: 1147
+                                                          line: 48
+                                                          character: 29
+                                                        end_position:
+                                                          bytes: 1148
+                                                          line: 48
+                                                          character: 30
+                                                        token_type:
+                                                          type: Whitespace
+                                                          characters: " "
+                                                rhs:
+                                                  FunctionCall:
+                                                    prefix:
+                                                      Name:
+                                                        leading_trivia: []
+                                                        token:
+                                                          start_position:
+                                                            bytes: 1148
+                                                            line: 48
+                                                            character: 30
+                                                          end_position:
+                                                            bytes: 1151
+                                                            line: 48
+                                                            character: 33
+                                                          token_type:
+                                                            type: Identifier
+                                                            identifier: hit
+                                                        trailing_trivia: []
+                                                    suffixes:
+                                                      - Call:
+                                                          MethodCall:
+                                                            colon_token:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 1151
+                                                                  line: 48
+                                                                  character: 33
+                                                                end_position:
+                                                                  bytes: 1152
+                                                                  line: 48
+                                                                  character: 34
+                                                                token_type:
+                                                                  type: Symbol
+                                                                  symbol: ":"
+                                                              trailing_trivia: []
+                                                            name:
+                                                              leading_trivia: []
+                                                              token:
+                                                                start_position:
+                                                                  bytes: 1152
+                                                                  line: 48
+                                                                  character: 34
+                                                                end_position:
+                                                                  bytes: 1163
+                                                                  line: 48
+                                                                  character: 45
+                                                                token_type:
+                                                                  type: Identifier
+                                                                  identifier: GetFullName
+                                                              trailing_trivia: []
+                                                            args:
+                                                              Parentheses:
+                                                                parentheses:
+                                                                  tokens:
+                                                                    - leading_trivia: []
+                                                                      token:
+                                                                        start_position:
+                                                                          bytes: 1163
+                                                                          line: 48
+                                                                          character: 45
+                                                                        end_position:
+                                                                          bytes: 1164
+                                                                          line: 48
+                                                                          character: 46
+                                                                        token_type:
+                                                                          type: Symbol
+                                                                          symbol: (
+                                                                      trailing_trivia: []
+                                                                    - leading_trivia: []
+                                                                      token:
+                                                                        start_position:
+                                                                          bytes: 1164
+                                                                          line: 48
+                                                                          character: 46
+                                                                        end_position:
+                                                                          bytes: 1165
+                                                                          line: 48
+                                                                          character: 47
+                                                                        token_type:
+                                                                          type: Symbol
+                                                                          symbol: )
+                                                                      trailing_trivia: []
+                                                                arguments:
+                                                                  pairs: []
+                        - ~
+                    last_stmt:
+                      - Return:
+                          token:
+                            leading_trivia:
+                              - start_position:
+                                  bytes: 1167
+                                  line: 49
+                                  character: 1
+                                end_position:
+                                  bytes: 1168
+                                  line: 49
+                                  character: 1
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                              - start_position:
+                                  bytes: 1168
+                                  line: 50
+                                  character: 1
+                                end_position:
+                                  bytes: 1169
+                                  line: 50
+                                  character: 2
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\t"
+                            token:
+                              start_position:
+                                bytes: 1169
+                                line: 50
+                                character: 2
+                              end_position:
+                                bytes: 1175
+                                line: 50
+                                character: 8
+                              token_type:
+                                type: Symbol
+                                symbol: return
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 1175
+                                  line: 50
+                                  character: 8
+                                end_position:
+                                  bytes: 1176
+                                  line: 50
+                                  character: 9
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          returns:
+                            pairs:
+                              - Punctuated:
+                                  - BinaryOperator:
+                                      lhs:
+                                        Var:
+                                          Name:
+                                            leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 1176
+                                                line: 50
+                                                character: 9
+                                              end_position:
+                                                bytes: 1179
+                                                line: 50
+                                                character: 12
+                                              token_type:
+                                                type: Identifier
+                                                identifier: hit
+                                            trailing_trivia:
+                                              - start_position:
+                                                  bytes: 1179
+                                                  line: 50
+                                                  character: 12
+                                                end_position:
+                                                  bytes: 1180
+                                                  line: 50
+                                                  character: 13
+                                                token_type:
+                                                  type: Whitespace
+                                                  characters: " "
+                                      binop:
+                                        And:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 1180
+                                              line: 50
+                                              character: 13
+                                            end_position:
+                                              bytes: 1183
+                                              line: 50
+                                              character: 16
+                                            token_type:
+                                              type: Symbol
+                                              symbol: and
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 1183
+                                                line: 50
+                                                character: 16
+                                              end_position:
+                                                bytes: 1184
+                                                line: 50
+                                                character: 17
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                      rhs:
+                                        FunctionCall:
+                                          prefix:
+                                            Name:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 1184
+                                                  line: 50
+                                                  character: 17
+                                                end_position:
+                                                  bytes: 1187
+                                                  line: 50
+                                                  character: 20
+                                                token_type:
+                                                  type: Identifier
+                                                  identifier: hit
+                                              trailing_trivia: []
+                                          suffixes:
+                                            - Call:
+                                                MethodCall:
+                                                  colon_token:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 1187
+                                                        line: 50
+                                                        character: 20
+                                                      end_position:
+                                                        bytes: 1188
+                                                        line: 50
+                                                        character: 21
+                                                      token_type:
+                                                        type: Symbol
+                                                        symbol: ":"
+                                                    trailing_trivia: []
+                                                  name:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 1188
+                                                        line: 50
+                                                        character: 21
+                                                      end_position:
+                                                        bytes: 1202
+                                                        line: 50
+                                                        character: 35
+                                                      token_type:
+                                                        type: Identifier
+                                                        identifier: IsDescendantOf
+                                                    trailing_trivia: []
+                                                  args:
+                                                    Parentheses:
+                                                      parentheses:
+                                                        tokens:
+                                                          - leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 1202
+                                                                line: 50
+                                                                character: 35
+                                                              end_position:
+                                                                bytes: 1203
+                                                                line: 50
+                                                                character: 36
+                                                              token_type:
+                                                                type: Symbol
+                                                                symbol: (
+                                                            trailing_trivia: []
+                                                          - leading_trivia: []
+                                                            token:
+                                                              start_position:
+                                                                bytes: 1212
+                                                                line: 50
+                                                                character: 45
+                                                              end_position:
+                                                                bytes: 1213
+                                                                line: 50
+                                                                character: 46
+                                                              token_type:
+                                                                type: Symbol
+                                                                symbol: )
+                                                            trailing_trivia: []
+                                                      arguments:
+                                                        pairs:
+                                                          - End:
+                                                              Var:
+                                                                Name:
+                                                                  leading_trivia: []
+                                                                  token:
+                                                                    start_position:
+                                                                      bytes: 1203
+                                                                      line: 50
+                                                                      character: 36
+                                                                    end_position:
+                                                                      bytes: 1212
+                                                                      line: 50
+                                                                      character: 45
+                                                                    token_type:
+                                                                      type: Identifier
+                                                                      identifier: character
+                                                                  trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 1213
+                                        line: 50
+                                        character: 46
+                                      end_position:
+                                        bytes: 1214
+                                        line: 50
+                                        character: 47
+                                      token_type:
+                                        type: Symbol
+                                        symbol: ","
+                                    trailing_trivia:
+                                      - start_position:
+                                          bytes: 1214
+                                          line: 50
+                                          character: 47
+                                        end_position:
+                                          bytes: 1215
+                                          line: 50
+                                          character: 48
+                                        token_type:
+                                          type: Whitespace
+                                          characters: " "
+                              - End:
+                                  Var:
+                                    Name:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 1215
+                                          line: 50
+                                          character: 48
+                                        end_position:
+                                          bytes: 1220
+                                          line: 50
+                                          character: 53
+                                        token_type:
+                                          type: Identifier
+                                          identifier: point
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 1220
+                                            line: 50
+                                            character: 53
+                                          end_position:
+                                            bytes: 1221
+                                            line: 50
+                                            character: 53
+                                          token_type:
+                                            type: Whitespace
+                                            characters: "\n"
+                      - ~
+                  end_token:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 1221
+                        line: 51
+                        character: 1
+                      end_position:
+                        bytes: 1224
+                        line: 51
+                        character: 4
+                      token_type:
+                        type: Symbol
+                        symbol: end
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 1224
+                          line: 51
+                          character: 4
+                        end_position:
+                          bytes: 1225
+                          line: 51
+                          character: 4
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+  - ~
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/source.lua
new file mode 100644
index 00000000..e86cb582
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/source.lua
@@ -0,0 +1,51 @@
+-- Taken from https://raw.githubusercontent.com/Kampfkarren/Roblox/master/Modules/LineOfSight.lua
+local ReplicatedStorage = game:GetService("ReplicatedStorage")
+local RunService = game:GetService("RunService")
+
+local Raycast = require(ReplicatedStorage.Modules.Raycast)
+
+local DEBUG = true
+DEBUG = DEBUG and RunService:IsStudio()
+
+local debug
+
+if DEBUG then
+	function debug(table)
+		print("[LineOfSight]", table)
+	end
+else
+	function debug()
+	end
+end
+
+return function(origin, character, range, ignoreIf, blacklist)
+	if typeof(origin) == "Instance" then
+		if origin.Position:FuzzyEq(character.PrimaryPart.Position) then
+			debug("ORIGIN WAS CHARACTER")
+			return origin, origin.Position
+		end
+
+		origin = origin.Position
+	end
+
+	blacklist = blacklist or {}
+
+	local hit, point do
+		while true do
+			hit, point = Raycast(Ray.new(origin, (origin - character.PrimaryPart.Position).Unit * -range), blacklist)
+
+			if hit and hit:IsDescendantOf(character) then
+				break
+			elseif hit and ignoreIf(hit) then
+				debug("IGNORING OFF IF", hit:GetFullName())
+				blacklist[#blacklist + 1] = hit
+			else
+				break
+			end
+		end
+	end
+
+	debug("LOS RESULT", hit and hit:GetFullName())
+
+	return hit and hit:IsDescendantOf(character), point
+end
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/tokens.snap
new file mode 100644
index 00000000..1398d792
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/no_roblox_syntax/tokens.snap
@@ -0,0 +1,4246 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/roblox_cases/pass/no_roblox_syntax
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 97
+    line: 1
+    character: 98
+  token_type:
+    type: SingleLineComment
+    comment: " Taken from https://raw.githubusercontent.com/Kampfkarren/Roblox/master/Modules/LineOfSight.lua"
+- start_position:
+    bytes: 97
+    line: 1
+    character: 98
+  end_position:
+    bytes: 98
+    line: 1
+    character: 98
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 98
+    line: 2
+    character: 1
+  end_position:
+    bytes: 103
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 103
+    line: 2
+    character: 6
+  end_position:
+    bytes: 104
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 104
+    line: 2
+    character: 7
+  end_position:
+    bytes: 121
+    line: 2
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: ReplicatedStorage
+- start_position:
+    bytes: 121
+    line: 2
+    character: 24
+  end_position:
+    bytes: 122
+    line: 2
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 122
+    line: 2
+    character: 25
+  end_position:
+    bytes: 123
+    line: 2
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 123
+    line: 2
+    character: 26
+  end_position:
+    bytes: 124
+    line: 2
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 124
+    line: 2
+    character: 27
+  end_position:
+    bytes: 128
+    line: 2
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: game
+- start_position:
+    bytes: 128
+    line: 2
+    character: 31
+  end_position:
+    bytes: 129
+    line: 2
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 129
+    line: 2
+    character: 32
+  end_position:
+    bytes: 139
+    line: 2
+    character: 42
+  token_type:
+    type: Identifier
+    identifier: GetService
+- start_position:
+    bytes: 139
+    line: 2
+    character: 42
+  end_position:
+    bytes: 140
+    line: 2
+    character: 43
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 140
+    line: 2
+    character: 43
+  end_position:
+    bytes: 159
+    line: 2
+    character: 62
+  token_type:
+    type: StringLiteral
+    literal: ReplicatedStorage
+    quote_type: Double
+- start_position:
+    bytes: 159
+    line: 2
+    character: 62
+  end_position:
+    bytes: 160
+    line: 2
+    character: 63
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 160
+    line: 2
+    character: 63
+  end_position:
+    bytes: 161
+    line: 2
+    character: 63
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 161
+    line: 3
+    character: 1
+  end_position:
+    bytes: 166
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 166
+    line: 3
+    character: 6
+  end_position:
+    bytes: 167
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 167
+    line: 3
+    character: 7
+  end_position:
+    bytes: 177
+    line: 3
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: RunService
+- start_position:
+    bytes: 177
+    line: 3
+    character: 17
+  end_position:
+    bytes: 178
+    line: 3
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 178
+    line: 3
+    character: 18
+  end_position:
+    bytes: 179
+    line: 3
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 179
+    line: 3
+    character: 19
+  end_position:
+    bytes: 180
+    line: 3
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 180
+    line: 3
+    character: 20
+  end_position:
+    bytes: 184
+    line: 3
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: game
+- start_position:
+    bytes: 184
+    line: 3
+    character: 24
+  end_position:
+    bytes: 185
+    line: 3
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 185
+    line: 3
+    character: 25
+  end_position:
+    bytes: 195
+    line: 3
+    character: 35
+  token_type:
+    type: Identifier
+    identifier: GetService
+- start_position:
+    bytes: 195
+    line: 3
+    character: 35
+  end_position:
+    bytes: 196
+    line: 3
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 196
+    line: 3
+    character: 36
+  end_position:
+    bytes: 208
+    line: 3
+    character: 48
+  token_type:
+    type: StringLiteral
+    literal: RunService
+    quote_type: Double
+- start_position:
+    bytes: 208
+    line: 3
+    character: 48
+  end_position:
+    bytes: 209
+    line: 3
+    character: 49
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 209
+    line: 3
+    character: 49
+  end_position:
+    bytes: 210
+    line: 3
+    character: 49
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 210
+    line: 4
+    character: 1
+  end_position:
+    bytes: 211
+    line: 4
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 211
+    line: 5
+    character: 1
+  end_position:
+    bytes: 216
+    line: 5
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 216
+    line: 5
+    character: 6
+  end_position:
+    bytes: 217
+    line: 5
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 217
+    line: 5
+    character: 7
+  end_position:
+    bytes: 224
+    line: 5
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: Raycast
+- start_position:
+    bytes: 224
+    line: 5
+    character: 14
+  end_position:
+    bytes: 225
+    line: 5
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 225
+    line: 5
+    character: 15
+  end_position:
+    bytes: 226
+    line: 5
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 226
+    line: 5
+    character: 16
+  end_position:
+    bytes: 227
+    line: 5
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 227
+    line: 5
+    character: 17
+  end_position:
+    bytes: 234
+    line: 5
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: require
+- start_position:
+    bytes: 234
+    line: 5
+    character: 24
+  end_position:
+    bytes: 235
+    line: 5
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 235
+    line: 5
+    character: 25
+  end_position:
+    bytes: 252
+    line: 5
+    character: 42
+  token_type:
+    type: Identifier
+    identifier: ReplicatedStorage
+- start_position:
+    bytes: 252
+    line: 5
+    character: 42
+  end_position:
+    bytes: 253
+    line: 5
+    character: 43
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 253
+    line: 5
+    character: 43
+  end_position:
+    bytes: 260
+    line: 5
+    character: 50
+  token_type:
+    type: Identifier
+    identifier: Modules
+- start_position:
+    bytes: 260
+    line: 5
+    character: 50
+  end_position:
+    bytes: 261
+    line: 5
+    character: 51
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 261
+    line: 5
+    character: 51
+  end_position:
+    bytes: 268
+    line: 5
+    character: 58
+  token_type:
+    type: Identifier
+    identifier: Raycast
+- start_position:
+    bytes: 268
+    line: 5
+    character: 58
+  end_position:
+    bytes: 269
+    line: 5
+    character: 59
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 269
+    line: 5
+    character: 59
+  end_position:
+    bytes: 270
+    line: 5
+    character: 59
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 270
+    line: 6
+    character: 1
+  end_position:
+    bytes: 271
+    line: 6
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 271
+    line: 7
+    character: 1
+  end_position:
+    bytes: 276
+    line: 7
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 276
+    line: 7
+    character: 6
+  end_position:
+    bytes: 277
+    line: 7
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 277
+    line: 7
+    character: 7
+  end_position:
+    bytes: 282
+    line: 7
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: DEBUG
+- start_position:
+    bytes: 282
+    line: 7
+    character: 12
+  end_position:
+    bytes: 283
+    line: 7
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 283
+    line: 7
+    character: 13
+  end_position:
+    bytes: 284
+    line: 7
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 284
+    line: 7
+    character: 14
+  end_position:
+    bytes: 285
+    line: 7
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 285
+    line: 7
+    character: 15
+  end_position:
+    bytes: 289
+    line: 7
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 289
+    line: 7
+    character: 19
+  end_position:
+    bytes: 290
+    line: 7
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 290
+    line: 8
+    character: 1
+  end_position:
+    bytes: 295
+    line: 8
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: DEBUG
+- start_position:
+    bytes: 295
+    line: 8
+    character: 6
+  end_position:
+    bytes: 296
+    line: 8
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 296
+    line: 8
+    character: 7
+  end_position:
+    bytes: 297
+    line: 8
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 297
+    line: 8
+    character: 8
+  end_position:
+    bytes: 298
+    line: 8
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 298
+    line: 8
+    character: 9
+  end_position:
+    bytes: 303
+    line: 8
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: DEBUG
+- start_position:
+    bytes: 303
+    line: 8
+    character: 14
+  end_position:
+    bytes: 304
+    line: 8
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 304
+    line: 8
+    character: 15
+  end_position:
+    bytes: 307
+    line: 8
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: and
+- start_position:
+    bytes: 307
+    line: 8
+    character: 18
+  end_position:
+    bytes: 308
+    line: 8
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 308
+    line: 8
+    character: 19
+  end_position:
+    bytes: 318
+    line: 8
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: RunService
+- start_position:
+    bytes: 318
+    line: 8
+    character: 29
+  end_position:
+    bytes: 319
+    line: 8
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 319
+    line: 8
+    character: 30
+  end_position:
+    bytes: 327
+    line: 8
+    character: 38
+  token_type:
+    type: Identifier
+    identifier: IsStudio
+- start_position:
+    bytes: 327
+    line: 8
+    character: 38
+  end_position:
+    bytes: 328
+    line: 8
+    character: 39
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 328
+    line: 8
+    character: 39
+  end_position:
+    bytes: 329
+    line: 8
+    character: 40
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 329
+    line: 8
+    character: 40
+  end_position:
+    bytes: 330
+    line: 8
+    character: 40
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 330
+    line: 9
+    character: 1
+  end_position:
+    bytes: 331
+    line: 9
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 331
+    line: 10
+    character: 1
+  end_position:
+    bytes: 336
+    line: 10
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 336
+    line: 10
+    character: 6
+  end_position:
+    bytes: 337
+    line: 10
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 337
+    line: 10
+    character: 7
+  end_position:
+    bytes: 342
+    line: 10
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: debug
+- start_position:
+    bytes: 342
+    line: 10
+    character: 12
+  end_position:
+    bytes: 343
+    line: 10
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 343
+    line: 11
+    character: 1
+  end_position:
+    bytes: 344
+    line: 11
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 344
+    line: 12
+    character: 1
+  end_position:
+    bytes: 346
+    line: 12
+    character: 3
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 346
+    line: 12
+    character: 3
+  end_position:
+    bytes: 347
+    line: 12
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 347
+    line: 12
+    character: 4
+  end_position:
+    bytes: 352
+    line: 12
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: DEBUG
+- start_position:
+    bytes: 352
+    line: 12
+    character: 9
+  end_position:
+    bytes: 353
+    line: 12
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 353
+    line: 12
+    character: 10
+  end_position:
+    bytes: 357
+    line: 12
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 357
+    line: 12
+    character: 14
+  end_position:
+    bytes: 358
+    line: 12
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 358
+    line: 13
+    character: 1
+  end_position:
+    bytes: 359
+    line: 13
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 359
+    line: 13
+    character: 2
+  end_position:
+    bytes: 367
+    line: 13
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 367
+    line: 13
+    character: 10
+  end_position:
+    bytes: 368
+    line: 13
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 368
+    line: 13
+    character: 11
+  end_position:
+    bytes: 373
+    line: 13
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: debug
+- start_position:
+    bytes: 373
+    line: 13
+    character: 16
+  end_position:
+    bytes: 374
+    line: 13
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 374
+    line: 13
+    character: 17
+  end_position:
+    bytes: 379
+    line: 13
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: table
+- start_position:
+    bytes: 379
+    line: 13
+    character: 22
+  end_position:
+    bytes: 380
+    line: 13
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 380
+    line: 13
+    character: 23
+  end_position:
+    bytes: 381
+    line: 13
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 381
+    line: 14
+    character: 1
+  end_position:
+    bytes: 383
+    line: 14
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\t\t"
+- start_position:
+    bytes: 383
+    line: 14
+    character: 3
+  end_position:
+    bytes: 388
+    line: 14
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 388
+    line: 14
+    character: 8
+  end_position:
+    bytes: 389
+    line: 14
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 389
+    line: 14
+    character: 9
+  end_position:
+    bytes: 404
+    line: 14
+    character: 24
+  token_type:
+    type: StringLiteral
+    literal: "[LineOfSight]"
+    quote_type: Double
+- start_position:
+    bytes: 404
+    line: 14
+    character: 24
+  end_position:
+    bytes: 405
+    line: 14
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 405
+    line: 14
+    character: 25
+  end_position:
+    bytes: 406
+    line: 14
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 406
+    line: 14
+    character: 26
+  end_position:
+    bytes: 411
+    line: 14
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: table
+- start_position:
+    bytes: 411
+    line: 14
+    character: 31
+  end_position:
+    bytes: 412
+    line: 14
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 412
+    line: 14
+    character: 32
+  end_position:
+    bytes: 413
+    line: 14
+    character: 32
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 413
+    line: 15
+    character: 1
+  end_position:
+    bytes: 414
+    line: 15
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 414
+    line: 15
+    character: 2
+  end_position:
+    bytes: 417
+    line: 15
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 417
+    line: 15
+    character: 5
+  end_position:
+    bytes: 418
+    line: 15
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 418
+    line: 16
+    character: 1
+  end_position:
+    bytes: 422
+    line: 16
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 422
+    line: 16
+    character: 5
+  end_position:
+    bytes: 423
+    line: 16
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 423
+    line: 17
+    character: 1
+  end_position:
+    bytes: 424
+    line: 17
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 424
+    line: 17
+    character: 2
+  end_position:
+    bytes: 432
+    line: 17
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 432
+    line: 17
+    character: 10
+  end_position:
+    bytes: 433
+    line: 17
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 433
+    line: 17
+    character: 11
+  end_position:
+    bytes: 438
+    line: 17
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: debug
+- start_position:
+    bytes: 438
+    line: 17
+    character: 16
+  end_position:
+    bytes: 439
+    line: 17
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 439
+    line: 17
+    character: 17
+  end_position:
+    bytes: 440
+    line: 17
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 440
+    line: 17
+    character: 18
+  end_position:
+    bytes: 441
+    line: 17
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 441
+    line: 18
+    character: 1
+  end_position:
+    bytes: 442
+    line: 18
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 442
+    line: 18
+    character: 2
+  end_position:
+    bytes: 445
+    line: 18
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 445
+    line: 18
+    character: 5
+  end_position:
+    bytes: 446
+    line: 18
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 446
+    line: 19
+    character: 1
+  end_position:
+    bytes: 449
+    line: 19
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 449
+    line: 19
+    character: 4
+  end_position:
+    bytes: 450
+    line: 19
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 450
+    line: 20
+    character: 1
+  end_position:
+    bytes: 451
+    line: 20
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 451
+    line: 21
+    character: 1
+  end_position:
+    bytes: 457
+    line: 21
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 457
+    line: 21
+    character: 7
+  end_position:
+    bytes: 458
+    line: 21
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 458
+    line: 21
+    character: 8
+  end_position:
+    bytes: 466
+    line: 21
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 466
+    line: 21
+    character: 16
+  end_position:
+    bytes: 467
+    line: 21
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 467
+    line: 21
+    character: 17
+  end_position:
+    bytes: 473
+    line: 21
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 473
+    line: 21
+    character: 23
+  end_position:
+    bytes: 474
+    line: 21
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 474
+    line: 21
+    character: 24
+  end_position:
+    bytes: 475
+    line: 21
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 475
+    line: 21
+    character: 25
+  end_position:
+    bytes: 484
+    line: 21
+    character: 34
+  token_type:
+    type: Identifier
+    identifier: character
+- start_position:
+    bytes: 484
+    line: 21
+    character: 34
+  end_position:
+    bytes: 485
+    line: 21
+    character: 35
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 485
+    line: 21
+    character: 35
+  end_position:
+    bytes: 486
+    line: 21
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 486
+    line: 21
+    character: 36
+  end_position:
+    bytes: 491
+    line: 21
+    character: 41
+  token_type:
+    type: Identifier
+    identifier: range
+- start_position:
+    bytes: 491
+    line: 21
+    character: 41
+  end_position:
+    bytes: 492
+    line: 21
+    character: 42
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 492
+    line: 21
+    character: 42
+  end_position:
+    bytes: 493
+    line: 21
+    character: 43
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 493
+    line: 21
+    character: 43
+  end_position:
+    bytes: 501
+    line: 21
+    character: 51
+  token_type:
+    type: Identifier
+    identifier: ignoreIf
+- start_position:
+    bytes: 501
+    line: 21
+    character: 51
+  end_position:
+    bytes: 502
+    line: 21
+    character: 52
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 502
+    line: 21
+    character: 52
+  end_position:
+    bytes: 503
+    line: 21
+    character: 53
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 503
+    line: 21
+    character: 53
+  end_position:
+    bytes: 512
+    line: 21
+    character: 62
+  token_type:
+    type: Identifier
+    identifier: blacklist
+- start_position:
+    bytes: 512
+    line: 21
+    character: 62
+  end_position:
+    bytes: 513
+    line: 21
+    character: 63
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 513
+    line: 21
+    character: 63
+  end_position:
+    bytes: 514
+    line: 21
+    character: 63
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 514
+    line: 22
+    character: 1
+  end_position:
+    bytes: 515
+    line: 22
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 515
+    line: 22
+    character: 2
+  end_position:
+    bytes: 517
+    line: 22
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 517
+    line: 22
+    character: 4
+  end_position:
+    bytes: 518
+    line: 22
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 518
+    line: 22
+    character: 5
+  end_position:
+    bytes: 524
+    line: 22
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: typeof
+- start_position:
+    bytes: 524
+    line: 22
+    character: 11
+  end_position:
+    bytes: 525
+    line: 22
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 525
+    line: 22
+    character: 12
+  end_position:
+    bytes: 531
+    line: 22
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 531
+    line: 22
+    character: 18
+  end_position:
+    bytes: 532
+    line: 22
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 532
+    line: 22
+    character: 19
+  end_position:
+    bytes: 533
+    line: 22
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 533
+    line: 22
+    character: 20
+  end_position:
+    bytes: 535
+    line: 22
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: "=="
+- start_position:
+    bytes: 535
+    line: 22
+    character: 22
+  end_position:
+    bytes: 536
+    line: 22
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 536
+    line: 22
+    character: 23
+  end_position:
+    bytes: 546
+    line: 22
+    character: 33
+  token_type:
+    type: StringLiteral
+    literal: Instance
+    quote_type: Double
+- start_position:
+    bytes: 546
+    line: 22
+    character: 33
+  end_position:
+    bytes: 547
+    line: 22
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 547
+    line: 22
+    character: 34
+  end_position:
+    bytes: 551
+    line: 22
+    character: 38
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 551
+    line: 22
+    character: 38
+  end_position:
+    bytes: 552
+    line: 22
+    character: 38
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 552
+    line: 23
+    character: 1
+  end_position:
+    bytes: 554
+    line: 23
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\t\t"
+- start_position:
+    bytes: 554
+    line: 23
+    character: 3
+  end_position:
+    bytes: 556
+    line: 23
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 556
+    line: 23
+    character: 5
+  end_position:
+    bytes: 557
+    line: 23
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 557
+    line: 23
+    character: 6
+  end_position:
+    bytes: 563
+    line: 23
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 563
+    line: 23
+    character: 12
+  end_position:
+    bytes: 564
+    line: 23
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 564
+    line: 23
+    character: 13
+  end_position:
+    bytes: 572
+    line: 23
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: Position
+- start_position:
+    bytes: 572
+    line: 23
+    character: 21
+  end_position:
+    bytes: 573
+    line: 23
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 573
+    line: 23
+    character: 22
+  end_position:
+    bytes: 580
+    line: 23
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: FuzzyEq
+- start_position:
+    bytes: 580
+    line: 23
+    character: 29
+  end_position:
+    bytes: 581
+    line: 23
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 581
+    line: 23
+    character: 30
+  end_position:
+    bytes: 590
+    line: 23
+    character: 39
+  token_type:
+    type: Identifier
+    identifier: character
+- start_position:
+    bytes: 590
+    line: 23
+    character: 39
+  end_position:
+    bytes: 591
+    line: 23
+    character: 40
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 591
+    line: 23
+    character: 40
+  end_position:
+    bytes: 602
+    line: 23
+    character: 51
+  token_type:
+    type: Identifier
+    identifier: PrimaryPart
+- start_position:
+    bytes: 602
+    line: 23
+    character: 51
+  end_position:
+    bytes: 603
+    line: 23
+    character: 52
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 603
+    line: 23
+    character: 52
+  end_position:
+    bytes: 611
+    line: 23
+    character: 60
+  token_type:
+    type: Identifier
+    identifier: Position
+- start_position:
+    bytes: 611
+    line: 23
+    character: 60
+  end_position:
+    bytes: 612
+    line: 23
+    character: 61
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 612
+    line: 23
+    character: 61
+  end_position:
+    bytes: 613
+    line: 23
+    character: 62
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 613
+    line: 23
+    character: 62
+  end_position:
+    bytes: 617
+    line: 23
+    character: 66
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 617
+    line: 23
+    character: 66
+  end_position:
+    bytes: 618
+    line: 23
+    character: 66
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 618
+    line: 24
+    character: 1
+  end_position:
+    bytes: 621
+    line: 24
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 621
+    line: 24
+    character: 4
+  end_position:
+    bytes: 626
+    line: 24
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: debug
+- start_position:
+    bytes: 626
+    line: 24
+    character: 9
+  end_position:
+    bytes: 627
+    line: 24
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 627
+    line: 24
+    character: 10
+  end_position:
+    bytes: 649
+    line: 24
+    character: 32
+  token_type:
+    type: StringLiteral
+    literal: ORIGIN WAS CHARACTER
+    quote_type: Double
+- start_position:
+    bytes: 649
+    line: 24
+    character: 32
+  end_position:
+    bytes: 650
+    line: 24
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 650
+    line: 24
+    character: 33
+  end_position:
+    bytes: 651
+    line: 24
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 651
+    line: 25
+    character: 1
+  end_position:
+    bytes: 654
+    line: 25
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 654
+    line: 25
+    character: 4
+  end_position:
+    bytes: 660
+    line: 25
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 660
+    line: 25
+    character: 10
+  end_position:
+    bytes: 661
+    line: 25
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 661
+    line: 25
+    character: 11
+  end_position:
+    bytes: 667
+    line: 25
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 667
+    line: 25
+    character: 17
+  end_position:
+    bytes: 668
+    line: 25
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 668
+    line: 25
+    character: 18
+  end_position:
+    bytes: 669
+    line: 25
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 669
+    line: 25
+    character: 19
+  end_position:
+    bytes: 675
+    line: 25
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 675
+    line: 25
+    character: 25
+  end_position:
+    bytes: 676
+    line: 25
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 676
+    line: 25
+    character: 26
+  end_position:
+    bytes: 684
+    line: 25
+    character: 34
+  token_type:
+    type: Identifier
+    identifier: Position
+- start_position:
+    bytes: 684
+    line: 25
+    character: 34
+  end_position:
+    bytes: 685
+    line: 25
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 685
+    line: 26
+    character: 1
+  end_position:
+    bytes: 687
+    line: 26
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\t\t"
+- start_position:
+    bytes: 687
+    line: 26
+    character: 3
+  end_position:
+    bytes: 690
+    line: 26
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 690
+    line: 26
+    character: 6
+  end_position:
+    bytes: 691
+    line: 26
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 691
+    line: 27
+    character: 1
+  end_position:
+    bytes: 692
+    line: 27
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 692
+    line: 28
+    character: 1
+  end_position:
+    bytes: 694
+    line: 28
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\t\t"
+- start_position:
+    bytes: 694
+    line: 28
+    character: 3
+  end_position:
+    bytes: 700
+    line: 28
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 700
+    line: 28
+    character: 9
+  end_position:
+    bytes: 701
+    line: 28
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 701
+    line: 28
+    character: 10
+  end_position:
+    bytes: 702
+    line: 28
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 702
+    line: 28
+    character: 11
+  end_position:
+    bytes: 703
+    line: 28
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 703
+    line: 28
+    character: 12
+  end_position:
+    bytes: 709
+    line: 28
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 709
+    line: 28
+    character: 18
+  end_position:
+    bytes: 710
+    line: 28
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 710
+    line: 28
+    character: 19
+  end_position:
+    bytes: 718
+    line: 28
+    character: 27
+  token_type:
+    type: Identifier
+    identifier: Position
+- start_position:
+    bytes: 718
+    line: 28
+    character: 27
+  end_position:
+    bytes: 719
+    line: 28
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 719
+    line: 29
+    character: 1
+  end_position:
+    bytes: 720
+    line: 29
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 720
+    line: 29
+    character: 2
+  end_position:
+    bytes: 723
+    line: 29
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 723
+    line: 29
+    character: 5
+  end_position:
+    bytes: 724
+    line: 29
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 724
+    line: 30
+    character: 1
+  end_position:
+    bytes: 725
+    line: 30
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 725
+    line: 31
+    character: 1
+  end_position:
+    bytes: 726
+    line: 31
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 726
+    line: 31
+    character: 2
+  end_position:
+    bytes: 735
+    line: 31
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: blacklist
+- start_position:
+    bytes: 735
+    line: 31
+    character: 11
+  end_position:
+    bytes: 736
+    line: 31
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 736
+    line: 31
+    character: 12
+  end_position:
+    bytes: 737
+    line: 31
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 737
+    line: 31
+    character: 13
+  end_position:
+    bytes: 738
+    line: 31
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 738
+    line: 31
+    character: 14
+  end_position:
+    bytes: 747
+    line: 31
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: blacklist
+- start_position:
+    bytes: 747
+    line: 31
+    character: 23
+  end_position:
+    bytes: 748
+    line: 31
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 748
+    line: 31
+    character: 24
+  end_position:
+    bytes: 750
+    line: 31
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: or
+- start_position:
+    bytes: 750
+    line: 31
+    character: 26
+  end_position:
+    bytes: 751
+    line: 31
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 751
+    line: 31
+    character: 27
+  end_position:
+    bytes: 752
+    line: 31
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 752
+    line: 31
+    character: 28
+  end_position:
+    bytes: 753
+    line: 31
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 753
+    line: 31
+    character: 29
+  end_position:
+    bytes: 754
+    line: 31
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 754
+    line: 32
+    character: 1
+  end_position:
+    bytes: 755
+    line: 32
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 755
+    line: 33
+    character: 1
+  end_position:
+    bytes: 756
+    line: 33
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 756
+    line: 33
+    character: 2
+  end_position:
+    bytes: 761
+    line: 33
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 761
+    line: 33
+    character: 7
+  end_position:
+    bytes: 762
+    line: 33
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 762
+    line: 33
+    character: 8
+  end_position:
+    bytes: 765
+    line: 33
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 765
+    line: 33
+    character: 11
+  end_position:
+    bytes: 766
+    line: 33
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 766
+    line: 33
+    character: 12
+  end_position:
+    bytes: 767
+    line: 33
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 767
+    line: 33
+    character: 13
+  end_position:
+    bytes: 772
+    line: 33
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: point
+- start_position:
+    bytes: 772
+    line: 33
+    character: 18
+  end_position:
+    bytes: 773
+    line: 33
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 773
+    line: 33
+    character: 19
+  end_position:
+    bytes: 775
+    line: 33
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 775
+    line: 33
+    character: 21
+  end_position:
+    bytes: 776
+    line: 33
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 776
+    line: 34
+    character: 1
+  end_position:
+    bytes: 778
+    line: 34
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\t\t"
+- start_position:
+    bytes: 778
+    line: 34
+    character: 3
+  end_position:
+    bytes: 783
+    line: 34
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: while
+- start_position:
+    bytes: 783
+    line: 34
+    character: 8
+  end_position:
+    bytes: 784
+    line: 34
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 784
+    line: 34
+    character: 9
+  end_position:
+    bytes: 788
+    line: 34
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "true"
+- start_position:
+    bytes: 788
+    line: 34
+    character: 13
+  end_position:
+    bytes: 789
+    line: 34
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 789
+    line: 34
+    character: 14
+  end_position:
+    bytes: 791
+    line: 34
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 791
+    line: 34
+    character: 16
+  end_position:
+    bytes: 792
+    line: 34
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 792
+    line: 35
+    character: 1
+  end_position:
+    bytes: 795
+    line: 35
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 795
+    line: 35
+    character: 4
+  end_position:
+    bytes: 798
+    line: 35
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 798
+    line: 35
+    character: 7
+  end_position:
+    bytes: 799
+    line: 35
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 799
+    line: 35
+    character: 8
+  end_position:
+    bytes: 800
+    line: 35
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 800
+    line: 35
+    character: 9
+  end_position:
+    bytes: 805
+    line: 35
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: point
+- start_position:
+    bytes: 805
+    line: 35
+    character: 14
+  end_position:
+    bytes: 806
+    line: 35
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 806
+    line: 35
+    character: 15
+  end_position:
+    bytes: 807
+    line: 35
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 807
+    line: 35
+    character: 16
+  end_position:
+    bytes: 808
+    line: 35
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 808
+    line: 35
+    character: 17
+  end_position:
+    bytes: 815
+    line: 35
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: Raycast
+- start_position:
+    bytes: 815
+    line: 35
+    character: 24
+  end_position:
+    bytes: 816
+    line: 35
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 816
+    line: 35
+    character: 25
+  end_position:
+    bytes: 819
+    line: 35
+    character: 28
+  token_type:
+    type: Identifier
+    identifier: Ray
+- start_position:
+    bytes: 819
+    line: 35
+    character: 28
+  end_position:
+    bytes: 820
+    line: 35
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 820
+    line: 35
+    character: 29
+  end_position:
+    bytes: 823
+    line: 35
+    character: 32
+  token_type:
+    type: Identifier
+    identifier: new
+- start_position:
+    bytes: 823
+    line: 35
+    character: 32
+  end_position:
+    bytes: 824
+    line: 35
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 824
+    line: 35
+    character: 33
+  end_position:
+    bytes: 830
+    line: 35
+    character: 39
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 830
+    line: 35
+    character: 39
+  end_position:
+    bytes: 831
+    line: 35
+    character: 40
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 831
+    line: 35
+    character: 40
+  end_position:
+    bytes: 832
+    line: 35
+    character: 41
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 832
+    line: 35
+    character: 41
+  end_position:
+    bytes: 833
+    line: 35
+    character: 42
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 833
+    line: 35
+    character: 42
+  end_position:
+    bytes: 839
+    line: 35
+    character: 48
+  token_type:
+    type: Identifier
+    identifier: origin
+- start_position:
+    bytes: 839
+    line: 35
+    character: 48
+  end_position:
+    bytes: 840
+    line: 35
+    character: 49
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 840
+    line: 35
+    character: 49
+  end_position:
+    bytes: 841
+    line: 35
+    character: 50
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 841
+    line: 35
+    character: 50
+  end_position:
+    bytes: 842
+    line: 35
+    character: 51
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 842
+    line: 35
+    character: 51
+  end_position:
+    bytes: 851
+    line: 35
+    character: 60
+  token_type:
+    type: Identifier
+    identifier: character
+- start_position:
+    bytes: 851
+    line: 35
+    character: 60
+  end_position:
+    bytes: 852
+    line: 35
+    character: 61
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 852
+    line: 35
+    character: 61
+  end_position:
+    bytes: 863
+    line: 35
+    character: 72
+  token_type:
+    type: Identifier
+    identifier: PrimaryPart
+- start_position:
+    bytes: 863
+    line: 35
+    character: 72
+  end_position:
+    bytes: 864
+    line: 35
+    character: 73
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 864
+    line: 35
+    character: 73
+  end_position:
+    bytes: 872
+    line: 35
+    character: 81
+  token_type:
+    type: Identifier
+    identifier: Position
+- start_position:
+    bytes: 872
+    line: 35
+    character: 81
+  end_position:
+    bytes: 873
+    line: 35
+    character: 82
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 873
+    line: 35
+    character: 82
+  end_position:
+    bytes: 874
+    line: 35
+    character: 83
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 874
+    line: 35
+    character: 83
+  end_position:
+    bytes: 878
+    line: 35
+    character: 87
+  token_type:
+    type: Identifier
+    identifier: Unit
+- start_position:
+    bytes: 878
+    line: 35
+    character: 87
+  end_position:
+    bytes: 879
+    line: 35
+    character: 88
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 879
+    line: 35
+    character: 88
+  end_position:
+    bytes: 880
+    line: 35
+    character: 89
+  token_type:
+    type: Symbol
+    symbol: "*"
+- start_position:
+    bytes: 880
+    line: 35
+    character: 89
+  end_position:
+    bytes: 881
+    line: 35
+    character: 90
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 881
+    line: 35
+    character: 90
+  end_position:
+    bytes: 882
+    line: 35
+    character: 91
+  token_type:
+    type: Symbol
+    symbol: "-"
+- start_position:
+    bytes: 882
+    line: 35
+    character: 91
+  end_position:
+    bytes: 887
+    line: 35
+    character: 96
+  token_type:
+    type: Identifier
+    identifier: range
+- start_position:
+    bytes: 887
+    line: 35
+    character: 96
+  end_position:
+    bytes: 888
+    line: 35
+    character: 97
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 888
+    line: 35
+    character: 97
+  end_position:
+    bytes: 889
+    line: 35
+    character: 98
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 889
+    line: 35
+    character: 98
+  end_position:
+    bytes: 890
+    line: 35
+    character: 99
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 890
+    line: 35
+    character: 99
+  end_position:
+    bytes: 899
+    line: 35
+    character: 108
+  token_type:
+    type: Identifier
+    identifier: blacklist
+- start_position:
+    bytes: 899
+    line: 35
+    character: 108
+  end_position:
+    bytes: 900
+    line: 35
+    character: 109
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 900
+    line: 35
+    character: 109
+  end_position:
+    bytes: 901
+    line: 35
+    character: 109
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 901
+    line: 36
+    character: 1
+  end_position:
+    bytes: 902
+    line: 36
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 902
+    line: 37
+    character: 1
+  end_position:
+    bytes: 905
+    line: 37
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 905
+    line: 37
+    character: 4
+  end_position:
+    bytes: 907
+    line: 37
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 907
+    line: 37
+    character: 6
+  end_position:
+    bytes: 908
+    line: 37
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 908
+    line: 37
+    character: 7
+  end_position:
+    bytes: 911
+    line: 37
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 911
+    line: 37
+    character: 10
+  end_position:
+    bytes: 912
+    line: 37
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 912
+    line: 37
+    character: 11
+  end_position:
+    bytes: 915
+    line: 37
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: and
+- start_position:
+    bytes: 915
+    line: 37
+    character: 14
+  end_position:
+    bytes: 916
+    line: 37
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 916
+    line: 37
+    character: 15
+  end_position:
+    bytes: 919
+    line: 37
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 919
+    line: 37
+    character: 18
+  end_position:
+    bytes: 920
+    line: 37
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 920
+    line: 37
+    character: 19
+  end_position:
+    bytes: 934
+    line: 37
+    character: 33
+  token_type:
+    type: Identifier
+    identifier: IsDescendantOf
+- start_position:
+    bytes: 934
+    line: 37
+    character: 33
+  end_position:
+    bytes: 935
+    line: 37
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 935
+    line: 37
+    character: 34
+  end_position:
+    bytes: 944
+    line: 37
+    character: 43
+  token_type:
+    type: Identifier
+    identifier: character
+- start_position:
+    bytes: 944
+    line: 37
+    character: 43
+  end_position:
+    bytes: 945
+    line: 37
+    character: 44
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 945
+    line: 37
+    character: 44
+  end_position:
+    bytes: 946
+    line: 37
+    character: 45
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 946
+    line: 37
+    character: 45
+  end_position:
+    bytes: 950
+    line: 37
+    character: 49
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 950
+    line: 37
+    character: 49
+  end_position:
+    bytes: 951
+    line: 37
+    character: 49
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 951
+    line: 38
+    character: 1
+  end_position:
+    bytes: 955
+    line: 38
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t\t"
+- start_position:
+    bytes: 955
+    line: 38
+    character: 5
+  end_position:
+    bytes: 960
+    line: 38
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: break
+- start_position:
+    bytes: 960
+    line: 38
+    character: 10
+  end_position:
+    bytes: 961
+    line: 38
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 961
+    line: 39
+    character: 1
+  end_position:
+    bytes: 964
+    line: 39
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 964
+    line: 39
+    character: 4
+  end_position:
+    bytes: 970
+    line: 39
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: elseif
+- start_position:
+    bytes: 970
+    line: 39
+    character: 10
+  end_position:
+    bytes: 971
+    line: 39
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 971
+    line: 39
+    character: 11
+  end_position:
+    bytes: 974
+    line: 39
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 974
+    line: 39
+    character: 14
+  end_position:
+    bytes: 975
+    line: 39
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 975
+    line: 39
+    character: 15
+  end_position:
+    bytes: 978
+    line: 39
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: and
+- start_position:
+    bytes: 978
+    line: 39
+    character: 18
+  end_position:
+    bytes: 979
+    line: 39
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 979
+    line: 39
+    character: 19
+  end_position:
+    bytes: 987
+    line: 39
+    character: 27
+  token_type:
+    type: Identifier
+    identifier: ignoreIf
+- start_position:
+    bytes: 987
+    line: 39
+    character: 27
+  end_position:
+    bytes: 988
+    line: 39
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 988
+    line: 39
+    character: 28
+  end_position:
+    bytes: 991
+    line: 39
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 991
+    line: 39
+    character: 31
+  end_position:
+    bytes: 992
+    line: 39
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 992
+    line: 39
+    character: 32
+  end_position:
+    bytes: 993
+    line: 39
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 993
+    line: 39
+    character: 33
+  end_position:
+    bytes: 997
+    line: 39
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 997
+    line: 39
+    character: 37
+  end_position:
+    bytes: 998
+    line: 39
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 998
+    line: 40
+    character: 1
+  end_position:
+    bytes: 1002
+    line: 40
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t\t"
+- start_position:
+    bytes: 1002
+    line: 40
+    character: 5
+  end_position:
+    bytes: 1007
+    line: 40
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: debug
+- start_position:
+    bytes: 1007
+    line: 40
+    character: 10
+  end_position:
+    bytes: 1008
+    line: 40
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 1008
+    line: 40
+    character: 11
+  end_position:
+    bytes: 1025
+    line: 40
+    character: 28
+  token_type:
+    type: StringLiteral
+    literal: IGNORING OFF IF
+    quote_type: Double
+- start_position:
+    bytes: 1025
+    line: 40
+    character: 28
+  end_position:
+    bytes: 1026
+    line: 40
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 1026
+    line: 40
+    character: 29
+  end_position:
+    bytes: 1027
+    line: 40
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1027
+    line: 40
+    character: 30
+  end_position:
+    bytes: 1030
+    line: 40
+    character: 33
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 1030
+    line: 40
+    character: 33
+  end_position:
+    bytes: 1031
+    line: 40
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 1031
+    line: 40
+    character: 34
+  end_position:
+    bytes: 1042
+    line: 40
+    character: 45
+  token_type:
+    type: Identifier
+    identifier: GetFullName
+- start_position:
+    bytes: 1042
+    line: 40
+    character: 45
+  end_position:
+    bytes: 1043
+    line: 40
+    character: 46
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 1043
+    line: 40
+    character: 46
+  end_position:
+    bytes: 1044
+    line: 40
+    character: 47
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 1044
+    line: 40
+    character: 47
+  end_position:
+    bytes: 1045
+    line: 40
+    character: 48
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 1045
+    line: 40
+    character: 48
+  end_position:
+    bytes: 1046
+    line: 40
+    character: 48
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1046
+    line: 41
+    character: 1
+  end_position:
+    bytes: 1050
+    line: 41
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t\t"
+- start_position:
+    bytes: 1050
+    line: 41
+    character: 5
+  end_position:
+    bytes: 1059
+    line: 41
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: blacklist
+- start_position:
+    bytes: 1059
+    line: 41
+    character: 14
+  end_position:
+    bytes: 1060
+    line: 41
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 1060
+    line: 41
+    character: 15
+  end_position:
+    bytes: 1061
+    line: 41
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "#"
+- start_position:
+    bytes: 1061
+    line: 41
+    character: 16
+  end_position:
+    bytes: 1070
+    line: 41
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: blacklist
+- start_position:
+    bytes: 1070
+    line: 41
+    character: 25
+  end_position:
+    bytes: 1071
+    line: 41
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1071
+    line: 41
+    character: 26
+  end_position:
+    bytes: 1072
+    line: 41
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 1072
+    line: 41
+    character: 27
+  end_position:
+    bytes: 1073
+    line: 41
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1073
+    line: 41
+    character: 28
+  end_position:
+    bytes: 1074
+    line: 41
+    character: 29
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 1074
+    line: 41
+    character: 29
+  end_position:
+    bytes: 1075
+    line: 41
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 1075
+    line: 41
+    character: 30
+  end_position:
+    bytes: 1076
+    line: 41
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1076
+    line: 41
+    character: 31
+  end_position:
+    bytes: 1077
+    line: 41
+    character: 32
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 1077
+    line: 41
+    character: 32
+  end_position:
+    bytes: 1078
+    line: 41
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1078
+    line: 41
+    character: 33
+  end_position:
+    bytes: 1081
+    line: 41
+    character: 36
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 1081
+    line: 41
+    character: 36
+  end_position:
+    bytes: 1082
+    line: 41
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1082
+    line: 42
+    character: 1
+  end_position:
+    bytes: 1085
+    line: 42
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 1085
+    line: 42
+    character: 4
+  end_position:
+    bytes: 1089
+    line: 42
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: else
+- start_position:
+    bytes: 1089
+    line: 42
+    character: 8
+  end_position:
+    bytes: 1090
+    line: 42
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1090
+    line: 43
+    character: 1
+  end_position:
+    bytes: 1094
+    line: 43
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t\t"
+- start_position:
+    bytes: 1094
+    line: 43
+    character: 5
+  end_position:
+    bytes: 1099
+    line: 43
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: break
+- start_position:
+    bytes: 1099
+    line: 43
+    character: 10
+  end_position:
+    bytes: 1100
+    line: 43
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1100
+    line: 44
+    character: 1
+  end_position:
+    bytes: 1103
+    line: 44
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\t\t\t"
+- start_position:
+    bytes: 1103
+    line: 44
+    character: 4
+  end_position:
+    bytes: 1106
+    line: 44
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 1106
+    line: 44
+    character: 7
+  end_position:
+    bytes: 1107
+    line: 44
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1107
+    line: 45
+    character: 1
+  end_position:
+    bytes: 1109
+    line: 45
+    character: 3
+  token_type:
+    type: Whitespace
+    characters: "\t\t"
+- start_position:
+    bytes: 1109
+    line: 45
+    character: 3
+  end_position:
+    bytes: 1112
+    line: 45
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 1112
+    line: 45
+    character: 6
+  end_position:
+    bytes: 1113
+    line: 45
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1113
+    line: 46
+    character: 1
+  end_position:
+    bytes: 1114
+    line: 46
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 1114
+    line: 46
+    character: 2
+  end_position:
+    bytes: 1117
+    line: 46
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 1117
+    line: 46
+    character: 5
+  end_position:
+    bytes: 1118
+    line: 46
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1118
+    line: 47
+    character: 1
+  end_position:
+    bytes: 1119
+    line: 47
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1119
+    line: 48
+    character: 1
+  end_position:
+    bytes: 1120
+    line: 48
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 1120
+    line: 48
+    character: 2
+  end_position:
+    bytes: 1125
+    line: 48
+    character: 7
+  token_type:
+    type: Identifier
+    identifier: debug
+- start_position:
+    bytes: 1125
+    line: 48
+    character: 7
+  end_position:
+    bytes: 1126
+    line: 48
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 1126
+    line: 48
+    character: 8
+  end_position:
+    bytes: 1138
+    line: 48
+    character: 20
+  token_type:
+    type: StringLiteral
+    literal: LOS RESULT
+    quote_type: Double
+- start_position:
+    bytes: 1138
+    line: 48
+    character: 20
+  end_position:
+    bytes: 1139
+    line: 48
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 1139
+    line: 48
+    character: 21
+  end_position:
+    bytes: 1140
+    line: 48
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1140
+    line: 48
+    character: 22
+  end_position:
+    bytes: 1143
+    line: 48
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 1143
+    line: 48
+    character: 25
+  end_position:
+    bytes: 1144
+    line: 48
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1144
+    line: 48
+    character: 26
+  end_position:
+    bytes: 1147
+    line: 48
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: and
+- start_position:
+    bytes: 1147
+    line: 48
+    character: 29
+  end_position:
+    bytes: 1148
+    line: 48
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1148
+    line: 48
+    character: 30
+  end_position:
+    bytes: 1151
+    line: 48
+    character: 33
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 1151
+    line: 48
+    character: 33
+  end_position:
+    bytes: 1152
+    line: 48
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 1152
+    line: 48
+    character: 34
+  end_position:
+    bytes: 1163
+    line: 48
+    character: 45
+  token_type:
+    type: Identifier
+    identifier: GetFullName
+- start_position:
+    bytes: 1163
+    line: 48
+    character: 45
+  end_position:
+    bytes: 1164
+    line: 48
+    character: 46
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 1164
+    line: 48
+    character: 46
+  end_position:
+    bytes: 1165
+    line: 48
+    character: 47
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 1165
+    line: 48
+    character: 47
+  end_position:
+    bytes: 1166
+    line: 48
+    character: 48
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 1166
+    line: 48
+    character: 48
+  end_position:
+    bytes: 1167
+    line: 48
+    character: 48
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1167
+    line: 49
+    character: 1
+  end_position:
+    bytes: 1168
+    line: 49
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1168
+    line: 50
+    character: 1
+  end_position:
+    bytes: 1169
+    line: 50
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 1169
+    line: 50
+    character: 2
+  end_position:
+    bytes: 1175
+    line: 50
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 1175
+    line: 50
+    character: 8
+  end_position:
+    bytes: 1176
+    line: 50
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1176
+    line: 50
+    character: 9
+  end_position:
+    bytes: 1179
+    line: 50
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 1179
+    line: 50
+    character: 12
+  end_position:
+    bytes: 1180
+    line: 50
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1180
+    line: 50
+    character: 13
+  end_position:
+    bytes: 1183
+    line: 50
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: and
+- start_position:
+    bytes: 1183
+    line: 50
+    character: 16
+  end_position:
+    bytes: 1184
+    line: 50
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1184
+    line: 50
+    character: 17
+  end_position:
+    bytes: 1187
+    line: 50
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: hit
+- start_position:
+    bytes: 1187
+    line: 50
+    character: 20
+  end_position:
+    bytes: 1188
+    line: 50
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 1188
+    line: 50
+    character: 21
+  end_position:
+    bytes: 1202
+    line: 50
+    character: 35
+  token_type:
+    type: Identifier
+    identifier: IsDescendantOf
+- start_position:
+    bytes: 1202
+    line: 50
+    character: 35
+  end_position:
+    bytes: 1203
+    line: 50
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 1203
+    line: 50
+    character: 36
+  end_position:
+    bytes: 1212
+    line: 50
+    character: 45
+  token_type:
+    type: Identifier
+    identifier: character
+- start_position:
+    bytes: 1212
+    line: 50
+    character: 45
+  end_position:
+    bytes: 1213
+    line: 50
+    character: 46
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 1213
+    line: 50
+    character: 46
+  end_position:
+    bytes: 1214
+    line: 50
+    character: 47
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 1214
+    line: 50
+    character: 47
+  end_position:
+    bytes: 1215
+    line: 50
+    character: 48
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 1215
+    line: 50
+    character: 48
+  end_position:
+    bytes: 1220
+    line: 50
+    character: 53
+  token_type:
+    type: Identifier
+    identifier: point
+- start_position:
+    bytes: 1220
+    line: 50
+    character: 53
+  end_position:
+    bytes: 1221
+    line: 50
+    character: 53
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1221
+    line: 51
+    character: 1
+  end_position:
+    bytes: 1224
+    line: 51
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 1224
+    line: 51
+    character: 4
+  end_position:
+    bytes: 1225
+    line: 51
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 1225
+    line: 52
+    character: 1
+  end_position:
+    bytes: 1225
+    line: 52
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/ast.snap
new file mode 100644
index 00000000..57bbae68
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/ast.snap
@@ -0,0 +1,3823 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/roblox_cases/pass/types
+---
+stmts:
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: SingleLineComment
+                comment: "!strict"
+            - start_position:
+                bytes: 9
+                line: 1
+                character: 10
+              end_position:
+                bytes: 10
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 10
+              line: 2
+              character: 1
+            end_position:
+              bytes: 15
+              line: 2
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 15
+                line: 2
+                character: 6
+              end_position:
+                bytes: 16
+                line: 2
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 16
+                    line: 2
+                    character: 7
+                  end_position:
+                    bytes: 20
+                    line: 2
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: _fn3
+                trailing_trivia:
+                  - start_position:
+                      bytes: 20
+                      line: 2
+                      character: 11
+                    end_position:
+                      bytes: 21
+                      line: 2
+                      character: 11
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 21
+              line: 3
+              character: 1
+            end_position:
+              bytes: 25
+              line: 3
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 25
+                line: 3
+                character: 5
+              end_position:
+                bytes: 26
+                line: 3
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 26
+              line: 3
+              character: 6
+            end_position:
+              bytes: 32
+              line: 3
+              character: 12
+            token_type:
+              type: Identifier
+              identifier: Object
+          trailing_trivia:
+            - start_position:
+                bytes: 32
+                line: 3
+                character: 12
+              end_position:
+                bytes: 33
+                line: 3
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 33
+              line: 3
+              character: 13
+            end_position:
+              bytes: 34
+              line: 3
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 34
+                line: 3
+                character: 14
+              end_position:
+                bytes: 35
+                line: 3
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Table:
+            braces:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 35
+                      line: 3
+                      character: 15
+                    end_position:
+                      bytes: 36
+                      line: 3
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: "{"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 36
+                        line: 3
+                        character: 16
+                      end_position:
+                        bytes: 37
+                        line: 3
+                        character: 17
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 58
+                      line: 3
+                      character: 38
+                    end_position:
+                      bytes: 59
+                      line: 3
+                      character: 39
+                    token_type:
+                      type: Symbol
+                      symbol: "}"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 59
+                        line: 3
+                        character: 39
+                      end_position:
+                        bytes: 60
+                        line: 3
+                        character: 39
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            fields:
+              pairs:
+                - Punctuated:
+                    - key:
+                        Name:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 37
+                              line: 3
+                              character: 17
+                            end_position:
+                              bytes: 38
+                              line: 3
+                              character: 18
+                            token_type:
+                              type: Identifier
+                              identifier: x
+                          trailing_trivia: []
+                      colon:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 38
+                            line: 3
+                            character: 18
+                          end_position:
+                            bytes: 39
+                            line: 3
+                            character: 19
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 39
+                              line: 3
+                              character: 19
+                            end_position:
+                              bytes: 40
+                              line: 3
+                              character: 20
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      value:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 40
+                              line: 3
+                              character: 20
+                            end_position:
+                              bytes: 46
+                              line: 3
+                              character: 26
+                            token_type:
+                              type: Identifier
+                              identifier: number
+                          trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 46
+                          line: 3
+                          character: 26
+                        end_position:
+                          bytes: 47
+                          line: 3
+                          character: 27
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 47
+                            line: 3
+                            character: 27
+                          end_position:
+                            bytes: 48
+                            line: 3
+                            character: 28
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                - End:
+                    key:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 48
+                            line: 3
+                            character: 28
+                          end_position:
+                            bytes: 49
+                            line: 3
+                            character: 29
+                          token_type:
+                            type: Identifier
+                            identifier: y
+                        trailing_trivia: []
+                    colon:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 49
+                          line: 3
+                          character: 29
+                        end_position:
+                          bytes: 50
+                          line: 3
+                          character: 30
+                        token_type:
+                          type: Symbol
+                          symbol: ":"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 50
+                            line: 3
+                            character: 30
+                          end_position:
+                            bytes: 51
+                            line: 3
+                            character: 31
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    value:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 51
+                            line: 3
+                            character: 31
+                          end_position:
+                            bytes: 57
+                            line: 3
+                            character: 37
+                          token_type:
+                            type: Identifier
+                            identifier: number
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 57
+                              line: 3
+                              character: 37
+                            end_position:
+                              bytes: 58
+                              line: 3
+                              character: 38
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 60
+              line: 4
+              character: 1
+            end_position:
+              bytes: 64
+              line: 4
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 64
+                line: 4
+                character: 5
+              end_position:
+                bytes: 65
+                line: 4
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 65
+              line: 4
+              character: 6
+            end_position:
+              bytes: 71
+              line: 4
+              character: 12
+            token_type:
+              type: Identifier
+              identifier: Typeof
+          trailing_trivia:
+            - start_position:
+                bytes: 71
+                line: 4
+                character: 12
+              end_position:
+                bytes: 72
+                line: 4
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 72
+              line: 4
+              character: 13
+            end_position:
+              bytes: 73
+              line: 4
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 73
+                line: 4
+                character: 14
+              end_position:
+                bytes: 74
+                line: 4
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Typeof:
+            typeof_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 74
+                  line: 4
+                  character: 15
+                end_position:
+                  bytes: 80
+                  line: 4
+                  character: 21
+                token_type:
+                  type: Identifier
+                  identifier: typeof
+              trailing_trivia: []
+            parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 80
+                      line: 4
+                      character: 21
+                    end_position:
+                      bytes: 81
+                      line: 4
+                      character: 22
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 95
+                      line: 4
+                      character: 36
+                    end_position:
+                      bytes: 96
+                      line: 4
+                      character: 37
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 96
+                        line: 4
+                        character: 37
+                      end_position:
+                        bytes: 97
+                        line: 4
+                        character: 37
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            inner:
+              BinaryOperator:
+                lhs:
+                  BinaryOperator:
+                    lhs:
+                      Number:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 81
+                            line: 4
+                            character: 22
+                          end_position:
+                            bytes: 82
+                            line: 4
+                            character: 23
+                          token_type:
+                            type: Number
+                            text: "2"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 82
+                              line: 4
+                              character: 23
+                            end_position:
+                              bytes: 83
+                              line: 4
+                              character: 24
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                    binop:
+                      Plus:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 83
+                            line: 4
+                            character: 24
+                          end_position:
+                            bytes: 84
+                            line: 4
+                            character: 25
+                          token_type:
+                            type: Symbol
+                            symbol: +
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 84
+                              line: 4
+                              character: 25
+                            end_position:
+                              bytes: 85
+                              line: 4
+                              character: 26
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                    rhs:
+                      Number:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 85
+                            line: 4
+                            character: 26
+                          end_position:
+                            bytes: 86
+                            line: 4
+                            character: 27
+                          token_type:
+                            type: Number
+                            text: "2"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 86
+                              line: 4
+                              character: 27
+                            end_position:
+                              bytes: 87
+                              line: 4
+                              character: 28
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                binop:
+                  Plus:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 87
+                        line: 4
+                        character: 28
+                      end_position:
+                        bytes: 88
+                        line: 4
+                        character: 29
+                      token_type:
+                        type: Symbol
+                        symbol: +
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 88
+                          line: 4
+                          character: 29
+                        end_position:
+                          bytes: 89
+                          line: 4
+                          character: 30
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                rhs:
+                  FunctionCall:
+                    prefix:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 89
+                            line: 4
+                            character: 30
+                          end_position:
+                            bytes: 93
+                            line: 4
+                            character: 34
+                          token_type:
+                            type: Identifier
+                            identifier: _fn3
+                        trailing_trivia: []
+                    suffixes:
+                      - Call:
+                          AnonymousCall:
+                            Parentheses:
+                              parentheses:
+                                tokens:
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 93
+                                        line: 4
+                                        character: 34
+                                      end_position:
+                                        bytes: 94
+                                        line: 4
+                                        character: 35
+                                      token_type:
+                                        type: Symbol
+                                        symbol: (
+                                    trailing_trivia: []
+                                  - leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 94
+                                        line: 4
+                                        character: 35
+                                      end_position:
+                                        bytes: 95
+                                        line: 4
+                                        character: 36
+                                      token_type:
+                                        type: Symbol
+                                        symbol: )
+                                    trailing_trivia: []
+                              arguments:
+                                pairs: []
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 97
+              line: 5
+              character: 1
+            end_position:
+              bytes: 101
+              line: 5
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 101
+                line: 5
+                character: 5
+              end_position:
+                bytes: 102
+                line: 5
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 102
+              line: 5
+              character: 6
+            end_position:
+              bytes: 109
+              line: 5
+              character: 13
+            token_type:
+              type: Identifier
+              identifier: Element
+          trailing_trivia:
+            - start_position:
+                bytes: 109
+                line: 5
+                character: 13
+              end_position:
+                bytes: 110
+                line: 5
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 110
+              line: 5
+              character: 14
+            end_position:
+              bytes: 111
+              line: 5
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 111
+                line: 5
+                character: 15
+              end_position:
+                bytes: 112
+                line: 5
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Table:
+            braces:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 112
+                      line: 5
+                      character: 16
+                    end_position:
+                      bytes: 113
+                      line: 5
+                      character: 17
+                    token_type:
+                      type: Symbol
+                      symbol: "{"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 113
+                        line: 5
+                        character: 17
+                      end_position:
+                        bytes: 114
+                        line: 5
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 131
+                      line: 5
+                      character: 35
+                    end_position:
+                      bytes: 132
+                      line: 5
+                      character: 36
+                    token_type:
+                      type: Symbol
+                      symbol: "}"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 132
+                        line: 5
+                        character: 36
+                      end_position:
+                        bytes: 133
+                        line: 5
+                        character: 36
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            fields:
+              pairs:
+                - End:
+                    key:
+                      IndexSignature:
+                        brackets:
+                          tokens:
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 114
+                                  line: 5
+                                  character: 18
+                                end_position:
+                                  bytes: 115
+                                  line: 5
+                                  character: 19
+                                token_type:
+                                  type: Symbol
+                                  symbol: "["
+                              trailing_trivia: []
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 121
+                                  line: 5
+                                  character: 25
+                                end_position:
+                                  bytes: 122
+                                  line: 5
+                                  character: 26
+                                token_type:
+                                  type: Symbol
+                                  symbol: "]"
+                              trailing_trivia: []
+                        inner:
+                          Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 115
+                                line: 5
+                                character: 19
+                              end_position:
+                                bytes: 121
+                                line: 5
+                                character: 25
+                              token_type:
+                                type: Identifier
+                                identifier: string
+                            trailing_trivia: []
+                    colon:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 122
+                          line: 5
+                          character: 26
+                        end_position:
+                          bytes: 123
+                          line: 5
+                          character: 27
+                        token_type:
+                          type: Symbol
+                          symbol: ":"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 123
+                            line: 5
+                            character: 27
+                          end_position:
+                            bytes: 124
+                            line: 5
+                            character: 28
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    value:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 124
+                            line: 5
+                            character: 28
+                          end_position:
+                            bytes: 130
+                            line: 5
+                            character: 34
+                          token_type:
+                            type: Identifier
+                            identifier: number
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 130
+                              line: 5
+                              character: 34
+                            end_position:
+                              bytes: 131
+                              line: 5
+                              character: 35
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia:
+            - start_position:
+                bytes: 133
+                line: 6
+                character: 1
+              end_position:
+                bytes: 134
+                line: 6
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 134
+              line: 7
+              character: 1
+            end_position:
+              bytes: 138
+              line: 7
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 138
+                line: 7
+                character: 5
+              end_position:
+                bytes: 139
+                line: 7
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 139
+              line: 7
+              character: 6
+            end_position:
+              bytes: 148
+              line: 7
+              character: 15
+            token_type:
+              type: Identifier
+              identifier: Callback1
+          trailing_trivia:
+            - start_position:
+                bytes: 148
+                line: 7
+                character: 15
+              end_position:
+                bytes: 149
+                line: 7
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 149
+              line: 7
+              character: 16
+            end_position:
+              bytes: 150
+              line: 7
+              character: 17
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 150
+                line: 7
+                character: 17
+              end_position:
+                bytes: 151
+                line: 7
+                character: 18
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Callback:
+            parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 151
+                      line: 7
+                      character: 18
+                    end_position:
+                      bytes: 152
+                      line: 7
+                      character: 19
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 158
+                      line: 7
+                      character: 25
+                    end_position:
+                      bytes: 159
+                      line: 7
+                      character: 26
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 159
+                        line: 7
+                        character: 26
+                      end_position:
+                        bytes: 160
+                        line: 7
+                        character: 27
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            arguments:
+              pairs:
+                - End:
+                    name: ~
+                    type_info:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 152
+                            line: 7
+                            character: 19
+                          end_position:
+                            bytes: 158
+                            line: 7
+                            character: 25
+                          token_type:
+                            type: Identifier
+                            identifier: string
+                        trailing_trivia: []
+            arrow:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 160
+                  line: 7
+                  character: 27
+                end_position:
+                  bytes: 162
+                  line: 7
+                  character: 29
+                token_type:
+                  type: Symbol
+                  symbol: "->"
+              trailing_trivia:
+                - start_position:
+                    bytes: 162
+                    line: 7
+                    character: 29
+                  end_position:
+                    bytes: 163
+                    line: 7
+                    character: 30
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            return_type:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 163
+                    line: 7
+                    character: 30
+                  end_position:
+                    bytes: 169
+                    line: 7
+                    character: 36
+                  token_type:
+                    type: Identifier
+                    identifier: number
+                trailing_trivia:
+                  - start_position:
+                      bytes: 169
+                      line: 7
+                      character: 36
+                    end_position:
+                      bytes: 170
+                      line: 7
+                      character: 36
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 170
+              line: 8
+              character: 1
+            end_position:
+              bytes: 174
+              line: 8
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 174
+                line: 8
+                character: 5
+              end_position:
+                bytes: 175
+                line: 8
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 175
+              line: 8
+              character: 6
+            end_position:
+              bytes: 184
+              line: 8
+              character: 15
+            token_type:
+              type: Identifier
+              identifier: Callback2
+          trailing_trivia:
+            - start_position:
+                bytes: 184
+                line: 8
+                character: 15
+              end_position:
+                bytes: 185
+                line: 8
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 185
+              line: 8
+              character: 16
+            end_position:
+              bytes: 186
+              line: 8
+              character: 17
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 186
+                line: 8
+                character: 17
+              end_position:
+                bytes: 187
+                line: 8
+                character: 18
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Callback:
+            parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 187
+                      line: 8
+                      character: 18
+                    end_position:
+                      bytes: 188
+                      line: 8
+                      character: 19
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 202
+                      line: 8
+                      character: 33
+                    end_position:
+                      bytes: 203
+                      line: 8
+                      character: 34
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 203
+                        line: 8
+                        character: 34
+                      end_position:
+                        bytes: 204
+                        line: 8
+                        character: 35
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            arguments:
+              pairs:
+                - Punctuated:
+                    - name: ~
+                      type_info:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 188
+                              line: 8
+                              character: 19
+                            end_position:
+                              bytes: 194
+                              line: 8
+                              character: 25
+                            token_type:
+                              type: Identifier
+                              identifier: string
+                          trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 194
+                          line: 8
+                          character: 25
+                        end_position:
+                          bytes: 195
+                          line: 8
+                          character: 26
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 195
+                            line: 8
+                            character: 26
+                          end_position:
+                            bytes: 196
+                            line: 8
+                            character: 27
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                - End:
+                    name: ~
+                    type_info:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 196
+                            line: 8
+                            character: 27
+                          end_position:
+                            bytes: 202
+                            line: 8
+                            character: 33
+                          token_type:
+                            type: Identifier
+                            identifier: string
+                        trailing_trivia: []
+            arrow:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 204
+                  line: 8
+                  character: 35
+                end_position:
+                  bytes: 206
+                  line: 8
+                  character: 37
+                token_type:
+                  type: Symbol
+                  symbol: "->"
+              trailing_trivia:
+                - start_position:
+                    bytes: 206
+                    line: 8
+                    character: 37
+                  end_position:
+                    bytes: 207
+                    line: 8
+                    character: 38
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            return_type:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 207
+                    line: 8
+                    character: 38
+                  end_position:
+                    bytes: 213
+                    line: 8
+                    character: 44
+                  token_type:
+                    type: Identifier
+                    identifier: number
+                trailing_trivia:
+                  - start_position:
+                      bytes: 213
+                      line: 8
+                      character: 44
+                    end_position:
+                      bytes: 214
+                      line: 8
+                      character: 44
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 214
+              line: 9
+              character: 1
+            end_position:
+              bytes: 218
+              line: 9
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 218
+                line: 9
+                character: 5
+              end_position:
+                bytes: 219
+                line: 9
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 219
+              line: 9
+              character: 6
+            end_position:
+              bytes: 228
+              line: 9
+              character: 15
+            token_type:
+              type: Identifier
+              identifier: Callback3
+          trailing_trivia:
+            - start_position:
+                bytes: 228
+                line: 9
+                character: 15
+              end_position:
+                bytes: 229
+                line: 9
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 229
+              line: 9
+              character: 16
+            end_position:
+              bytes: 230
+              line: 9
+              character: 17
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 230
+                line: 9
+                character: 17
+              end_position:
+                bytes: 231
+                line: 9
+                character: 18
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Callback:
+            parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 231
+                      line: 9
+                      character: 18
+                    end_position:
+                      bytes: 232
+                      line: 9
+                      character: 19
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 246
+                      line: 9
+                      character: 33
+                    end_position:
+                      bytes: 247
+                      line: 9
+                      character: 34
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 247
+                        line: 9
+                        character: 34
+                      end_position:
+                        bytes: 248
+                        line: 9
+                        character: 35
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            arguments:
+              pairs:
+                - Punctuated:
+                    - name: ~
+                      type_info:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 232
+                              line: 9
+                              character: 19
+                            end_position:
+                              bytes: 238
+                              line: 9
+                              character: 25
+                            token_type:
+                              type: Identifier
+                              identifier: string
+                          trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 238
+                          line: 9
+                          character: 25
+                        end_position:
+                          bytes: 239
+                          line: 9
+                          character: 26
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 239
+                            line: 9
+                            character: 26
+                          end_position:
+                            bytes: 240
+                            line: 9
+                            character: 27
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                - End:
+                    name: ~
+                    type_info:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 240
+                            line: 9
+                            character: 27
+                          end_position:
+                            bytes: 246
+                            line: 9
+                            character: 33
+                          token_type:
+                            type: Identifier
+                            identifier: string
+                        trailing_trivia: []
+            arrow:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 248
+                  line: 9
+                  character: 35
+                end_position:
+                  bytes: 250
+                  line: 9
+                  character: 37
+                token_type:
+                  type: Symbol
+                  symbol: "->"
+              trailing_trivia:
+                - start_position:
+                    bytes: 250
+                    line: 9
+                    character: 37
+                  end_position:
+                    bytes: 251
+                    line: 9
+                    character: 38
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            return_type:
+              Tuple:
+                parentheses:
+                  tokens:
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 251
+                          line: 9
+                          character: 38
+                        end_position:
+                          bytes: 252
+                          line: 9
+                          character: 39
+                        token_type:
+                          type: Symbol
+                          symbol: (
+                      trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 263
+                          line: 9
+                          character: 50
+                        end_position:
+                          bytes: 264
+                          line: 9
+                          character: 51
+                        token_type:
+                          type: Symbol
+                          symbol: )
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 264
+                            line: 9
+                            character: 51
+                          end_position:
+                            bytes: 265
+                            line: 9
+                            character: 51
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                types:
+                  pairs:
+                    - Punctuated:
+                        - Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 252
+                                line: 9
+                                character: 39
+                              end_position:
+                                bytes: 258
+                                line: 9
+                                character: 45
+                              token_type:
+                                type: Identifier
+                                identifier: string
+                            trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 258
+                              line: 9
+                              character: 45
+                            end_position:
+                              bytes: 259
+                              line: 9
+                              character: 46
+                            token_type:
+                              type: Symbol
+                              symbol: ","
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 259
+                                line: 9
+                                character: 46
+                              end_position:
+                                bytes: 260
+                                line: 9
+                                character: 47
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                    - End:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 260
+                              line: 9
+                              character: 47
+                            end_position:
+                              bytes: 263
+                              line: 9
+                              character: 50
+                            token_type:
+                              type: Symbol
+                              symbol: nil
+                          trailing_trivia: []
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 265
+              line: 10
+              character: 1
+            end_position:
+              bytes: 269
+              line: 10
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 269
+                line: 10
+                character: 5
+              end_position:
+                bytes: 270
+                line: 10
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 270
+              line: 10
+              character: 6
+            end_position:
+              bytes: 279
+              line: 10
+              character: 15
+            token_type:
+              type: Identifier
+              identifier: Callback4
+          trailing_trivia:
+            - start_position:
+                bytes: 279
+                line: 10
+                character: 15
+              end_position:
+                bytes: 280
+                line: 10
+                character: 16
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 280
+              line: 10
+              character: 16
+            end_position:
+              bytes: 281
+              line: 10
+              character: 17
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 281
+                line: 10
+                character: 17
+              end_position:
+                bytes: 282
+                line: 10
+                character: 18
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Callback:
+            parentheses:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 282
+                      line: 10
+                      character: 18
+                    end_position:
+                      bytes: 283
+                      line: 10
+                      character: 19
+                    token_type:
+                      type: Symbol
+                      symbol: (
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 289
+                      line: 10
+                      character: 25
+                    end_position:
+                      bytes: 290
+                      line: 10
+                      character: 26
+                    token_type:
+                      type: Symbol
+                      symbol: )
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 290
+                        line: 10
+                        character: 26
+                      end_position:
+                        bytes: 291
+                        line: 10
+                        character: 27
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            arguments:
+              pairs:
+                - End:
+                    name: ~
+                    type_info:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 283
+                            line: 10
+                            character: 19
+                          end_position:
+                            bytes: 289
+                            line: 10
+                            character: 25
+                          token_type:
+                            type: Identifier
+                            identifier: string
+                        trailing_trivia: []
+            arrow:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 291
+                  line: 10
+                  character: 27
+                end_position:
+                  bytes: 293
+                  line: 10
+                  character: 29
+                token_type:
+                  type: Symbol
+                  symbol: "->"
+              trailing_trivia:
+                - start_position:
+                    bytes: 293
+                    line: 10
+                    character: 29
+                  end_position:
+                    bytes: 294
+                    line: 10
+                    character: 30
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            return_type:
+              Callback:
+                parentheses:
+                  tokens:
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 294
+                          line: 10
+                          character: 30
+                        end_position:
+                          bytes: 295
+                          line: 10
+                          character: 31
+                        token_type:
+                          type: Symbol
+                          symbol: (
+                      trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 301
+                          line: 10
+                          character: 37
+                        end_position:
+                          bytes: 302
+                          line: 10
+                          character: 38
+                        token_type:
+                          type: Symbol
+                          symbol: )
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 302
+                            line: 10
+                            character: 38
+                          end_position:
+                            bytes: 303
+                            line: 10
+                            character: 39
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                arguments:
+                  pairs:
+                    - End:
+                        name: ~
+                        type_info:
+                          Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 295
+                                line: 10
+                                character: 31
+                              end_position:
+                                bytes: 301
+                                line: 10
+                                character: 37
+                              token_type:
+                                type: Identifier
+                                identifier: string
+                            trailing_trivia: []
+                arrow:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 303
+                      line: 10
+                      character: 39
+                    end_position:
+                      bytes: 305
+                      line: 10
+                      character: 41
+                    token_type:
+                      type: Symbol
+                      symbol: "->"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 305
+                        line: 10
+                        character: 41
+                      end_position:
+                        bytes: 306
+                        line: 10
+                        character: 42
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                return_type:
+                  Basic:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 306
+                        line: 10
+                        character: 42
+                      end_position:
+                        bytes: 309
+                        line: 10
+                        character: 45
+                      token_type:
+                        type: Symbol
+                        symbol: nil
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 309
+                          line: 10
+                          character: 45
+                        end_position:
+                          bytes: 310
+                          line: 10
+                          character: 45
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia:
+            - start_position:
+                bytes: 310
+                line: 11
+                character: 1
+              end_position:
+                bytes: 311
+                line: 11
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 311
+              line: 12
+              character: 1
+            end_position:
+              bytes: 315
+              line: 12
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 315
+                line: 12
+                character: 5
+              end_position:
+                bytes: 316
+                line: 12
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 316
+              line: 12
+              character: 6
+            end_position:
+              bytes: 319
+              line: 12
+              character: 9
+            token_type:
+              type: Identifier
+              identifier: Foo
+          trailing_trivia:
+            - start_position:
+                bytes: 319
+                line: 12
+                character: 9
+              end_position:
+                bytes: 320
+                line: 12
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 320
+              line: 12
+              character: 10
+            end_position:
+              bytes: 321
+              line: 12
+              character: 11
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 321
+                line: 12
+                character: 11
+              end_position:
+                bytes: 322
+                line: 12
+                character: 12
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Table:
+            braces:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 322
+                      line: 12
+                      character: 12
+                    end_position:
+                      bytes: 323
+                      line: 12
+                      character: 13
+                    token_type:
+                      type: Symbol
+                      symbol: "{"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 323
+                        line: 12
+                        character: 13
+                      end_position:
+                        bytes: 324
+                        line: 12
+                        character: 13
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 352
+                      line: 15
+                      character: 1
+                    end_position:
+                      bytes: 353
+                      line: 15
+                      character: 2
+                    token_type:
+                      type: Symbol
+                      symbol: "}"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 353
+                        line: 15
+                        character: 2
+                      end_position:
+                        bytes: 354
+                        line: 15
+                        character: 2
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            fields:
+              pairs:
+                - Punctuated:
+                    - key:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 324
+                                line: 13
+                                character: 1
+                              end_position:
+                                bytes: 325
+                                line: 13
+                                character: 2
+                              token_type:
+                                type: Whitespace
+                                characters: "\t"
+                          token:
+                            start_position:
+                              bytes: 325
+                              line: 13
+                              character: 2
+                            end_position:
+                              bytes: 328
+                              line: 13
+                              character: 5
+                            token_type:
+                              type: Identifier
+                              identifier: bar
+                          trailing_trivia: []
+                      colon:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 328
+                            line: 13
+                            character: 5
+                          end_position:
+                            bytes: 329
+                            line: 13
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 329
+                              line: 13
+                              character: 6
+                            end_position:
+                              bytes: 330
+                              line: 13
+                              character: 7
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      value:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 330
+                              line: 13
+                              character: 7
+                            end_position:
+                              bytes: 336
+                              line: 13
+                              character: 13
+                            token_type:
+                              type: Identifier
+                              identifier: number
+                          trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 336
+                          line: 13
+                          character: 13
+                        end_position:
+                          bytes: 337
+                          line: 13
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 337
+                            line: 13
+                            character: 14
+                          end_position:
+                            bytes: 338
+                            line: 13
+                            character: 14
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                - Punctuated:
+                    - key:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 338
+                                line: 14
+                                character: 1
+                              end_position:
+                                bytes: 339
+                                line: 14
+                                character: 2
+                              token_type:
+                                type: Whitespace
+                                characters: "\t"
+                          token:
+                            start_position:
+                              bytes: 339
+                              line: 14
+                              character: 2
+                            end_position:
+                              bytes: 342
+                              line: 14
+                              character: 5
+                            token_type:
+                              type: Identifier
+                              identifier: baz
+                          trailing_trivia: []
+                      colon:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 342
+                            line: 14
+                            character: 5
+                          end_position:
+                            bytes: 343
+                            line: 14
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 343
+                              line: 14
+                              character: 6
+                            end_position:
+                              bytes: 344
+                              line: 14
+                              character: 7
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      value:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 344
+                              line: 14
+                              character: 7
+                            end_position:
+                              bytes: 350
+                              line: 14
+                              character: 13
+                            token_type:
+                              type: Identifier
+                              identifier: number
+                          trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 350
+                          line: 14
+                          character: 13
+                        end_position:
+                          bytes: 351
+                          line: 14
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 351
+                            line: 14
+                            character: 14
+                          end_position:
+                            bytes: 352
+                            line: 14
+                            character: 14
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 354
+                line: 16
+                character: 1
+              end_position:
+                bytes: 355
+                line: 16
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 355
+              line: 17
+              character: 1
+            end_position:
+              bytes: 360
+              line: 17
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 360
+                line: 17
+                character: 6
+              end_position:
+                bytes: 361
+                line: 17
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        type_specifiers:
+          - punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 365
+                  line: 17
+                  character: 11
+                end_position:
+                  bytes: 366
+                  line: 17
+                  character: 12
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 366
+                    line: 17
+                    character: 12
+                  end_position:
+                    bytes: 367
+                    line: 17
+                    character: 13
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 367
+                    line: 17
+                    character: 13
+                  end_position:
+                    bytes: 373
+                    line: 17
+                    character: 19
+                  token_type:
+                    type: Identifier
+                    identifier: number
+                trailing_trivia:
+                  - start_position:
+                      bytes: 373
+                      line: 17
+                      character: 19
+                    end_position:
+                      bytes: 374
+                      line: 17
+                      character: 20
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 361
+                    line: 17
+                    character: 7
+                  end_position:
+                    bytes: 365
+                    line: 17
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: foo0
+                trailing_trivia: []
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 374
+              line: 17
+              character: 20
+            end_position:
+              bytes: 375
+              line: 17
+              character: 21
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 375
+                line: 17
+                character: 21
+              end_position:
+                bytes: 376
+                line: 17
+                character: 22
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 376
+                      line: 17
+                      character: 22
+                    end_position:
+                      bytes: 377
+                      line: 17
+                      character: 23
+                    token_type:
+                      type: Number
+                      text: "3"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 377
+                        line: 17
+                        character: 23
+                      end_position:
+                        bytes: 378
+                        line: 17
+                        character: 23
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 378
+              line: 18
+              character: 1
+            end_position:
+              bytes: 383
+              line: 18
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 383
+                line: 18
+                character: 6
+              end_position:
+                bytes: 384
+                line: 18
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        type_specifiers:
+          - punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 389
+                  line: 18
+                  character: 12
+                end_position:
+                  bytes: 390
+                  line: 18
+                  character: 13
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 390
+                    line: 18
+                    character: 13
+                  end_position:
+                    bytes: 391
+                    line: 18
+                    character: 14
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Optional:
+                base:
+                  Basic:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 391
+                        line: 18
+                        character: 14
+                      end_position:
+                        bytes: 397
+                        line: 18
+                        character: 20
+                      token_type:
+                        type: Identifier
+                        identifier: number
+                    trailing_trivia: []
+                question_mark:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 397
+                      line: 18
+                      character: 20
+                    end_position:
+                      bytes: 398
+                      line: 18
+                      character: 21
+                    token_type:
+                      type: Symbol
+                      symbol: "?"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 398
+                        line: 18
+                        character: 21
+                      end_position:
+                        bytes: 399
+                        line: 18
+                        character: 21
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 384
+                    line: 18
+                    character: 7
+                  end_position:
+                    bytes: 389
+                    line: 18
+                    character: 12
+                  token_type:
+                    type: Identifier
+                    identifier: _foo1
+                trailing_trivia: []
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 399
+              line: 19
+              character: 1
+            end_position:
+              bytes: 404
+              line: 19
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 404
+                line: 19
+                character: 6
+              end_position:
+                bytes: 405
+                line: 19
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 405
+                    line: 19
+                    character: 7
+                  end_position:
+                    bytes: 410
+                    line: 19
+                    character: 12
+                  token_type:
+                    type: Identifier
+                    identifier: _bar0
+                trailing_trivia:
+                  - start_position:
+                      bytes: 410
+                      line: 19
+                      character: 12
+                    end_position:
+                      bytes: 411
+                      line: 19
+                      character: 13
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 411
+              line: 19
+              character: 13
+            end_position:
+              bytes: 412
+              line: 19
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 412
+                line: 19
+                character: 14
+              end_position:
+                bytes: 413
+                line: 19
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                TypeAssertion:
+                  expression:
+                    Var:
+                      Name:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 413
+                            line: 19
+                            character: 15
+                          end_position:
+                            bytes: 417
+                            line: 19
+                            character: 19
+                          token_type:
+                            type: Identifier
+                            identifier: foo0
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 417
+                              line: 19
+                              character: 19
+                            end_position:
+                              bytes: 418
+                              line: 19
+                              character: 20
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  type_assertion:
+                    assertion_op:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 418
+                          line: 19
+                          character: 20
+                        end_position:
+                          bytes: 420
+                          line: 19
+                          character: 22
+                        token_type:
+                          type: Symbol
+                          symbol: "::"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 420
+                            line: 19
+                            character: 22
+                          end_position:
+                            bytes: 421
+                            line: 19
+                            character: 23
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    cast_to:
+                      Basic:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 421
+                            line: 19
+                            character: 23
+                          end_position:
+                            bytes: 427
+                            line: 19
+                            character: 29
+                          token_type:
+                            type: Identifier
+                            identifier: number
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 427
+                              line: 19
+                              character: 29
+                            end_position:
+                              bytes: 428
+                              line: 19
+                              character: 29
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 428
+              line: 20
+              character: 1
+            end_position:
+              bytes: 433
+              line: 20
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 433
+                line: 20
+                character: 6
+              end_position:
+                bytes: 434
+                line: 20
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        type_specifiers:
+          - punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 439
+                  line: 20
+                  character: 12
+                end_position:
+                  bytes: 440
+                  line: 20
+                  character: 13
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 440
+                    line: 20
+                    character: 13
+                  end_position:
+                    bytes: 441
+                    line: 20
+                    character: 14
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 441
+                    line: 20
+                    character: 14
+                  end_position:
+                    bytes: 447
+                    line: 20
+                    character: 20
+                  token_type:
+                    type: Identifier
+                    identifier: string
+                trailing_trivia: []
+          - punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 454
+                  line: 20
+                  character: 27
+                end_position:
+                  bytes: 455
+                  line: 20
+                  character: 28
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 455
+                    line: 20
+                    character: 28
+                  end_position:
+                    bytes: 456
+                    line: 20
+                    character: 29
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 456
+                    line: 20
+                    character: 29
+                  end_position:
+                    bytes: 462
+                    line: 20
+                    character: 35
+                  token_type:
+                    type: Identifier
+                    identifier: string
+                trailing_trivia:
+                  - start_position:
+                      bytes: 462
+                      line: 20
+                      character: 35
+                    end_position:
+                      bytes: 463
+                      line: 20
+                      character: 35
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+        name_list:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 434
+                      line: 20
+                      character: 7
+                    end_position:
+                      bytes: 439
+                      line: 20
+                      character: 12
+                    token_type:
+                      type: Identifier
+                      identifier: _foo4
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 447
+                      line: 20
+                      character: 20
+                    end_position:
+                      bytes: 448
+                      line: 20
+                      character: 21
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 448
+                        line: 20
+                        character: 21
+                      end_position:
+                        bytes: 449
+                        line: 20
+                        character: 22
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 449
+                    line: 20
+                    character: 22
+                  end_position:
+                    bytes: 454
+                    line: 20
+                    character: 27
+                  token_type:
+                    type: Identifier
+                    identifier: _bar1
+                trailing_trivia: []
+        equal_token: ~
+        expr_list:
+          pairs: []
+    - ~
+  - - FunctionDeclaration:
+        function_token:
+          leading_trivia:
+            - start_position:
+                bytes: 463
+                line: 21
+                character: 1
+              end_position:
+                bytes: 464
+                line: 21
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 464
+              line: 22
+              character: 1
+            end_position:
+              bytes: 472
+              line: 22
+              character: 9
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 472
+                line: 22
+                character: 9
+              end_position:
+                bytes: 473
+                line: 22
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          names:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 473
+                      line: 22
+                      character: 10
+                    end_position:
+                      bytes: 477
+                      line: 22
+                      character: 14
+                    token_type:
+                      type: Identifier
+                      identifier: _fn0
+                  trailing_trivia: []
+          colon_name: ~
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 477
+                    line: 22
+                    character: 14
+                  end_position:
+                    bytes: 478
+                    line: 22
+                    character: 15
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 491
+                    line: 22
+                    character: 28
+                  end_position:
+                    bytes: 492
+                    line: 22
+                    character: 29
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia: []
+          parameters:
+            pairs:
+              - End:
+                  name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 478
+                        line: 22
+                        character: 15
+                      end_position:
+                        bytes: 483
+                        line: 22
+                        character: 20
+                      token_type:
+                        type: Identifier
+                        identifier: param
+                    trailing_trivia: []
+          type_specifiers:
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 483
+                    line: 22
+                    character: 20
+                  end_position:
+                    bytes: 484
+                    line: 22
+                    character: 21
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 484
+                      line: 22
+                      character: 21
+                    end_position:
+                      bytes: 485
+                      line: 22
+                      character: 22
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Basic:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 485
+                      line: 22
+                      character: 22
+                    end_position:
+                      bytes: 491
+                      line: 22
+                      character: 28
+                    token_type:
+                      type: Identifier
+                      identifier: string
+                  trailing_trivia: []
+          return_type:
+            punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 492
+                  line: 22
+                  character: 29
+                end_position:
+                  bytes: 493
+                  line: 22
+                  character: 30
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 493
+                    line: 22
+                    character: 30
+                  end_position:
+                    bytes: 494
+                    line: 22
+                    character: 31
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 494
+                    line: 22
+                    character: 31
+                  end_position:
+                    bytes: 500
+                    line: 22
+                    character: 37
+                  token_type:
+                    type: Identifier
+                    identifier: string
+                trailing_trivia:
+                  - start_position:
+                      bytes: 500
+                      line: 22
+                      character: 37
+                    end_position:
+                      bytes: 501
+                      line: 22
+                      character: 37
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          block:
+            stmts: []
+            last_stmt:
+              - Return:
+                  token:
+                    leading_trivia:
+                      - start_position:
+                          bytes: 501
+                          line: 23
+                          character: 1
+                        end_position:
+                          bytes: 502
+                          line: 23
+                          character: 2
+                        token_type:
+                          type: Whitespace
+                          characters: "\t"
+                    token:
+                      start_position:
+                        bytes: 502
+                        line: 23
+                        character: 2
+                      end_position:
+                        bytes: 508
+                        line: 23
+                        character: 8
+                      token_type:
+                        type: Symbol
+                        symbol: return
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 508
+                          line: 23
+                          character: 8
+                        end_position:
+                          bytes: 509
+                          line: 23
+                          character: 9
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+                  returns:
+                    pairs:
+                      - End:
+                          Var:
+                            Name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 509
+                                  line: 23
+                                  character: 9
+                                end_position:
+                                  bytes: 514
+                                  line: 23
+                                  character: 14
+                                token_type:
+                                  type: Identifier
+                                  identifier: param
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 514
+                                    line: 23
+                                    character: 14
+                                  end_position:
+                                    bytes: 515
+                                    line: 23
+                                    character: 14
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\n"
+              - ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 515
+                line: 24
+                character: 1
+              end_position:
+                bytes: 518
+                line: 24
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 518
+                  line: 24
+                  character: 4
+                end_position:
+                  bytes: 519
+                  line: 24
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - FunctionDeclaration:
+        function_token:
+          leading_trivia:
+            - start_position:
+                bytes: 519
+                line: 25
+                character: 1
+              end_position:
+                bytes: 520
+                line: 25
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 520
+              line: 26
+              character: 1
+            end_position:
+              bytes: 528
+              line: 26
+              character: 9
+            token_type:
+              type: Symbol
+              symbol: function
+          trailing_trivia:
+            - start_position:
+                bytes: 528
+                line: 26
+                character: 9
+              end_position:
+                bytes: 529
+                line: 26
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          names:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 529
+                      line: 26
+                      character: 10
+                    end_position:
+                      bytes: 533
+                      line: 26
+                      character: 14
+                    token_type:
+                      type: Identifier
+                      identifier: _fn2
+                  trailing_trivia: []
+          colon_name: ~
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 533
+                    line: 26
+                    character: 14
+                  end_position:
+                    bytes: 534
+                    line: 26
+                    character: 15
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 554
+                    line: 26
+                    character: 35
+                  end_position:
+                    bytes: 555
+                    line: 26
+                    character: 36
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 555
+                      line: 26
+                      character: 36
+                    end_position:
+                      bytes: 556
+                      line: 26
+                      character: 37
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          parameters:
+            pairs:
+              - Punctuated:
+                  - name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 534
+                          line: 26
+                          character: 15
+                        end_position:
+                          bytes: 535
+                          line: 26
+                          character: 16
+                        token_type:
+                          type: Identifier
+                          identifier: a
+                      trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 543
+                        line: 26
+                        character: 24
+                      end_position:
+                        bytes: 544
+                        line: 26
+                        character: 25
+                      token_type:
+                        type: Symbol
+                        symbol: ","
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 544
+                          line: 26
+                          character: 25
+                        end_position:
+                          bytes: 545
+                          line: 26
+                          character: 26
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+              - End:
+                  name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 545
+                        line: 26
+                        character: 26
+                      end_position:
+                        bytes: 546
+                        line: 26
+                        character: 27
+                      token_type:
+                        type: Identifier
+                        identifier: b
+                    trailing_trivia: []
+          type_specifiers:
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 535
+                    line: 26
+                    character: 16
+                  end_position:
+                    bytes: 536
+                    line: 26
+                    character: 17
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 536
+                      line: 26
+                      character: 17
+                    end_position:
+                      bytes: 537
+                      line: 26
+                      character: 18
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Basic:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 537
+                      line: 26
+                      character: 18
+                    end_position:
+                      bytes: 543
+                      line: 26
+                      character: 24
+                    token_type:
+                      type: Identifier
+                      identifier: string
+                  trailing_trivia: []
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 546
+                    line: 26
+                    character: 27
+                  end_position:
+                    bytes: 547
+                    line: 26
+                    character: 28
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 547
+                      line: 26
+                      character: 28
+                    end_position:
+                      bytes: 548
+                      line: 26
+                      character: 29
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Basic:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 548
+                      line: 26
+                      character: 29
+                    end_position:
+                      bytes: 554
+                      line: 26
+                      character: 35
+                    token_type:
+                      type: Identifier
+                      identifier: string
+                  trailing_trivia: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 556
+                line: 26
+                character: 37
+              end_position:
+                bytes: 559
+                line: 26
+                character: 40
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 559
+                  line: 26
+                  character: 40
+                end_position:
+                  bytes: 560
+                  line: 26
+                  character: 40
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
+  - - LocalAssignment:
+        local_token:
+          leading_trivia:
+            - start_position:
+                bytes: 560
+                line: 27
+                character: 1
+              end_position:
+                bytes: 561
+                line: 27
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 561
+              line: 28
+              character: 1
+            end_position:
+              bytes: 566
+              line: 28
+              character: 6
+            token_type:
+              type: Symbol
+              symbol: local
+          trailing_trivia:
+            - start_position:
+                bytes: 566
+                line: 28
+                character: 6
+              end_position:
+                bytes: 567
+                line: 28
+                character: 7
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 567
+                    line: 28
+                    character: 7
+                  end_position:
+                    bytes: 571
+                    line: 28
+                    character: 11
+                  token_type:
+                    type: Identifier
+                    identifier: _fn3
+                trailing_trivia:
+                  - start_position:
+                      bytes: 571
+                      line: 28
+                      character: 11
+                    end_position:
+                      bytes: 572
+                      line: 28
+                      character: 12
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 572
+              line: 28
+              character: 12
+            end_position:
+              bytes: 573
+              line: 28
+              character: 13
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 573
+                line: 28
+                character: 13
+              end_position:
+                bytes: 574
+                line: 28
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Function:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 574
+                        line: 28
+                        character: 14
+                      end_position:
+                        bytes: 582
+                        line: 28
+                        character: 22
+                      token_type:
+                        type: Symbol
+                        symbol: function
+                    trailing_trivia: []
+                  - parameters_parentheses:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 582
+                              line: 28
+                              character: 22
+                            end_position:
+                              bytes: 583
+                              line: 28
+                              character: 23
+                            token_type:
+                              type: Symbol
+                              symbol: (
+                          trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 583
+                              line: 28
+                              character: 23
+                            end_position:
+                              bytes: 584
+                              line: 28
+                              character: 24
+                            token_type:
+                              type: Symbol
+                              symbol: )
+                          trailing_trivia: []
+                    parameters:
+                      pairs: []
+                    type_specifiers: []
+                    return_type:
+                      punctuation:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 584
+                            line: 28
+                            character: 24
+                          end_position:
+                            bytes: 585
+                            line: 28
+                            character: 25
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 585
+                              line: 28
+                              character: 25
+                            end_position:
+                              bytes: 586
+                              line: 28
+                              character: 26
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      type_info:
+                        Optional:
+                          base:
+                            Basic:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 586
+                                  line: 28
+                                  character: 26
+                                end_position:
+                                  bytes: 592
+                                  line: 28
+                                  character: 32
+                                token_type:
+                                  type: Identifier
+                                  identifier: number
+                              trailing_trivia: []
+                          question_mark:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 592
+                                line: 28
+                                character: 32
+                              end_position:
+                                bytes: 593
+                                line: 28
+                                character: 33
+                              token_type:
+                                type: Symbol
+                                symbol: "?"
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 593
+                                  line: 28
+                                  character: 33
+                                end_position:
+                                  bytes: 594
+                                  line: 28
+                                  character: 33
+                                token_type:
+                                  type: Whitespace
+                                  characters: "\n"
+                    block:
+                      stmts: []
+                      last_stmt:
+                        - Return:
+                            token:
+                              leading_trivia:
+                                - start_position:
+                                    bytes: 594
+                                    line: 29
+                                    character: 1
+                                  end_position:
+                                    bytes: 595
+                                    line: 29
+                                    character: 2
+                                  token_type:
+                                    type: Whitespace
+                                    characters: "\t"
+                              token:
+                                start_position:
+                                  bytes: 595
+                                  line: 29
+                                  character: 2
+                                end_position:
+                                  bytes: 601
+                                  line: 29
+                                  character: 8
+                                token_type:
+                                  type: Symbol
+                                  symbol: return
+                              trailing_trivia:
+                                - start_position:
+                                    bytes: 601
+                                    line: 29
+                                    character: 8
+                                  end_position:
+                                    bytes: 602
+                                    line: 29
+                                    character: 9
+                                  token_type:
+                                    type: Whitespace
+                                    characters: " "
+                            returns:
+                              pairs:
+                                - End:
+                                    Number:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 602
+                                          line: 29
+                                          character: 9
+                                        end_position:
+                                          bytes: 603
+                                          line: 29
+                                          character: 10
+                                        token_type:
+                                          type: Number
+                                          text: "3"
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 603
+                                            line: 29
+                                            character: 10
+                                          end_position:
+                                            bytes: 604
+                                            line: 29
+                                            character: 10
+                                          token_type:
+                                            type: Whitespace
+                                            characters: "\n"
+                        - ~
+                    end_token:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 604
+                          line: 30
+                          character: 1
+                        end_position:
+                          bytes: 607
+                          line: 30
+                          character: 4
+                        token_type:
+                          type: Symbol
+                          symbol: end
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 607
+                            line: 30
+                            character: 4
+                          end_position:
+                            bytes: 608
+                            line: 30
+                            character: 4
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/source.lua
new file mode 100644
index 00000000..5a7f7838
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/source.lua
@@ -0,0 +1,30 @@
+--!strict
+local _fn3
+type Object = { x: number, y: number }
+type Typeof = typeof(2 + 2 + _fn3())
+type Element = { [string]: number }
+
+type Callback1 = (string) -> number
+type Callback2 = (string, string) -> number
+type Callback3 = (string, string) -> (string, nil)
+type Callback4 = (string) -> (string) -> nil
+
+type Foo = {
+	bar: number,
+	baz: number,
+}
+
+local foo0: number = 3
+local _foo1: number?
+local _bar0 = foo0 :: number
+local _foo4: string, _bar1: string
+
+function _fn0(param: string): string
+	return param
+end
+
+function _fn2(a: string, b: string) end
+
+local _fn3 = function(): number?
+	return 3
+end
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/tokens.snap
new file mode 100644
index 00000000..d8097659
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types/tokens.snap
@@ -0,0 +1,2996 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/roblox_cases/pass/types
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: SingleLineComment
+    comment: "!strict"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 10
+    line: 2
+    character: 1
+  end_position:
+    bytes: 15
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 15
+    line: 2
+    character: 6
+  end_position:
+    bytes: 16
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 16
+    line: 2
+    character: 7
+  end_position:
+    bytes: 20
+    line: 2
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: _fn3
+- start_position:
+    bytes: 20
+    line: 2
+    character: 11
+  end_position:
+    bytes: 21
+    line: 2
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 21
+    line: 3
+    character: 1
+  end_position:
+    bytes: 25
+    line: 3
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 25
+    line: 3
+    character: 5
+  end_position:
+    bytes: 26
+    line: 3
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 3
+    character: 6
+  end_position:
+    bytes: 32
+    line: 3
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: Object
+- start_position:
+    bytes: 32
+    line: 3
+    character: 12
+  end_position:
+    bytes: 33
+    line: 3
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 33
+    line: 3
+    character: 13
+  end_position:
+    bytes: 34
+    line: 3
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 34
+    line: 3
+    character: 14
+  end_position:
+    bytes: 35
+    line: 3
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 35
+    line: 3
+    character: 15
+  end_position:
+    bytes: 36
+    line: 3
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 36
+    line: 3
+    character: 16
+  end_position:
+    bytes: 37
+    line: 3
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 37
+    line: 3
+    character: 17
+  end_position:
+    bytes: 38
+    line: 3
+    character: 18
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 38
+    line: 3
+    character: 18
+  end_position:
+    bytes: 39
+    line: 3
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 39
+    line: 3
+    character: 19
+  end_position:
+    bytes: 40
+    line: 3
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 40
+    line: 3
+    character: 20
+  end_position:
+    bytes: 46
+    line: 3
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 46
+    line: 3
+    character: 26
+  end_position:
+    bytes: 47
+    line: 3
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 47
+    line: 3
+    character: 27
+  end_position:
+    bytes: 48
+    line: 3
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 48
+    line: 3
+    character: 28
+  end_position:
+    bytes: 49
+    line: 3
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 49
+    line: 3
+    character: 29
+  end_position:
+    bytes: 50
+    line: 3
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 50
+    line: 3
+    character: 30
+  end_position:
+    bytes: 51
+    line: 3
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 51
+    line: 3
+    character: 31
+  end_position:
+    bytes: 57
+    line: 3
+    character: 37
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 57
+    line: 3
+    character: 37
+  end_position:
+    bytes: 58
+    line: 3
+    character: 38
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 58
+    line: 3
+    character: 38
+  end_position:
+    bytes: 59
+    line: 3
+    character: 39
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 59
+    line: 3
+    character: 39
+  end_position:
+    bytes: 60
+    line: 3
+    character: 39
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 60
+    line: 4
+    character: 1
+  end_position:
+    bytes: 64
+    line: 4
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 64
+    line: 4
+    character: 5
+  end_position:
+    bytes: 65
+    line: 4
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 65
+    line: 4
+    character: 6
+  end_position:
+    bytes: 71
+    line: 4
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: Typeof
+- start_position:
+    bytes: 71
+    line: 4
+    character: 12
+  end_position:
+    bytes: 72
+    line: 4
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 72
+    line: 4
+    character: 13
+  end_position:
+    bytes: 73
+    line: 4
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 73
+    line: 4
+    character: 14
+  end_position:
+    bytes: 74
+    line: 4
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 74
+    line: 4
+    character: 15
+  end_position:
+    bytes: 80
+    line: 4
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: typeof
+- start_position:
+    bytes: 80
+    line: 4
+    character: 21
+  end_position:
+    bytes: 81
+    line: 4
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 81
+    line: 4
+    character: 22
+  end_position:
+    bytes: 82
+    line: 4
+    character: 23
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 82
+    line: 4
+    character: 23
+  end_position:
+    bytes: 83
+    line: 4
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 83
+    line: 4
+    character: 24
+  end_position:
+    bytes: 84
+    line: 4
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 84
+    line: 4
+    character: 25
+  end_position:
+    bytes: 85
+    line: 4
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 85
+    line: 4
+    character: 26
+  end_position:
+    bytes: 86
+    line: 4
+    character: 27
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 86
+    line: 4
+    character: 27
+  end_position:
+    bytes: 87
+    line: 4
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 87
+    line: 4
+    character: 28
+  end_position:
+    bytes: 88
+    line: 4
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: +
+- start_position:
+    bytes: 88
+    line: 4
+    character: 29
+  end_position:
+    bytes: 89
+    line: 4
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 89
+    line: 4
+    character: 30
+  end_position:
+    bytes: 93
+    line: 4
+    character: 34
+  token_type:
+    type: Identifier
+    identifier: _fn3
+- start_position:
+    bytes: 93
+    line: 4
+    character: 34
+  end_position:
+    bytes: 94
+    line: 4
+    character: 35
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 94
+    line: 4
+    character: 35
+  end_position:
+    bytes: 95
+    line: 4
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 95
+    line: 4
+    character: 36
+  end_position:
+    bytes: 96
+    line: 4
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 96
+    line: 4
+    character: 37
+  end_position:
+    bytes: 97
+    line: 4
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 97
+    line: 5
+    character: 1
+  end_position:
+    bytes: 101
+    line: 5
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 101
+    line: 5
+    character: 5
+  end_position:
+    bytes: 102
+    line: 5
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 102
+    line: 5
+    character: 6
+  end_position:
+    bytes: 109
+    line: 5
+    character: 13
+  token_type:
+    type: Identifier
+    identifier: Element
+- start_position:
+    bytes: 109
+    line: 5
+    character: 13
+  end_position:
+    bytes: 110
+    line: 5
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 110
+    line: 5
+    character: 14
+  end_position:
+    bytes: 111
+    line: 5
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 111
+    line: 5
+    character: 15
+  end_position:
+    bytes: 112
+    line: 5
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 112
+    line: 5
+    character: 16
+  end_position:
+    bytes: 113
+    line: 5
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 113
+    line: 5
+    character: 17
+  end_position:
+    bytes: 114
+    line: 5
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 114
+    line: 5
+    character: 18
+  end_position:
+    bytes: 115
+    line: 5
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "["
+- start_position:
+    bytes: 115
+    line: 5
+    character: 19
+  end_position:
+    bytes: 121
+    line: 5
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 121
+    line: 5
+    character: 25
+  end_position:
+    bytes: 122
+    line: 5
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: "]"
+- start_position:
+    bytes: 122
+    line: 5
+    character: 26
+  end_position:
+    bytes: 123
+    line: 5
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 123
+    line: 5
+    character: 27
+  end_position:
+    bytes: 124
+    line: 5
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 124
+    line: 5
+    character: 28
+  end_position:
+    bytes: 130
+    line: 5
+    character: 34
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 130
+    line: 5
+    character: 34
+  end_position:
+    bytes: 131
+    line: 5
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 131
+    line: 5
+    character: 35
+  end_position:
+    bytes: 132
+    line: 5
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 132
+    line: 5
+    character: 36
+  end_position:
+    bytes: 133
+    line: 5
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 133
+    line: 6
+    character: 1
+  end_position:
+    bytes: 134
+    line: 6
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 134
+    line: 7
+    character: 1
+  end_position:
+    bytes: 138
+    line: 7
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 138
+    line: 7
+    character: 5
+  end_position:
+    bytes: 139
+    line: 7
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 139
+    line: 7
+    character: 6
+  end_position:
+    bytes: 148
+    line: 7
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: Callback1
+- start_position:
+    bytes: 148
+    line: 7
+    character: 15
+  end_position:
+    bytes: 149
+    line: 7
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 149
+    line: 7
+    character: 16
+  end_position:
+    bytes: 150
+    line: 7
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 150
+    line: 7
+    character: 17
+  end_position:
+    bytes: 151
+    line: 7
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 151
+    line: 7
+    character: 18
+  end_position:
+    bytes: 152
+    line: 7
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 152
+    line: 7
+    character: 19
+  end_position:
+    bytes: 158
+    line: 7
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 158
+    line: 7
+    character: 25
+  end_position:
+    bytes: 159
+    line: 7
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 159
+    line: 7
+    character: 26
+  end_position:
+    bytes: 160
+    line: 7
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 160
+    line: 7
+    character: 27
+  end_position:
+    bytes: 162
+    line: 7
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 162
+    line: 7
+    character: 29
+  end_position:
+    bytes: 163
+    line: 7
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 163
+    line: 7
+    character: 30
+  end_position:
+    bytes: 169
+    line: 7
+    character: 36
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 169
+    line: 7
+    character: 36
+  end_position:
+    bytes: 170
+    line: 7
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 170
+    line: 8
+    character: 1
+  end_position:
+    bytes: 174
+    line: 8
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 174
+    line: 8
+    character: 5
+  end_position:
+    bytes: 175
+    line: 8
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 175
+    line: 8
+    character: 6
+  end_position:
+    bytes: 184
+    line: 8
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: Callback2
+- start_position:
+    bytes: 184
+    line: 8
+    character: 15
+  end_position:
+    bytes: 185
+    line: 8
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 185
+    line: 8
+    character: 16
+  end_position:
+    bytes: 186
+    line: 8
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 186
+    line: 8
+    character: 17
+  end_position:
+    bytes: 187
+    line: 8
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 187
+    line: 8
+    character: 18
+  end_position:
+    bytes: 188
+    line: 8
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 188
+    line: 8
+    character: 19
+  end_position:
+    bytes: 194
+    line: 8
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 194
+    line: 8
+    character: 25
+  end_position:
+    bytes: 195
+    line: 8
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 195
+    line: 8
+    character: 26
+  end_position:
+    bytes: 196
+    line: 8
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 196
+    line: 8
+    character: 27
+  end_position:
+    bytes: 202
+    line: 8
+    character: 33
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 202
+    line: 8
+    character: 33
+  end_position:
+    bytes: 203
+    line: 8
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 203
+    line: 8
+    character: 34
+  end_position:
+    bytes: 204
+    line: 8
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 204
+    line: 8
+    character: 35
+  end_position:
+    bytes: 206
+    line: 8
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 206
+    line: 8
+    character: 37
+  end_position:
+    bytes: 207
+    line: 8
+    character: 38
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 207
+    line: 8
+    character: 38
+  end_position:
+    bytes: 213
+    line: 8
+    character: 44
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 213
+    line: 8
+    character: 44
+  end_position:
+    bytes: 214
+    line: 8
+    character: 44
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 214
+    line: 9
+    character: 1
+  end_position:
+    bytes: 218
+    line: 9
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 218
+    line: 9
+    character: 5
+  end_position:
+    bytes: 219
+    line: 9
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 219
+    line: 9
+    character: 6
+  end_position:
+    bytes: 228
+    line: 9
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: Callback3
+- start_position:
+    bytes: 228
+    line: 9
+    character: 15
+  end_position:
+    bytes: 229
+    line: 9
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 229
+    line: 9
+    character: 16
+  end_position:
+    bytes: 230
+    line: 9
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 230
+    line: 9
+    character: 17
+  end_position:
+    bytes: 231
+    line: 9
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 231
+    line: 9
+    character: 18
+  end_position:
+    bytes: 232
+    line: 9
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 232
+    line: 9
+    character: 19
+  end_position:
+    bytes: 238
+    line: 9
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 238
+    line: 9
+    character: 25
+  end_position:
+    bytes: 239
+    line: 9
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 239
+    line: 9
+    character: 26
+  end_position:
+    bytes: 240
+    line: 9
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 240
+    line: 9
+    character: 27
+  end_position:
+    bytes: 246
+    line: 9
+    character: 33
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 246
+    line: 9
+    character: 33
+  end_position:
+    bytes: 247
+    line: 9
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 247
+    line: 9
+    character: 34
+  end_position:
+    bytes: 248
+    line: 9
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 248
+    line: 9
+    character: 35
+  end_position:
+    bytes: 250
+    line: 9
+    character: 37
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 250
+    line: 9
+    character: 37
+  end_position:
+    bytes: 251
+    line: 9
+    character: 38
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 251
+    line: 9
+    character: 38
+  end_position:
+    bytes: 252
+    line: 9
+    character: 39
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 252
+    line: 9
+    character: 39
+  end_position:
+    bytes: 258
+    line: 9
+    character: 45
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 258
+    line: 9
+    character: 45
+  end_position:
+    bytes: 259
+    line: 9
+    character: 46
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 259
+    line: 9
+    character: 46
+  end_position:
+    bytes: 260
+    line: 9
+    character: 47
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 260
+    line: 9
+    character: 47
+  end_position:
+    bytes: 263
+    line: 9
+    character: 50
+  token_type:
+    type: Symbol
+    symbol: nil
+- start_position:
+    bytes: 263
+    line: 9
+    character: 50
+  end_position:
+    bytes: 264
+    line: 9
+    character: 51
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 264
+    line: 9
+    character: 51
+  end_position:
+    bytes: 265
+    line: 9
+    character: 51
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 265
+    line: 10
+    character: 1
+  end_position:
+    bytes: 269
+    line: 10
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 269
+    line: 10
+    character: 5
+  end_position:
+    bytes: 270
+    line: 10
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 270
+    line: 10
+    character: 6
+  end_position:
+    bytes: 279
+    line: 10
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: Callback4
+- start_position:
+    bytes: 279
+    line: 10
+    character: 15
+  end_position:
+    bytes: 280
+    line: 10
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 280
+    line: 10
+    character: 16
+  end_position:
+    bytes: 281
+    line: 10
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 281
+    line: 10
+    character: 17
+  end_position:
+    bytes: 282
+    line: 10
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 282
+    line: 10
+    character: 18
+  end_position:
+    bytes: 283
+    line: 10
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 283
+    line: 10
+    character: 19
+  end_position:
+    bytes: 289
+    line: 10
+    character: 25
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 289
+    line: 10
+    character: 25
+  end_position:
+    bytes: 290
+    line: 10
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 290
+    line: 10
+    character: 26
+  end_position:
+    bytes: 291
+    line: 10
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 291
+    line: 10
+    character: 27
+  end_position:
+    bytes: 293
+    line: 10
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 293
+    line: 10
+    character: 29
+  end_position:
+    bytes: 294
+    line: 10
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 294
+    line: 10
+    character: 30
+  end_position:
+    bytes: 295
+    line: 10
+    character: 31
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 295
+    line: 10
+    character: 31
+  end_position:
+    bytes: 301
+    line: 10
+    character: 37
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 301
+    line: 10
+    character: 37
+  end_position:
+    bytes: 302
+    line: 10
+    character: 38
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 302
+    line: 10
+    character: 38
+  end_position:
+    bytes: 303
+    line: 10
+    character: 39
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 303
+    line: 10
+    character: 39
+  end_position:
+    bytes: 305
+    line: 10
+    character: 41
+  token_type:
+    type: Symbol
+    symbol: "->"
+- start_position:
+    bytes: 305
+    line: 10
+    character: 41
+  end_position:
+    bytes: 306
+    line: 10
+    character: 42
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 306
+    line: 10
+    character: 42
+  end_position:
+    bytes: 309
+    line: 10
+    character: 45
+  token_type:
+    type: Symbol
+    symbol: nil
+- start_position:
+    bytes: 309
+    line: 10
+    character: 45
+  end_position:
+    bytes: 310
+    line: 10
+    character: 45
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 310
+    line: 11
+    character: 1
+  end_position:
+    bytes: 311
+    line: 11
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 311
+    line: 12
+    character: 1
+  end_position:
+    bytes: 315
+    line: 12
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 315
+    line: 12
+    character: 5
+  end_position:
+    bytes: 316
+    line: 12
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 316
+    line: 12
+    character: 6
+  end_position:
+    bytes: 319
+    line: 12
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: Foo
+- start_position:
+    bytes: 319
+    line: 12
+    character: 9
+  end_position:
+    bytes: 320
+    line: 12
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 320
+    line: 12
+    character: 10
+  end_position:
+    bytes: 321
+    line: 12
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 321
+    line: 12
+    character: 11
+  end_position:
+    bytes: 322
+    line: 12
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 322
+    line: 12
+    character: 12
+  end_position:
+    bytes: 323
+    line: 12
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 323
+    line: 12
+    character: 13
+  end_position:
+    bytes: 324
+    line: 12
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 324
+    line: 13
+    character: 1
+  end_position:
+    bytes: 325
+    line: 13
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 325
+    line: 13
+    character: 2
+  end_position:
+    bytes: 328
+    line: 13
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 328
+    line: 13
+    character: 5
+  end_position:
+    bytes: 329
+    line: 13
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 329
+    line: 13
+    character: 6
+  end_position:
+    bytes: 330
+    line: 13
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 330
+    line: 13
+    character: 7
+  end_position:
+    bytes: 336
+    line: 13
+    character: 13
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 336
+    line: 13
+    character: 13
+  end_position:
+    bytes: 337
+    line: 13
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 337
+    line: 13
+    character: 14
+  end_position:
+    bytes: 338
+    line: 13
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 338
+    line: 14
+    character: 1
+  end_position:
+    bytes: 339
+    line: 14
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 339
+    line: 14
+    character: 2
+  end_position:
+    bytes: 342
+    line: 14
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 342
+    line: 14
+    character: 5
+  end_position:
+    bytes: 343
+    line: 14
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 343
+    line: 14
+    character: 6
+  end_position:
+    bytes: 344
+    line: 14
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 344
+    line: 14
+    character: 7
+  end_position:
+    bytes: 350
+    line: 14
+    character: 13
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 350
+    line: 14
+    character: 13
+  end_position:
+    bytes: 351
+    line: 14
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 351
+    line: 14
+    character: 14
+  end_position:
+    bytes: 352
+    line: 14
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 352
+    line: 15
+    character: 1
+  end_position:
+    bytes: 353
+    line: 15
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 353
+    line: 15
+    character: 2
+  end_position:
+    bytes: 354
+    line: 15
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 354
+    line: 16
+    character: 1
+  end_position:
+    bytes: 355
+    line: 16
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 355
+    line: 17
+    character: 1
+  end_position:
+    bytes: 360
+    line: 17
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 360
+    line: 17
+    character: 6
+  end_position:
+    bytes: 361
+    line: 17
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 361
+    line: 17
+    character: 7
+  end_position:
+    bytes: 365
+    line: 17
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: foo0
+- start_position:
+    bytes: 365
+    line: 17
+    character: 11
+  end_position:
+    bytes: 366
+    line: 17
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 366
+    line: 17
+    character: 12
+  end_position:
+    bytes: 367
+    line: 17
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 367
+    line: 17
+    character: 13
+  end_position:
+    bytes: 373
+    line: 17
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 373
+    line: 17
+    character: 19
+  end_position:
+    bytes: 374
+    line: 17
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 374
+    line: 17
+    character: 20
+  end_position:
+    bytes: 375
+    line: 17
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 375
+    line: 17
+    character: 21
+  end_position:
+    bytes: 376
+    line: 17
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 376
+    line: 17
+    character: 22
+  end_position:
+    bytes: 377
+    line: 17
+    character: 23
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 377
+    line: 17
+    character: 23
+  end_position:
+    bytes: 378
+    line: 17
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 378
+    line: 18
+    character: 1
+  end_position:
+    bytes: 383
+    line: 18
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 383
+    line: 18
+    character: 6
+  end_position:
+    bytes: 384
+    line: 18
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 384
+    line: 18
+    character: 7
+  end_position:
+    bytes: 389
+    line: 18
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: _foo1
+- start_position:
+    bytes: 389
+    line: 18
+    character: 12
+  end_position:
+    bytes: 390
+    line: 18
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 390
+    line: 18
+    character: 13
+  end_position:
+    bytes: 391
+    line: 18
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 391
+    line: 18
+    character: 14
+  end_position:
+    bytes: 397
+    line: 18
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 397
+    line: 18
+    character: 20
+  end_position:
+    bytes: 398
+    line: 18
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 398
+    line: 18
+    character: 21
+  end_position:
+    bytes: 399
+    line: 18
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 399
+    line: 19
+    character: 1
+  end_position:
+    bytes: 404
+    line: 19
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 404
+    line: 19
+    character: 6
+  end_position:
+    bytes: 405
+    line: 19
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 405
+    line: 19
+    character: 7
+  end_position:
+    bytes: 410
+    line: 19
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: _bar0
+- start_position:
+    bytes: 410
+    line: 19
+    character: 12
+  end_position:
+    bytes: 411
+    line: 19
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 411
+    line: 19
+    character: 13
+  end_position:
+    bytes: 412
+    line: 19
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 412
+    line: 19
+    character: 14
+  end_position:
+    bytes: 413
+    line: 19
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 413
+    line: 19
+    character: 15
+  end_position:
+    bytes: 417
+    line: 19
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: foo0
+- start_position:
+    bytes: 417
+    line: 19
+    character: 19
+  end_position:
+    bytes: 418
+    line: 19
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 418
+    line: 19
+    character: 20
+  end_position:
+    bytes: 420
+    line: 19
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: "::"
+- start_position:
+    bytes: 420
+    line: 19
+    character: 22
+  end_position:
+    bytes: 421
+    line: 19
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 421
+    line: 19
+    character: 23
+  end_position:
+    bytes: 427
+    line: 19
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 427
+    line: 19
+    character: 29
+  end_position:
+    bytes: 428
+    line: 19
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 428
+    line: 20
+    character: 1
+  end_position:
+    bytes: 433
+    line: 20
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 433
+    line: 20
+    character: 6
+  end_position:
+    bytes: 434
+    line: 20
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 434
+    line: 20
+    character: 7
+  end_position:
+    bytes: 439
+    line: 20
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: _foo4
+- start_position:
+    bytes: 439
+    line: 20
+    character: 12
+  end_position:
+    bytes: 440
+    line: 20
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 440
+    line: 20
+    character: 13
+  end_position:
+    bytes: 441
+    line: 20
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 441
+    line: 20
+    character: 14
+  end_position:
+    bytes: 447
+    line: 20
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 447
+    line: 20
+    character: 20
+  end_position:
+    bytes: 448
+    line: 20
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 448
+    line: 20
+    character: 21
+  end_position:
+    bytes: 449
+    line: 20
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 449
+    line: 20
+    character: 22
+  end_position:
+    bytes: 454
+    line: 20
+    character: 27
+  token_type:
+    type: Identifier
+    identifier: _bar1
+- start_position:
+    bytes: 454
+    line: 20
+    character: 27
+  end_position:
+    bytes: 455
+    line: 20
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 455
+    line: 20
+    character: 28
+  end_position:
+    bytes: 456
+    line: 20
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 456
+    line: 20
+    character: 29
+  end_position:
+    bytes: 462
+    line: 20
+    character: 35
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 462
+    line: 20
+    character: 35
+  end_position:
+    bytes: 463
+    line: 20
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 463
+    line: 21
+    character: 1
+  end_position:
+    bytes: 464
+    line: 21
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 464
+    line: 22
+    character: 1
+  end_position:
+    bytes: 472
+    line: 22
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 472
+    line: 22
+    character: 9
+  end_position:
+    bytes: 473
+    line: 22
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 473
+    line: 22
+    character: 10
+  end_position:
+    bytes: 477
+    line: 22
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: _fn0
+- start_position:
+    bytes: 477
+    line: 22
+    character: 14
+  end_position:
+    bytes: 478
+    line: 22
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 478
+    line: 22
+    character: 15
+  end_position:
+    bytes: 483
+    line: 22
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: param
+- start_position:
+    bytes: 483
+    line: 22
+    character: 20
+  end_position:
+    bytes: 484
+    line: 22
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 484
+    line: 22
+    character: 21
+  end_position:
+    bytes: 485
+    line: 22
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 485
+    line: 22
+    character: 22
+  end_position:
+    bytes: 491
+    line: 22
+    character: 28
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 491
+    line: 22
+    character: 28
+  end_position:
+    bytes: 492
+    line: 22
+    character: 29
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 492
+    line: 22
+    character: 29
+  end_position:
+    bytes: 493
+    line: 22
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 493
+    line: 22
+    character: 30
+  end_position:
+    bytes: 494
+    line: 22
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 494
+    line: 22
+    character: 31
+  end_position:
+    bytes: 500
+    line: 22
+    character: 37
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 500
+    line: 22
+    character: 37
+  end_position:
+    bytes: 501
+    line: 22
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 501
+    line: 23
+    character: 1
+  end_position:
+    bytes: 502
+    line: 23
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 502
+    line: 23
+    character: 2
+  end_position:
+    bytes: 508
+    line: 23
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 508
+    line: 23
+    character: 8
+  end_position:
+    bytes: 509
+    line: 23
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 509
+    line: 23
+    character: 9
+  end_position:
+    bytes: 514
+    line: 23
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: param
+- start_position:
+    bytes: 514
+    line: 23
+    character: 14
+  end_position:
+    bytes: 515
+    line: 23
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 515
+    line: 24
+    character: 1
+  end_position:
+    bytes: 518
+    line: 24
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 518
+    line: 24
+    character: 4
+  end_position:
+    bytes: 519
+    line: 24
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 519
+    line: 25
+    character: 1
+  end_position:
+    bytes: 520
+    line: 25
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 520
+    line: 26
+    character: 1
+  end_position:
+    bytes: 528
+    line: 26
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 528
+    line: 26
+    character: 9
+  end_position:
+    bytes: 529
+    line: 26
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 529
+    line: 26
+    character: 10
+  end_position:
+    bytes: 533
+    line: 26
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: _fn2
+- start_position:
+    bytes: 533
+    line: 26
+    character: 14
+  end_position:
+    bytes: 534
+    line: 26
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 534
+    line: 26
+    character: 15
+  end_position:
+    bytes: 535
+    line: 26
+    character: 16
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 535
+    line: 26
+    character: 16
+  end_position:
+    bytes: 536
+    line: 26
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 536
+    line: 26
+    character: 17
+  end_position:
+    bytes: 537
+    line: 26
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 537
+    line: 26
+    character: 18
+  end_position:
+    bytes: 543
+    line: 26
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 543
+    line: 26
+    character: 24
+  end_position:
+    bytes: 544
+    line: 26
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 544
+    line: 26
+    character: 25
+  end_position:
+    bytes: 545
+    line: 26
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 545
+    line: 26
+    character: 26
+  end_position:
+    bytes: 546
+    line: 26
+    character: 27
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 546
+    line: 26
+    character: 27
+  end_position:
+    bytes: 547
+    line: 26
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 547
+    line: 26
+    character: 28
+  end_position:
+    bytes: 548
+    line: 26
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 548
+    line: 26
+    character: 29
+  end_position:
+    bytes: 554
+    line: 26
+    character: 35
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 554
+    line: 26
+    character: 35
+  end_position:
+    bytes: 555
+    line: 26
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 555
+    line: 26
+    character: 36
+  end_position:
+    bytes: 556
+    line: 26
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 556
+    line: 26
+    character: 37
+  end_position:
+    bytes: 559
+    line: 26
+    character: 40
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 559
+    line: 26
+    character: 40
+  end_position:
+    bytes: 560
+    line: 26
+    character: 40
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 560
+    line: 27
+    character: 1
+  end_position:
+    bytes: 561
+    line: 27
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 561
+    line: 28
+    character: 1
+  end_position:
+    bytes: 566
+    line: 28
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: local
+- start_position:
+    bytes: 566
+    line: 28
+    character: 6
+  end_position:
+    bytes: 567
+    line: 28
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 567
+    line: 28
+    character: 7
+  end_position:
+    bytes: 571
+    line: 28
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: _fn3
+- start_position:
+    bytes: 571
+    line: 28
+    character: 11
+  end_position:
+    bytes: 572
+    line: 28
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 572
+    line: 28
+    character: 12
+  end_position:
+    bytes: 573
+    line: 28
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 573
+    line: 28
+    character: 13
+  end_position:
+    bytes: 574
+    line: 28
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 574
+    line: 28
+    character: 14
+  end_position:
+    bytes: 582
+    line: 28
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: function
+- start_position:
+    bytes: 582
+    line: 28
+    character: 22
+  end_position:
+    bytes: 583
+    line: 28
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 583
+    line: 28
+    character: 23
+  end_position:
+    bytes: 584
+    line: 28
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 584
+    line: 28
+    character: 24
+  end_position:
+    bytes: 585
+    line: 28
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 585
+    line: 28
+    character: 25
+  end_position:
+    bytes: 586
+    line: 28
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 586
+    line: 28
+    character: 26
+  end_position:
+    bytes: 592
+    line: 28
+    character: 32
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 592
+    line: 28
+    character: 32
+  end_position:
+    bytes: 593
+    line: 28
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 593
+    line: 28
+    character: 33
+  end_position:
+    bytes: 594
+    line: 28
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 594
+    line: 29
+    character: 1
+  end_position:
+    bytes: 595
+    line: 29
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 595
+    line: 29
+    character: 2
+  end_position:
+    bytes: 601
+    line: 29
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 601
+    line: 29
+    character: 8
+  end_position:
+    bytes: 602
+    line: 29
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 602
+    line: 29
+    character: 9
+  end_position:
+    bytes: 603
+    line: 29
+    character: 10
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 603
+    line: 29
+    character: 10
+  end_position:
+    bytes: 604
+    line: 29
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 604
+    line: 30
+    character: 1
+  end_position:
+    bytes: 607
+    line: 30
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 607
+    line: 30
+    character: 4
+  end_position:
+    bytes: 608
+    line: 30
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 608
+    line: 31
+    character: 1
+  end_position:
+    bytes: 608
+    line: 31
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/ast.snap
new file mode 100644
index 00000000..571b1441
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/ast.snap
@@ -0,0 +1,655 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/roblox_cases/pass/types_chained_optionals
+---
+stmts:
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: Identifier
+              identifier: Config
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 1
+              character: 13
+            end_position:
+              bytes: 13
+              line: 1
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 13
+                line: 1
+                character: 14
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Table:
+            braces:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    end_position:
+                      bytes: 15
+                      line: 1
+                      character: 16
+                    token_type:
+                      type: Symbol
+                      symbol: "{"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 166
+                      line: 5
+                      character: 1
+                    end_position:
+                      bytes: 167
+                      line: 5
+                      character: 2
+                    token_type:
+                      type: Symbol
+                      symbol: "}"
+                  trailing_trivia: []
+            fields:
+              pairs:
+                - Punctuated:
+                    - key:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 16
+                                line: 2
+                                character: 1
+                              end_position:
+                                bytes: 20
+                                line: 2
+                                character: 5
+                              token_type:
+                                type: Whitespace
+                                characters: "    "
+                          token:
+                            start_position:
+                              bytes: 20
+                              line: 2
+                              character: 5
+                            end_position:
+                              bytes: 27
+                              line: 2
+                              character: 12
+                            token_type:
+                              type: Identifier
+                              identifier: option1
+                          trailing_trivia: []
+                      colon:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 27
+                            line: 2
+                            character: 12
+                          end_position:
+                            bytes: 28
+                            line: 2
+                            character: 13
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 28
+                              line: 2
+                              character: 13
+                            end_position:
+                              bytes: 29
+                              line: 2
+                              character: 14
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      value:
+                        Optional:
+                          base:
+                            Optional:
+                              base:
+                                Basic:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 29
+                                      line: 2
+                                      character: 14
+                                    end_position:
+                                      bytes: 35
+                                      line: 2
+                                      character: 20
+                                    token_type:
+                                      type: Identifier
+                                      identifier: string
+                                  trailing_trivia: []
+                              question_mark:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 35
+                                    line: 2
+                                    character: 20
+                                  end_position:
+                                    bytes: 36
+                                    line: 2
+                                    character: 21
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "?"
+                                trailing_trivia: []
+                          question_mark:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 36
+                                line: 2
+                                character: 21
+                              end_position:
+                                bytes: 37
+                                line: 2
+                                character: 22
+                              token_type:
+                                type: Symbol
+                                symbol: "?"
+                            trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 37
+                          line: 2
+                          character: 22
+                        end_position:
+                          bytes: 38
+                          line: 2
+                          character: 23
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 38
+                            line: 2
+                            character: 23
+                          end_position:
+                            bytes: 39
+                            line: 2
+                            character: 24
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                        - start_position:
+                            bytes: 39
+                            line: 2
+                            character: 24
+                          end_position:
+                            bytes: 78
+                            line: 2
+                            character: 63
+                          token_type:
+                            type: SingleLineComment
+                            comment: " you probably need it once in a while"
+                        - start_position:
+                            bytes: 78
+                            line: 2
+                            character: 63
+                          end_position:
+                            bytes: 79
+                            line: 2
+                            character: 63
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                - Punctuated:
+                    - key:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 79
+                                line: 3
+                                character: 1
+                              end_position:
+                                bytes: 83
+                                line: 3
+                                character: 5
+                              token_type:
+                                type: Whitespace
+                                characters: "    "
+                          token:
+                            start_position:
+                              bytes: 83
+                              line: 3
+                              character: 5
+                            end_position:
+                              bytes: 90
+                              line: 3
+                              character: 12
+                            token_type:
+                              type: Identifier
+                              identifier: option2
+                          trailing_trivia: []
+                      colon:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 90
+                            line: 3
+                            character: 12
+                          end_position:
+                            bytes: 91
+                            line: 3
+                            character: 13
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 91
+                              line: 3
+                              character: 13
+                            end_position:
+                              bytes: 92
+                              line: 3
+                              character: 14
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      value:
+                        Optional:
+                          base:
+                            Optional:
+                              base:
+                                Optional:
+                                  base:
+                                    Basic:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 92
+                                          line: 3
+                                          character: 14
+                                        end_position:
+                                          bytes: 98
+                                          line: 3
+                                          character: 20
+                                        token_type:
+                                          type: Identifier
+                                          identifier: string
+                                      trailing_trivia: []
+                                  question_mark:
+                                    leading_trivia: []
+                                    token:
+                                      start_position:
+                                        bytes: 98
+                                        line: 3
+                                        character: 20
+                                      end_position:
+                                        bytes: 99
+                                        line: 3
+                                        character: 21
+                                      token_type:
+                                        type: Symbol
+                                        symbol: "?"
+                                    trailing_trivia: []
+                              question_mark:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 99
+                                    line: 3
+                                    character: 21
+                                  end_position:
+                                    bytes: 100
+                                    line: 3
+                                    character: 22
+                                  token_type:
+                                    type: Symbol
+                                    symbol: "?"
+                                trailing_trivia: []
+                          question_mark:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 100
+                                line: 3
+                                character: 22
+                              end_position:
+                                bytes: 101
+                                line: 3
+                                character: 23
+                              token_type:
+                                type: Symbol
+                                symbol: "?"
+                            trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 101
+                          line: 3
+                          character: 23
+                        end_position:
+                          bytes: 102
+                          line: 3
+                          character: 24
+                        token_type:
+                          type: Symbol
+                          symbol: ","
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 102
+                            line: 3
+                            character: 24
+                          end_position:
+                            bytes: 103
+                            line: 3
+                            character: 25
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                        - start_position:
+                            bytes: 103
+                            line: 3
+                            character: 25
+                          end_position:
+                            bytes: 117
+                            line: 3
+                            character: 39
+                          token_type:
+                            type: SingleLineComment
+                            comment: " once a year"
+                        - start_position:
+                            bytes: 117
+                            line: 3
+                            character: 39
+                          end_position:
+                            bytes: 118
+                            line: 3
+                            character: 39
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                - End:
+                    key:
+                      Name:
+                        leading_trivia:
+                          - start_position:
+                              bytes: 118
+                              line: 4
+                              character: 1
+                            end_position:
+                              bytes: 122
+                              line: 4
+                              character: 5
+                            token_type:
+                              type: Whitespace
+                              characters: "    "
+                        token:
+                          start_position:
+                            bytes: 122
+                            line: 4
+                            character: 5
+                          end_position:
+                            bytes: 129
+                            line: 4
+                            character: 12
+                          token_type:
+                            type: Identifier
+                            identifier: option3
+                        trailing_trivia: []
+                    colon:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 129
+                          line: 4
+                          character: 12
+                        end_position:
+                          bytes: 130
+                          line: 4
+                          character: 13
+                        token_type:
+                          type: Symbol
+                          symbol: ":"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 130
+                            line: 4
+                            character: 13
+                          end_position:
+                            bytes: 131
+                            line: 4
+                            character: 14
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    value:
+                      Optional:
+                        base:
+                          Optional:
+                            base:
+                              Optional:
+                                base:
+                                  Optional:
+                                    base:
+                                      Optional:
+                                        base:
+                                          Optional:
+                                            base:
+                                              Basic:
+                                                leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 131
+                                                    line: 4
+                                                    character: 14
+                                                  end_position:
+                                                    bytes: 137
+                                                    line: 4
+                                                    character: 20
+                                                  token_type:
+                                                    type: Identifier
+                                                    identifier: string
+                                                trailing_trivia: []
+                                            question_mark:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 137
+                                                  line: 4
+                                                  character: 20
+                                                end_position:
+                                                  bytes: 138
+                                                  line: 4
+                                                  character: 21
+                                                token_type:
+                                                  type: Symbol
+                                                  symbol: "?"
+                                              trailing_trivia: []
+                                        question_mark:
+                                          leading_trivia: []
+                                          token:
+                                            start_position:
+                                              bytes: 138
+                                              line: 4
+                                              character: 21
+                                            end_position:
+                                              bytes: 139
+                                              line: 4
+                                              character: 22
+                                            token_type:
+                                              type: Symbol
+                                              symbol: "?"
+                                          trailing_trivia: []
+                                    question_mark:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 139
+                                          line: 4
+                                          character: 22
+                                        end_position:
+                                          bytes: 140
+                                          line: 4
+                                          character: 23
+                                        token_type:
+                                          type: Symbol
+                                          symbol: "?"
+                                      trailing_trivia: []
+                                question_mark:
+                                  leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 140
+                                      line: 4
+                                      character: 23
+                                    end_position:
+                                      bytes: 141
+                                      line: 4
+                                      character: 24
+                                    token_type:
+                                      type: Symbol
+                                      symbol: "?"
+                                  trailing_trivia: []
+                            question_mark:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 141
+                                  line: 4
+                                  character: 24
+                                end_position:
+                                  bytes: 142
+                                  line: 4
+                                  character: 25
+                                token_type:
+                                  type: Symbol
+                                  symbol: "?"
+                              trailing_trivia: []
+                        question_mark:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 142
+                              line: 4
+                              character: 25
+                            end_position:
+                              bytes: 143
+                              line: 4
+                              character: 26
+                            token_type:
+                              type: Symbol
+                              symbol: "?"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 143
+                                line: 4
+                                character: 26
+                              end_position:
+                                bytes: 144
+                                line: 4
+                                character: 27
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                            - start_position:
+                                bytes: 144
+                                line: 4
+                                character: 27
+                              end_position:
+                                bytes: 165
+                                line: 4
+                                character: 48
+                              token_type:
+                                type: SingleLineComment
+                                comment: " once in your life!"
+                            - start_position:
+                                bytes: 165
+                                line: 4
+                                character: 48
+                              end_position:
+                                bytes: 166
+                                line: 4
+                                character: 48
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/source.lua
new file mode 100644
index 00000000..0809eac6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/source.lua
@@ -0,0 +1,5 @@
+type Config = {
+    option1: string??, -- you probably need it once in a while
+    option2: string???, -- once a year
+    option3: string?????? -- once in your life!
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/tokens.snap
new file mode 100644
index 00000000..30a57817
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_chained_optionals/tokens.snap
@@ -0,0 +1,521 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: Config
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 1
+  end_position:
+    bytes: 20
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 20
+    line: 2
+    character: 5
+  end_position:
+    bytes: 27
+    line: 2
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: option1
+- start_position:
+    bytes: 27
+    line: 2
+    character: 12
+  end_position:
+    bytes: 28
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 28
+    line: 2
+    character: 13
+  end_position:
+    bytes: 29
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 29
+    line: 2
+    character: 14
+  end_position:
+    bytes: 35
+    line: 2
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 35
+    line: 2
+    character: 20
+  end_position:
+    bytes: 36
+    line: 2
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 36
+    line: 2
+    character: 21
+  end_position:
+    bytes: 37
+    line: 2
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 37
+    line: 2
+    character: 22
+  end_position:
+    bytes: 38
+    line: 2
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 38
+    line: 2
+    character: 23
+  end_position:
+    bytes: 39
+    line: 2
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 39
+    line: 2
+    character: 24
+  end_position:
+    bytes: 78
+    line: 2
+    character: 63
+  token_type:
+    type: SingleLineComment
+    comment: " you probably need it once in a while"
+- start_position:
+    bytes: 78
+    line: 2
+    character: 63
+  end_position:
+    bytes: 79
+    line: 2
+    character: 63
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 79
+    line: 3
+    character: 1
+  end_position:
+    bytes: 83
+    line: 3
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 83
+    line: 3
+    character: 5
+  end_position:
+    bytes: 90
+    line: 3
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: option2
+- start_position:
+    bytes: 90
+    line: 3
+    character: 12
+  end_position:
+    bytes: 91
+    line: 3
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 91
+    line: 3
+    character: 13
+  end_position:
+    bytes: 92
+    line: 3
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 92
+    line: 3
+    character: 14
+  end_position:
+    bytes: 98
+    line: 3
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 98
+    line: 3
+    character: 20
+  end_position:
+    bytes: 99
+    line: 3
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 99
+    line: 3
+    character: 21
+  end_position:
+    bytes: 100
+    line: 3
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 100
+    line: 3
+    character: 22
+  end_position:
+    bytes: 101
+    line: 3
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 101
+    line: 3
+    character: 23
+  end_position:
+    bytes: 102
+    line: 3
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 102
+    line: 3
+    character: 24
+  end_position:
+    bytes: 103
+    line: 3
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 103
+    line: 3
+    character: 25
+  end_position:
+    bytes: 117
+    line: 3
+    character: 39
+  token_type:
+    type: SingleLineComment
+    comment: " once a year"
+- start_position:
+    bytes: 117
+    line: 3
+    character: 39
+  end_position:
+    bytes: 118
+    line: 3
+    character: 39
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 118
+    line: 4
+    character: 1
+  end_position:
+    bytes: 122
+    line: 4
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 122
+    line: 4
+    character: 5
+  end_position:
+    bytes: 129
+    line: 4
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: option3
+- start_position:
+    bytes: 129
+    line: 4
+    character: 12
+  end_position:
+    bytes: 130
+    line: 4
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 130
+    line: 4
+    character: 13
+  end_position:
+    bytes: 131
+    line: 4
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 131
+    line: 4
+    character: 14
+  end_position:
+    bytes: 137
+    line: 4
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 137
+    line: 4
+    character: 20
+  end_position:
+    bytes: 138
+    line: 4
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 138
+    line: 4
+    character: 21
+  end_position:
+    bytes: 139
+    line: 4
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 139
+    line: 4
+    character: 22
+  end_position:
+    bytes: 140
+    line: 4
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 140
+    line: 4
+    character: 23
+  end_position:
+    bytes: 141
+    line: 4
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 141
+    line: 4
+    character: 24
+  end_position:
+    bytes: 142
+    line: 4
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 142
+    line: 4
+    character: 25
+  end_position:
+    bytes: 143
+    line: 4
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: "?"
+- start_position:
+    bytes: 143
+    line: 4
+    character: 26
+  end_position:
+    bytes: 144
+    line: 4
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 144
+    line: 4
+    character: 27
+  end_position:
+    bytes: 165
+    line: 4
+    character: 48
+  token_type:
+    type: SingleLineComment
+    comment: " once in your life!"
+- start_position:
+    bytes: 165
+    line: 4
+    character: 48
+  end_position:
+    bytes: 166
+    line: 4
+    character: 48
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 166
+    line: 5
+    character: 1
+  end_position:
+    bytes: 167
+    line: 5
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 167
+    line: 5
+    character: 2
+  end_position:
+    bytes: 167
+    line: 5
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/ast.snap
new file mode 100644
index 00000000..09e4dc03
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/ast.snap
@@ -0,0 +1,605 @@
+---
+source: full-moon/tests/pass_cases.rs
+assertion_line: 52
+expression: ast.nodes()
+input_file: full-moon/tests/roblox_cases/pass/types_loops
+---
+stmts:
+  - - GenericFor:
+        for_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: for
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        names:
+          pairs:
+            - Punctuated:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    token_type:
+                      type: Identifier
+                      identifier: i
+                  trailing_trivia: []
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 5
+                      line: 1
+                      character: 6
+                    end_position:
+                      bytes: 6
+                      line: 1
+                      character: 7
+                    token_type:
+                      type: Symbol
+                      symbol: ","
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 6
+                        line: 1
+                        character: 7
+                      end_position:
+                        bytes: 7
+                        line: 1
+                        character: 8
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  end_position:
+                    bytes: 8
+                    line: 1
+                    character: 9
+                  token_type:
+                    type: Identifier
+                    identifier: v
+                trailing_trivia: []
+        in_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 17
+              line: 1
+              character: 18
+            end_position:
+              bytes: 19
+              line: 1
+              character: 20
+            token_type:
+              type: Symbol
+              symbol: in
+          trailing_trivia:
+            - start_position:
+                bytes: 19
+                line: 1
+                character: 20
+              end_position:
+                bytes: 20
+                line: 1
+                character: 21
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                FunctionCall:
+                  prefix:
+                    Name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        end_position:
+                          bytes: 25
+                          line: 1
+                          character: 26
+                        token_type:
+                          type: Identifier
+                          identifier: pairs
+                      trailing_trivia: []
+                  suffixes:
+                    - Call:
+                        AnonymousCall:
+                          Parentheses:
+                            parentheses:
+                              tokens:
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 25
+                                      line: 1
+                                      character: 26
+                                    end_position:
+                                      bytes: 26
+                                      line: 1
+                                      character: 27
+                                    token_type:
+                                      type: Symbol
+                                      symbol: (
+                                  trailing_trivia: []
+                                - leading_trivia: []
+                                  token:
+                                    start_position:
+                                      bytes: 26
+                                      line: 1
+                                      character: 27
+                                    end_position:
+                                      bytes: 27
+                                      line: 1
+                                      character: 28
+                                    token_type:
+                                      type: Symbol
+                                      symbol: )
+                                  trailing_trivia:
+                                    - start_position:
+                                        bytes: 27
+                                        line: 1
+                                        character: 28
+                                      end_position:
+                                        bytes: 28
+                                        line: 1
+                                        character: 29
+                                      token_type:
+                                        type: Whitespace
+                                        characters: " "
+                            arguments:
+                              pairs: []
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 28
+              line: 1
+              character: 29
+            end_position:
+              bytes: 30
+              line: 1
+              character: 31
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 30
+                line: 1
+                character: 31
+              end_position:
+                bytes: 31
+                line: 1
+                character: 31
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts: []
+        end_token:
+          leading_trivia:
+            - start_position:
+                bytes: 31
+                line: 2
+                character: 1
+              end_position:
+                bytes: 32
+                line: 2
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 32
+              line: 3
+              character: 1
+            end_position:
+              bytes: 35
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 35
+                line: 3
+                character: 4
+              end_position:
+                bytes: 36
+                line: 3
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        type_specifiers:
+          - ~
+          - punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 8
+                  line: 1
+                  character: 9
+                end_position:
+                  bytes: 9
+                  line: 1
+                  character: 10
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 9
+                    line: 1
+                    character: 10
+                  end_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  end_position:
+                    bytes: 16
+                    line: 1
+                    character: 17
+                  token_type:
+                    type: Identifier
+                    identifier: string
+                trailing_trivia:
+                  - start_position:
+                      bytes: 16
+                      line: 1
+                      character: 17
+                    end_position:
+                      bytes: 17
+                      line: 1
+                      character: 18
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+    - ~
+  - - NumericFor:
+        for_token:
+          leading_trivia:
+            - start_position:
+                bytes: 36
+                line: 4
+                character: 1
+              end_position:
+                bytes: 37
+                line: 4
+                character: 1
+              token_type:
+                type: Whitespace
+                characters: "\n"
+          token:
+            start_position:
+              bytes: 37
+              line: 5
+              character: 1
+            end_position:
+              bytes: 40
+              line: 5
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: for
+          trailing_trivia:
+            - start_position:
+                bytes: 40
+                line: 5
+                character: 4
+              end_position:
+                bytes: 41
+                line: 5
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        index_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 41
+              line: 5
+              character: 5
+            end_position:
+              bytes: 42
+              line: 5
+              character: 6
+            token_type:
+              type: Identifier
+              identifier: i
+          trailing_trivia: []
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 51
+              line: 5
+              character: 15
+            end_position:
+              bytes: 52
+              line: 5
+              character: 16
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 52
+                line: 5
+                character: 16
+              end_position:
+                bytes: 53
+                line: 5
+                character: 17
+              token_type:
+                type: Whitespace
+                characters: " "
+        start:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 53
+                line: 5
+                character: 17
+              end_position:
+                bytes: 54
+                line: 5
+                character: 18
+              token_type:
+                type: Number
+                text: "1"
+            trailing_trivia: []
+        start_end_comma:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 54
+              line: 5
+              character: 18
+            end_position:
+              bytes: 55
+              line: 5
+              character: 19
+            token_type:
+              type: Symbol
+              symbol: ","
+          trailing_trivia:
+            - start_position:
+                bytes: 55
+                line: 5
+                character: 19
+              end_position:
+                bytes: 56
+                line: 5
+                character: 20
+              token_type:
+                type: Whitespace
+                characters: " "
+        end:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 56
+                line: 5
+                character: 20
+              end_position:
+                bytes: 58
+                line: 5
+                character: 22
+              token_type:
+                type: Number
+                text: "10"
+            trailing_trivia: []
+        end_step_comma:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 58
+              line: 5
+              character: 22
+            end_position:
+              bytes: 59
+              line: 5
+              character: 23
+            token_type:
+              type: Symbol
+              symbol: ","
+          trailing_trivia:
+            - start_position:
+                bytes: 59
+                line: 5
+                character: 23
+              end_position:
+                bytes: 60
+                line: 5
+                character: 24
+              token_type:
+                type: Whitespace
+                characters: " "
+        step:
+          Number:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 60
+                line: 5
+                character: 24
+              end_position:
+                bytes: 61
+                line: 5
+                character: 25
+              token_type:
+                type: Number
+                text: "2"
+            trailing_trivia:
+              - start_position:
+                  bytes: 61
+                  line: 5
+                  character: 25
+                end_position:
+                  bytes: 62
+                  line: 5
+                  character: 26
+                token_type:
+                  type: Whitespace
+                  characters: " "
+        do_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 62
+              line: 5
+              character: 26
+            end_position:
+              bytes: 64
+              line: 5
+              character: 28
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 64
+                line: 5
+                character: 28
+              end_position:
+                bytes: 65
+                line: 5
+                character: 28
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        block:
+          stmts: []
+        end_token:
+          leading_trivia:
+            - start_position:
+                bytes: 65
+                line: 6
+                character: 1
+              end_position:
+                bytes: 70
+                line: 6
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: "    \n"
+          token:
+            start_position:
+              bytes: 70
+              line: 7
+              character: 1
+            end_position:
+              bytes: 73
+              line: 7
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia: []
+        type_specifier:
+          punctuation:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 42
+                line: 5
+                character: 6
+              end_position:
+                bytes: 43
+                line: 5
+                character: 7
+              token_type:
+                type: Symbol
+                symbol: ":"
+            trailing_trivia:
+              - start_position:
+                  bytes: 43
+                  line: 5
+                  character: 7
+                end_position:
+                  bytes: 44
+                  line: 5
+                  character: 8
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          type_info:
+            Basic:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 44
+                  line: 5
+                  character: 8
+                end_position:
+                  bytes: 50
+                  line: 5
+                  character: 14
+                token_type:
+                  type: Identifier
+                  identifier: number
+              trailing_trivia:
+                - start_position:
+                    bytes: 50
+                    line: 5
+                    character: 14
+                  end_position:
+                    bytes: 51
+                    line: 5
+                    character: 15
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/source.lua
new file mode 100644
index 00000000..cd390565
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/source.lua
@@ -0,0 +1,7 @@
+for i, v: string in pairs() do
+
+end
+
+for i: number = 1, 10, 2 do
+    
+end
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/tokens.snap
new file mode 100644
index 00000000..84b58afe
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_loops/tokens.snap
@@ -0,0 +1,490 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+input_file: full-moon/tests/roblox_cases/pass/types_loops
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: i
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: v
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: in
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Identifier
+    identifier: pairs
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 27
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 26
+    line: 1
+    character: 27
+  end_position:
+    bytes: 27
+    line: 1
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 27
+    line: 1
+    character: 28
+  end_position:
+    bytes: 28
+    line: 1
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 28
+    line: 1
+    character: 29
+  end_position:
+    bytes: 30
+    line: 1
+    character: 31
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 30
+    line: 1
+    character: 31
+  end_position:
+    bytes: 31
+    line: 1
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 31
+    line: 2
+    character: 1
+  end_position:
+    bytes: 32
+    line: 2
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 32
+    line: 3
+    character: 1
+  end_position:
+    bytes: 35
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 35
+    line: 3
+    character: 4
+  end_position:
+    bytes: 36
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 36
+    line: 4
+    character: 1
+  end_position:
+    bytes: 37
+    line: 4
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 37
+    line: 5
+    character: 1
+  end_position:
+    bytes: 40
+    line: 5
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 40
+    line: 5
+    character: 4
+  end_position:
+    bytes: 41
+    line: 5
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 41
+    line: 5
+    character: 5
+  end_position:
+    bytes: 42
+    line: 5
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: i
+- start_position:
+    bytes: 42
+    line: 5
+    character: 6
+  end_position:
+    bytes: 43
+    line: 5
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 43
+    line: 5
+    character: 7
+  end_position:
+    bytes: 44
+    line: 5
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 44
+    line: 5
+    character: 8
+  end_position:
+    bytes: 50
+    line: 5
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 50
+    line: 5
+    character: 14
+  end_position:
+    bytes: 51
+    line: 5
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 51
+    line: 5
+    character: 15
+  end_position:
+    bytes: 52
+    line: 5
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 52
+    line: 5
+    character: 16
+  end_position:
+    bytes: 53
+    line: 5
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 53
+    line: 5
+    character: 17
+  end_position:
+    bytes: 54
+    line: 5
+    character: 18
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 54
+    line: 5
+    character: 18
+  end_position:
+    bytes: 55
+    line: 5
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 55
+    line: 5
+    character: 19
+  end_position:
+    bytes: 56
+    line: 5
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 56
+    line: 5
+    character: 20
+  end_position:
+    bytes: 58
+    line: 5
+    character: 22
+  token_type:
+    type: Number
+    text: "10"
+- start_position:
+    bytes: 58
+    line: 5
+    character: 22
+  end_position:
+    bytes: 59
+    line: 5
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 59
+    line: 5
+    character: 23
+  end_position:
+    bytes: 60
+    line: 5
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 60
+    line: 5
+    character: 24
+  end_position:
+    bytes: 61
+    line: 5
+    character: 25
+  token_type:
+    type: Number
+    text: "2"
+- start_position:
+    bytes: 61
+    line: 5
+    character: 25
+  end_position:
+    bytes: 62
+    line: 5
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 62
+    line: 5
+    character: 26
+  end_position:
+    bytes: 64
+    line: 5
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 64
+    line: 5
+    character: 28
+  end_position:
+    bytes: 65
+    line: 5
+    character: 28
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 65
+    line: 6
+    character: 1
+  end_position:
+    bytes: 70
+    line: 6
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    \n"
+- start_position:
+    bytes: 70
+    line: 7
+    character: 1
+  end_position:
+    bytes: 73
+    line: 7
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 73
+    line: 7
+    character: 4
+  end_position:
+    bytes: 73
+    line: 7
+    character: 4
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/ast.snap
new file mode 100644
index 00000000..8030101c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/ast.snap
@@ -0,0 +1,532 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/roblox_cases/pass/types_nested_array
+---
+stmts:
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 8
+              line: 1
+              character: 9
+            token_type:
+              type: Identifier
+              identifier: Foo
+          trailing_trivia:
+            - start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 9
+              line: 1
+              character: 10
+            end_position:
+              bytes: 10
+              line: 1
+              character: 11
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 10
+                line: 1
+                character: 11
+              end_position:
+                bytes: 11
+                line: 1
+                character: 12
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Array:
+            braces:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    end_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Symbol
+                      symbol: "{"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      end_position:
+                        bytes: 13
+                        line: 1
+                        character: 14
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 24
+                      line: 1
+                      character: 25
+                    end_position:
+                      bytes: 25
+                      line: 1
+                      character: 26
+                    token_type:
+                      type: Symbol
+                      symbol: "}"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 25
+                        line: 1
+                        character: 26
+                      end_position:
+                        bytes: 26
+                        line: 1
+                        character: 26
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+            type_info:
+              Array:
+                braces:
+                  tokens:
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 13
+                          line: 1
+                          character: 14
+                        end_position:
+                          bytes: 14
+                          line: 1
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: "{"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 14
+                            line: 1
+                            character: 15
+                          end_position:
+                            bytes: 15
+                            line: 1
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 22
+                          line: 1
+                          character: 23
+                        end_position:
+                          bytes: 23
+                          line: 1
+                          character: 24
+                        token_type:
+                          type: Symbol
+                          symbol: "}"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 23
+                            line: 1
+                            character: 24
+                          end_position:
+                            bytes: 24
+                            line: 1
+                            character: 25
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                type_info:
+                  Basic:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      end_position:
+                        bytes: 21
+                        line: 1
+                        character: 22
+                      token_type:
+                        type: Identifier
+                        identifier: string
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 21
+                          line: 1
+                          character: 22
+                        end_position:
+                          bytes: 22
+                          line: 1
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+    - ~
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 26
+              line: 2
+              character: 1
+            end_position:
+              bytes: 30
+              line: 2
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 30
+                line: 2
+                character: 5
+              end_position:
+                bytes: 31
+                line: 2
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 31
+              line: 2
+              character: 6
+            end_position:
+              bytes: 34
+              line: 2
+              character: 9
+            token_type:
+              type: Identifier
+              identifier: Foo
+          trailing_trivia:
+            - start_position:
+                bytes: 34
+                line: 2
+                character: 9
+              end_position:
+                bytes: 35
+                line: 2
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 35
+              line: 2
+              character: 10
+            end_position:
+              bytes: 36
+              line: 2
+              character: 11
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 36
+                line: 2
+                character: 11
+              end_position:
+                bytes: 37
+                line: 2
+                character: 12
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Array:
+            braces:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 37
+                      line: 2
+                      character: 12
+                    end_position:
+                      bytes: 38
+                      line: 2
+                      character: 13
+                    token_type:
+                      type: Symbol
+                      symbol: "{"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 38
+                        line: 2
+                        character: 13
+                      end_position:
+                        bytes: 39
+                        line: 2
+                        character: 14
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 67
+                      line: 2
+                      character: 42
+                    end_position:
+                      bytes: 68
+                      line: 2
+                      character: 43
+                    token_type:
+                      type: Symbol
+                      symbol: "}"
+                  trailing_trivia: []
+            type_info:
+              Table:
+                braces:
+                  tokens:
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 39
+                          line: 2
+                          character: 14
+                        end_position:
+                          bytes: 40
+                          line: 2
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: "{"
+                      trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 65
+                          line: 2
+                          character: 40
+                        end_position:
+                          bytes: 66
+                          line: 2
+                          character: 41
+                        token_type:
+                          type: Symbol
+                          symbol: "}"
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 66
+                            line: 2
+                            character: 41
+                          end_position:
+                            bytes: 67
+                            line: 2
+                            character: 42
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                fields:
+                  pairs:
+                    - Punctuated:
+                        - key:
+                            Name:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 40
+                                  line: 2
+                                  character: 15
+                                end_position:
+                                  bytes: 44
+                                  line: 2
+                                  character: 19
+                                token_type:
+                                  type: Identifier
+                                  identifier: Name
+                              trailing_trivia: []
+                          colon:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 44
+                                line: 2
+                                character: 19
+                              end_position:
+                                bytes: 45
+                                line: 2
+                                character: 20
+                              token_type:
+                                type: Symbol
+                                symbol: ":"
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 45
+                                  line: 2
+                                  character: 20
+                                end_position:
+                                  bytes: 46
+                                  line: 2
+                                  character: 21
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          value:
+                            Basic:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 46
+                                  line: 2
+                                  character: 21
+                                end_position:
+                                  bytes: 52
+                                  line: 2
+                                  character: 27
+                                token_type:
+                                  type: Identifier
+                                  identifier: string
+                              trailing_trivia: []
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 52
+                              line: 2
+                              character: 27
+                            end_position:
+                              bytes: 53
+                              line: 2
+                              character: 28
+                            token_type:
+                              type: Symbol
+                              symbol: ","
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 53
+                                line: 2
+                                character: 28
+                              end_position:
+                                bytes: 54
+                                line: 2
+                                character: 29
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                    - End:
+                        key:
+                          Name:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 54
+                                line: 2
+                                character: 29
+                              end_position:
+                                bytes: 57
+                                line: 2
+                                character: 32
+                              token_type:
+                                type: Identifier
+                                identifier: Foo
+                            trailing_trivia: []
+                        colon:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 57
+                              line: 2
+                              character: 32
+                            end_position:
+                              bytes: 58
+                              line: 2
+                              character: 33
+                            token_type:
+                              type: Symbol
+                              symbol: ":"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 58
+                                line: 2
+                                character: 33
+                              end_position:
+                                bytes: 59
+                                line: 2
+                                character: 34
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                        value:
+                          Basic:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 59
+                                line: 2
+                                character: 34
+                              end_position:
+                                bytes: 65
+                                line: 2
+                                character: 40
+                              token_type:
+                                type: Identifier
+                                identifier: number
+                            trailing_trivia: []
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/source.lua
new file mode 100644
index 00000000..a479e797
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/source.lua
@@ -0,0 +1,2 @@
+type Foo = { { string } }
+type Foo = { {Name: string, Foo: number} }
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/tokens.snap
new file mode 100644
index 00000000..b7bc4f7a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_nested_array/tokens.snap
@@ -0,0 +1,434 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: Foo
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 24
+    line: 1
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 24
+    line: 1
+    character: 25
+  end_position:
+    bytes: 25
+    line: 1
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 25
+    line: 1
+    character: 26
+  end_position:
+    bytes: 26
+    line: 1
+    character: 26
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 26
+    line: 2
+    character: 1
+  end_position:
+    bytes: 30
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 30
+    line: 2
+    character: 5
+  end_position:
+    bytes: 31
+    line: 2
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 31
+    line: 2
+    character: 6
+  end_position:
+    bytes: 34
+    line: 2
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: Foo
+- start_position:
+    bytes: 34
+    line: 2
+    character: 9
+  end_position:
+    bytes: 35
+    line: 2
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 35
+    line: 2
+    character: 10
+  end_position:
+    bytes: 36
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 36
+    line: 2
+    character: 11
+  end_position:
+    bytes: 37
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 37
+    line: 2
+    character: 12
+  end_position:
+    bytes: 38
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 38
+    line: 2
+    character: 13
+  end_position:
+    bytes: 39
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 39
+    line: 2
+    character: 14
+  end_position:
+    bytes: 40
+    line: 2
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 40
+    line: 2
+    character: 15
+  end_position:
+    bytes: 44
+    line: 2
+    character: 19
+  token_type:
+    type: Identifier
+    identifier: Name
+- start_position:
+    bytes: 44
+    line: 2
+    character: 19
+  end_position:
+    bytes: 45
+    line: 2
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 45
+    line: 2
+    character: 20
+  end_position:
+    bytes: 46
+    line: 2
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 46
+    line: 2
+    character: 21
+  end_position:
+    bytes: 52
+    line: 2
+    character: 27
+  token_type:
+    type: Identifier
+    identifier: string
+- start_position:
+    bytes: 52
+    line: 2
+    character: 27
+  end_position:
+    bytes: 53
+    line: 2
+    character: 28
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 53
+    line: 2
+    character: 28
+  end_position:
+    bytes: 54
+    line: 2
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 54
+    line: 2
+    character: 29
+  end_position:
+    bytes: 57
+    line: 2
+    character: 32
+  token_type:
+    type: Identifier
+    identifier: Foo
+- start_position:
+    bytes: 57
+    line: 2
+    character: 32
+  end_position:
+    bytes: 58
+    line: 2
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 58
+    line: 2
+    character: 33
+  end_position:
+    bytes: 59
+    line: 2
+    character: 34
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 59
+    line: 2
+    character: 34
+  end_position:
+    bytes: 65
+    line: 2
+    character: 40
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 65
+    line: 2
+    character: 40
+  end_position:
+    bytes: 66
+    line: 2
+    character: 41
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 66
+    line: 2
+    character: 41
+  end_position:
+    bytes: 67
+    line: 2
+    character: 42
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 67
+    line: 2
+    character: 42
+  end_position:
+    bytes: 68
+    line: 2
+    character: 43
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 68
+    line: 2
+    character: 43
+  end_position:
+    bytes: 68
+    line: 2
+    character: 43
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/ast.snap
new file mode 100644
index 00000000..917421f1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/ast.snap
@@ -0,0 +1,321 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/roblox_cases/pass/types_semicolon_delimeter
+---
+stmts:
+  - - TypeDeclaration:
+        type_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Identifier
+              identifier: type
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        base:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 8
+              line: 1
+              character: 9
+            token_type:
+              type: Identifier
+              identifier: Foo
+          trailing_trivia:
+            - start_position:
+                bytes: 8
+                line: 1
+                character: 9
+              end_position:
+                bytes: 9
+                line: 1
+                character: 10
+              token_type:
+                type: Whitespace
+                characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 9
+              line: 1
+              character: 10
+            end_position:
+              bytes: 10
+              line: 1
+              character: 11
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 10
+                line: 1
+                character: 11
+              end_position:
+                bytes: 11
+                line: 1
+                character: 12
+              token_type:
+                type: Whitespace
+                characters: " "
+        declare_as:
+          Table:
+            braces:
+              tokens:
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    end_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Symbol
+                      symbol: "{"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      end_position:
+                        bytes: 13
+                        line: 1
+                        character: 13
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+                - leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 41
+                      line: 4
+                      character: 1
+                    end_position:
+                      bytes: 42
+                      line: 4
+                      character: 2
+                    token_type:
+                      type: Symbol
+                      symbol: "}"
+                  trailing_trivia: []
+            fields:
+              pairs:
+                - Punctuated:
+                    - key:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 13
+                                line: 2
+                                character: 1
+                              end_position:
+                                bytes: 14
+                                line: 2
+                                character: 2
+                              token_type:
+                                type: Whitespace
+                                characters: "\t"
+                          token:
+                            start_position:
+                              bytes: 14
+                              line: 2
+                              character: 2
+                            end_position:
+                              bytes: 17
+                              line: 2
+                              character: 5
+                            token_type:
+                              type: Identifier
+                              identifier: bar
+                          trailing_trivia: []
+                      colon:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 17
+                            line: 2
+                            character: 5
+                          end_position:
+                            bytes: 18
+                            line: 2
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 18
+                              line: 2
+                              character: 6
+                            end_position:
+                              bytes: 19
+                              line: 2
+                              character: 7
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      value:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 19
+                              line: 2
+                              character: 7
+                            end_position:
+                              bytes: 25
+                              line: 2
+                              character: 13
+                            token_type:
+                              type: Identifier
+                              identifier: number
+                          trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 25
+                          line: 2
+                          character: 13
+                        end_position:
+                          bytes: 26
+                          line: 2
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: ;
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 26
+                            line: 2
+                            character: 14
+                          end_position:
+                            bytes: 27
+                            line: 2
+                            character: 14
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                - Punctuated:
+                    - key:
+                        Name:
+                          leading_trivia:
+                            - start_position:
+                                bytes: 27
+                                line: 3
+                                character: 1
+                              end_position:
+                                bytes: 28
+                                line: 3
+                                character: 2
+                              token_type:
+                                type: Whitespace
+                                characters: "\t"
+                          token:
+                            start_position:
+                              bytes: 28
+                              line: 3
+                              character: 2
+                            end_position:
+                              bytes: 31
+                              line: 3
+                              character: 5
+                            token_type:
+                              type: Identifier
+                              identifier: baz
+                          trailing_trivia: []
+                      colon:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 31
+                            line: 3
+                            character: 5
+                          end_position:
+                            bytes: 32
+                            line: 3
+                            character: 6
+                          token_type:
+                            type: Symbol
+                            symbol: ":"
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 32
+                              line: 3
+                              character: 6
+                            end_position:
+                              bytes: 33
+                              line: 3
+                              character: 7
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                      value:
+                        Basic:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 33
+                              line: 3
+                              character: 7
+                            end_position:
+                              bytes: 39
+                              line: 3
+                              character: 13
+                            token_type:
+                              type: Identifier
+                              identifier: number
+                          trailing_trivia: []
+                    - leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 39
+                          line: 3
+                          character: 13
+                        end_position:
+                          bytes: 40
+                          line: 3
+                          character: 14
+                        token_type:
+                          type: Symbol
+                          symbol: ;
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 40
+                            line: 3
+                            character: 14
+                          end_position:
+                            bytes: 41
+                            line: 3
+                            character: 14
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/source.lua
new file mode 100644
index 00000000..48a69f27
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/source.lua
@@ -0,0 +1,4 @@
+type Foo = {
+	bar: number;
+	baz: number;
+}
\ No newline at end of file
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/tokens.snap
new file mode 100644
index 00000000..38cffb09
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/types_semicolon_delimeter/tokens.snap
@@ -0,0 +1,269 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: type
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: Foo
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 13
+    line: 2
+    character: 1
+  end_position:
+    bytes: 14
+    line: 2
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 14
+    line: 2
+    character: 2
+  end_position:
+    bytes: 17
+    line: 2
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: bar
+- start_position:
+    bytes: 17
+    line: 2
+    character: 5
+  end_position:
+    bytes: 18
+    line: 2
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 18
+    line: 2
+    character: 6
+  end_position:
+    bytes: 19
+    line: 2
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 7
+  end_position:
+    bytes: 25
+    line: 2
+    character: 13
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 25
+    line: 2
+    character: 13
+  end_position:
+    bytes: 26
+    line: 2
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 26
+    line: 2
+    character: 14
+  end_position:
+    bytes: 27
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 27
+    line: 3
+    character: 1
+  end_position:
+    bytes: 28
+    line: 3
+    character: 2
+  token_type:
+    type: Whitespace
+    characters: "\t"
+- start_position:
+    bytes: 28
+    line: 3
+    character: 2
+  end_position:
+    bytes: 31
+    line: 3
+    character: 5
+  token_type:
+    type: Identifier
+    identifier: baz
+- start_position:
+    bytes: 31
+    line: 3
+    character: 5
+  end_position:
+    bytes: 32
+    line: 3
+    character: 6
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 32
+    line: 3
+    character: 6
+  end_position:
+    bytes: 33
+    line: 3
+    character: 7
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 33
+    line: 3
+    character: 7
+  end_position:
+    bytes: 39
+    line: 3
+    character: 13
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 39
+    line: 3
+    character: 13
+  end_position:
+    bytes: 40
+    line: 3
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: ;
+- start_position:
+    bytes: 40
+    line: 3
+    character: 14
+  end_position:
+    bytes: 41
+    line: 3
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 41
+    line: 4
+    character: 1
+  end_position:
+    bytes: 42
+    line: 4
+    character: 2
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 42
+    line: 4
+    character: 2
+  end_position:
+    bytes: 42
+    line: 4
+    character: 2
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/ast.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/ast.snap
new file mode 100644
index 00000000..6f787e5d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/ast.snap
@@ -0,0 +1,181 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: ast.nodes()
+---
+stmts:
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 0
+                line: 1
+                character: 1
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: print
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 5
+                            line: 1
+                            character: 6
+                          end_position:
+                            bytes: 6
+                            line: 1
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 29
+                            line: 2
+                            character: 12
+                          end_position:
+                            bytes: 30
+                            line: 2
+                            character: 13
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 30
+                              line: 2
+                              character: 13
+                            end_position:
+                              bytes: 31
+                              line: 2
+                              character: 13
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 6
+                                line: 1
+                                character: 7
+                              end_position:
+                                bytes: 29
+                                line: 2
+                                character: 12
+                              token_type:
+                                type: StringLiteral
+                                literal: "testing \\z\n\t   twelve"
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+  - - FunctionCall:
+        prefix:
+          Name:
+            leading_trivia:
+              - start_position:
+                  bytes: 31
+                  line: 3
+                  character: 1
+                end_position:
+                  bytes: 32
+                  line: 3
+                  character: 1
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+            token:
+              start_position:
+                bytes: 32
+                line: 4
+                character: 1
+              end_position:
+                bytes: 37
+                line: 4
+                character: 6
+              token_type:
+                type: Identifier
+                identifier: print
+            trailing_trivia: []
+        suffixes:
+          - Call:
+              AnonymousCall:
+                Parentheses:
+                  parentheses:
+                    tokens:
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 37
+                            line: 4
+                            character: 6
+                          end_position:
+                            bytes: 38
+                            line: 4
+                            character: 7
+                          token_type:
+                            type: Symbol
+                            symbol: (
+                        trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 54
+                            line: 5
+                            character: 8
+                          end_position:
+                            bytes: 55
+                            line: 5
+                            character: 9
+                          token_type:
+                            type: Symbol
+                            symbol: )
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 55
+                              line: 5
+                              character: 9
+                            end_position:
+                              bytes: 56
+                              line: 5
+                              character: 9
+                            token_type:
+                              type: Whitespace
+                              characters: "\n"
+                  arguments:
+                    pairs:
+                      - End:
+                          String:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 38
+                                line: 4
+                                character: 7
+                              end_position:
+                                bytes: 54
+                                line: 5
+                                character: 8
+                              token_type:
+                                type: StringLiteral
+                                literal: "Hello \\\n\tWorld"
+                                quote_type: Double
+                            trailing_trivia: []
+    - ~
+
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/source.lua b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/source.lua
new file mode 100644
index 00000000..3167d6c9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/source.lua
@@ -0,0 +1,5 @@
+print("testing \z
+	   twelve")
+
+print("Hello \
+	World")
diff --git a/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/tokens.snap b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/tokens.snap
new file mode 100644
index 00000000..42a20cf6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/roblox_cases/pass/z-escape-string/tokens.snap
@@ -0,0 +1,138 @@
+---
+source: full-moon/tests/pass_cases.rs
+expression: tokens
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 29
+    line: 2
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: "testing \\z\n\t   twelve"
+    quote_type: Double
+- start_position:
+    bytes: 29
+    line: 2
+    character: 12
+  end_position:
+    bytes: 30
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 30
+    line: 2
+    character: 13
+  end_position:
+    bytes: 31
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 31
+    line: 3
+    character: 1
+  end_position:
+    bytes: 32
+    line: 3
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 32
+    line: 4
+    character: 1
+  end_position:
+    bytes: 37
+    line: 4
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: print
+- start_position:
+    bytes: 37
+    line: 4
+    character: 6
+  end_position:
+    bytes: 38
+    line: 4
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 38
+    line: 4
+    character: 7
+  end_position:
+    bytes: 54
+    line: 5
+    character: 8
+  token_type:
+    type: StringLiteral
+    literal: "Hello \\\n\tWorld"
+    quote_type: Double
+- start_position:
+    bytes: 54
+    line: 5
+    character: 8
+  end_position:
+    bytes: 55
+    line: 5
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 55
+    line: 5
+    character: 9
+  end_position:
+    bytes: 56
+    line: 5
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 56
+    line: 6
+    character: 1
+  end_position:
+    bytes: 56
+    line: 6
+    character: 1
+  token_type:
+    type: Eof
+
diff --git a/src/Rust/vvs_parser/src/tests/visitors.rs b/src/Rust/vvs_parser/src/tests/visitors.rs
new file mode 100644
index 00000000..838b32ed
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/visitors.rs
@@ -0,0 +1,164 @@
+use crate::{
+    ast,
+    prelude::parser::parse_lua_tree as parse,
+    tokenizer::*,
+    visitors::{Visitor, VisitorMut},
+};
+
+#[test]
+fn test_visitor() {
+    struct FunctionCallVisitor {
+        called: Vec<String>,
+    }
+
+    impl Visitor for FunctionCallVisitor {
+        fn visit_function_call(&mut self, call: &ast::FunctionCall) {
+            match call.prefix() {
+                ast::Prefix::Name(token) => {
+                    self.called.push(token.to_string());
+                }
+
+                _ => unreachable!(),
+            }
+        }
+    }
+
+    let code = parse("foo(bar())").unwrap();
+    let mut visitor = FunctionCallVisitor { called: Vec::new() };
+
+    visitor.visit_ast(&code);
+
+    assert_eq!(visitor.called, vec!["foo", "bar"]);
+}
+
+#[test]
+fn test_visitor_mut() {
+    struct SnakeNamer;
+
+    impl VisitorMut for SnakeNamer {
+        fn visit_local_assignment(&mut self, assignment: ast::LocalAssignment) -> ast::LocalAssignment {
+            let name_list = assignment
+                .names()
+                .pairs()
+                .map(|name| {
+                    name.to_owned().map(|value| {
+                        value.with_token(Token::new(TokenType::Identifier {
+                            identifier: value.token().to_string().replace('s', "sss").into(),
+                        }))
+                    })
+                })
+                .collect();
+
+            assignment.with_names(name_list)
+        }
+    }
+
+    let code = parse("local dogs, snakes = 1").unwrap();
+    let code = SnakeNamer.visit_ast(code);
+    assert_eq!(format!("{code}"), "local dogsss, sssnakesss = 1");
+
+    struct PositionValidator;
+
+    impl Visitor for PositionValidator {
+        fn visit_local_assignment(&mut self, assignment: &ast::LocalAssignment) {
+            for name in assignment.names() {
+                assert_eq!(name.end_position().bytes() - name.start_position().bytes(), name.token().to_string().len());
+            }
+        }
+    }
+
+    let code = code.update_positions();
+    PositionValidator.visit_ast(&code);
+}
+
+#[test]
+fn test_visit_token() {
+    #[derive(Default)]
+    struct CommentVisitor {
+        comments: Vec<String>,
+    }
+
+    impl Visitor for CommentVisitor {
+        fn visit_single_line_comment(&mut self, token: &Token) {
+            self.comments.push(token.to_string());
+        }
+    }
+
+    let mut visitor = CommentVisitor::default();
+
+    let code = parse(
+        r#"
+    -- bla bla bla
+    --[[
+        multi line comment
+    ]]
+
+    -- comment here
+    local x = 1
+    -- and here
+    "#,
+    )
+    .unwrap();
+
+    visitor.visit_ast(&code);
+    assert_eq!(visitor.comments, vec!["-- bla bla bla", "-- comment here", "-- and here"]);
+}
+
+#[test]
+fn test_end_visit() {
+    #[derive(Default)]
+    struct LogVisitor {
+        instructions: usize,
+        if_start_at: usize,
+        if_end_at: usize,
+        called_at: usize,
+    }
+
+    impl Visitor for LogVisitor {
+        fn visit_if(&mut self, _: &ast::If) {
+            self.instructions += 1;
+            self.if_start_at = self.instructions
+        }
+
+        fn visit_if_end(&mut self, _: &ast::If) {
+            self.instructions += 1;
+            self.if_end_at = self.instructions;
+        }
+
+        fn visit_call(&mut self, _: &ast::Call) {
+            self.instructions += 1;
+            self.called_at = self.instructions;
+        }
+    }
+
+    let mut visitor = LogVisitor::default();
+    visitor.visit_ast(
+        &parse(
+            r#"
+    if true then
+        call()
+    end
+    "#,
+        )
+        .unwrap(),
+    );
+
+    assert_eq!(visitor.if_start_at, 1);
+    assert_eq!(visitor.called_at, 2);
+    assert_eq!(visitor.if_end_at, 3);
+}
+
+#[test]
+fn test_unary_visitor_regression() {
+    struct TestVisitor(bool);
+
+    impl Visitor for TestVisitor {
+        fn visit_un_op(&mut self, _: &ast::UnOp) {
+            self.0 = true;
+        }
+    }
+
+    let mut visitor = TestVisitor(false);
+    visitor.visit_ast(&parse("local x = #{}").unwrap());
+    assert!(visitor.0, "Unary operation was not visited");
+}
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/ast.snap
new file mode 100644
index 00000000..f1086135
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/ast.snap
@@ -0,0 +1,21 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.ast()
+input_file: vvs_parser/tests/vivy_cases/fail/parser/job
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 14
+      line: 2
+      character: 1
+    end_position:
+      bytes: 14
+      line: 2
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/ast_to_string.snap
new file mode 100644
index 00000000..d95027ad
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/ast_to_string.snap
@@ -0,0 +1,6 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+input_file: vvs_parser/tests/vivy_cases/fail/parser/job
+---
+""
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/error_display.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/error_display.snap
new file mode 100644
index 00000000..a5166952
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/error_display.snap
@@ -0,0 +1,10 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/vivy_cases/fail/parser/job
+---
+error[ast]: invalid name for a job, can't be ponctuated or have columns
+  ┌─ source.lua:1:1
+  │
+1 │ job x.y() end
+  │ ^^^
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/errors.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/errors.snap
new file mode 100644
index 00000000..f04aec5a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/errors.snap
@@ -0,0 +1,19 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.errors()
+input_file: vvs_parser/tests/vivy_cases/fail/parser/job
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 3
+        line: 1
+        character: 4
+      token_type:
+        type: Symbol
+        symbol: job
+    additional: "invalid name for a job, can't be ponctuated or have columns"
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/source.lua
new file mode 100644
index 00000000..618768b8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/source.lua
@@ -0,0 +1 @@
+job x.y() end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/tokens.snap
new file mode 100644
index 00000000..77d1ec72
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/job/tokens.snap
@@ -0,0 +1,125 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/fail/parser/job
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: job
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Identifier
+    identifier: x
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Identifier
+    identifier: y
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 10
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 9
+    line: 1
+    character: 10
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 14
+    line: 2
+    character: 1
+  end_position:
+    bytes: 14
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/ast.snap
new file mode 100644
index 00000000..cdf8616b
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/ast.snap
@@ -0,0 +1,169 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.ast()
+input_file: vvs_parser/tests/vivy_cases/fail/parser/main_after_returns
+---
+nodes:
+  stmts:
+    - - FunctionCall:
+          prefix:
+            Name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 51
+                  line: 3
+                  character: 19
+                end_position:
+                  bytes: 52
+                  line: 3
+                  character: 20
+                token_type:
+                  type: Identifier
+                  identifier: a
+              trailing_trivia: []
+          suffixes:
+            - Index:
+                Dot:
+                  dot:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 52
+                        line: 3
+                        character: 20
+                      end_position:
+                        bytes: 53
+                        line: 3
+                        character: 21
+                      token_type:
+                        type: Symbol
+                        symbol: "."
+                    trailing_trivia: []
+                  name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 53
+                        line: 3
+                        character: 21
+                      end_position:
+                        bytes: 54
+                        line: 3
+                        character: 22
+                      token_type:
+                        type: Identifier
+                        identifier: b
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 54
+                          line: 3
+                          character: 22
+                        end_position:
+                          bytes: 55
+                          line: 3
+                          character: 23
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+            - Call:
+                AnonymousCall:
+                  TableConstructor:
+                    braces:
+                      tokens:
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 55
+                              line: 3
+                              character: 23
+                            end_position:
+                              bytes: 56
+                              line: 3
+                              character: 24
+                            token_type:
+                              type: Symbol
+                              symbol: "{"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 56
+                                line: 3
+                                character: 24
+                              end_position:
+                                bytes: 57
+                                line: 3
+                                character: 25
+                              token_type:
+                                type: Whitespace
+                                characters: " "
+                        - leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 64
+                              line: 3
+                              character: 32
+                            end_position:
+                              bytes: 65
+                              line: 3
+                              character: 33
+                            token_type:
+                              type: Symbol
+                              symbol: "}"
+                          trailing_trivia:
+                            - start_position:
+                                bytes: 65
+                                line: 3
+                                character: 33
+                              end_position:
+                                bytes: 66
+                                line: 3
+                                character: 33
+                              token_type:
+                                type: Whitespace
+                                characters: "\n"
+                    fields:
+                      pairs:
+                        - End:
+                            NoKey:
+                              String:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 57
+                                    line: 3
+                                    character: 25
+                                  end_position:
+                                    bytes: 63
+                                    line: 3
+                                    character: 31
+                                  token_type:
+                                    type: StringLiteral
+                                    literal: init
+                                    quote_type: Double
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 63
+                                      line: 3
+                                      character: 31
+                                    end_position:
+                                      bytes: 64
+                                      line: 3
+                                      character: 32
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 70
+      line: 5
+      character: 1
+    end_position:
+      bytes: 70
+      line: 5
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/ast_to_string.snap
new file mode 100644
index 00000000..d7ff39c5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/ast_to_string.snap
@@ -0,0 +1,6 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+input_file: vvs_parser/tests/vivy_cases/fail/parser/main_after_returns
+---
+"a.b { \"init\" }\n"
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/error_display.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/error_display.snap
new file mode 100644
index 00000000..9dadcef5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/error_display.snap
@@ -0,0 +1,16 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/vivy_cases/fail/parser/main_after_returns
+---
+error[ast]: expected no more assignations after the return token
+  ┌─ source.lua:3:5
+  │
+3 │     "something" = a.b { "init" }
+  │     ^^^^^^^^^^^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:3:5
+  │
+3 │     "something" = a.b { "init" }
+  │     ^^^^^^^^^^^
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/errors.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/errors.snap
new file mode 100644
index 00000000..233876e1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/errors.snap
@@ -0,0 +1,35 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.errors()
+input_file: vvs_parser/tests/vivy_cases/fail/parser/main_after_returns
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 37
+        line: 3
+        character: 5
+      end_position:
+        bytes: 48
+        line: 3
+        character: 16
+      token_type:
+        type: StringLiteral
+        literal: something
+        quote_type: Double
+    additional: expected no more assignations after the return token
+- AstError:
+    token:
+      start_position:
+        bytes: 37
+        line: 3
+        character: 5
+      end_position:
+        bytes: 48
+        line: 3
+        character: 16
+      token_type:
+        type: StringLiteral
+        literal: something
+        quote_type: Double
+    additional: "unexpected token, this needs to be a statement"
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/source.lua
new file mode 100644
index 00000000..d72b488f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/source.lua
@@ -0,0 +1,4 @@
+main "init" do
+    return "init"
+    "something" = a.b { "init" }
+end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/tokens.snap
new file mode 100644
index 00000000..ab44c98c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/main_after_returns/tokens.snap
@@ -0,0 +1,327 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/fail/parser/main_after_returns
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: main
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 19
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 5
+  end_position:
+    bytes: 25
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 25
+    line: 2
+    character: 11
+  end_position:
+    bytes: 26
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 2
+    character: 12
+  end_position:
+    bytes: 32
+    line: 2
+    character: 18
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 32
+    line: 2
+    character: 18
+  end_position:
+    bytes: 33
+    line: 2
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 33
+    line: 3
+    character: 1
+  end_position:
+    bytes: 37
+    line: 3
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 37
+    line: 3
+    character: 5
+  end_position:
+    bytes: 48
+    line: 3
+    character: 16
+  token_type:
+    type: StringLiteral
+    literal: something
+    quote_type: Double
+- start_position:
+    bytes: 48
+    line: 3
+    character: 16
+  end_position:
+    bytes: 49
+    line: 3
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 49
+    line: 3
+    character: 17
+  end_position:
+    bytes: 50
+    line: 3
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 50
+    line: 3
+    character: 18
+  end_position:
+    bytes: 51
+    line: 3
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 51
+    line: 3
+    character: 19
+  end_position:
+    bytes: 52
+    line: 3
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 52
+    line: 3
+    character: 20
+  end_position:
+    bytes: 53
+    line: 3
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 53
+    line: 3
+    character: 21
+  end_position:
+    bytes: 54
+    line: 3
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: b
+- start_position:
+    bytes: 54
+    line: 3
+    character: 22
+  end_position:
+    bytes: 55
+    line: 3
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 55
+    line: 3
+    character: 23
+  end_position:
+    bytes: 56
+    line: 3
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 56
+    line: 3
+    character: 24
+  end_position:
+    bytes: 57
+    line: 3
+    character: 25
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 57
+    line: 3
+    character: 25
+  end_position:
+    bytes: 63
+    line: 3
+    character: 31
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 63
+    line: 3
+    character: 31
+  end_position:
+    bytes: 64
+    line: 3
+    character: 32
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 64
+    line: 3
+    character: 32
+  end_position:
+    bytes: 65
+    line: 3
+    character: 33
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 65
+    line: 3
+    character: 33
+  end_position:
+    bytes: 66
+    line: 3
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 66
+    line: 4
+    character: 1
+  end_position:
+    bytes: 69
+    line: 4
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 69
+    line: 4
+    character: 4
+  end_position:
+    bytes: 70
+    line: 4
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 70
+    line: 5
+    character: 1
+  end_position:
+    bytes: 70
+    line: 5
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/ast.snap
new file mode 100644
index 00000000..68fa43d1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/ast.snap
@@ -0,0 +1,21 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.ast()
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_1
+---
+nodes:
+  stmts: []
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 9
+      line: 2
+      character: 1
+    end_position:
+      bytes: 9
+      line: 2
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/ast_to_string.snap
new file mode 100644
index 00000000..c603e68a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/ast_to_string.snap
@@ -0,0 +1,6 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_1
+---
+""
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/error_display.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/error_display.snap
new file mode 100644
index 00000000..98382375
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/error_display.snap
@@ -0,0 +1,16 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_1
+---
+error[ast]: invalid option specifier statement
+  ┌─ source.lua:1:1
+  │
+1 │ option a
+  │ ^^^^^^
+
+error[ast]: expected ',' to continue option list or '=' to assign default values to the list
+  ┌─ source.lua:2:1
+  │
+2 │ 
+  │ ^
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/errors.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/errors.snap
new file mode 100644
index 00000000..4f6ddb4e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/errors.snap
@@ -0,0 +1,32 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.errors()
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_1
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 6
+        line: 1
+        character: 7
+      token_type:
+        type: Symbol
+        symbol: option
+    additional: invalid option specifier statement
+- AstError:
+    token:
+      start_position:
+        bytes: 9
+        line: 2
+        character: 1
+      end_position:
+        bytes: 9
+        line: 2
+        character: 1
+      token_type:
+        type: Eof
+    additional: "expected ',' to continue option list or '=' to assign default values to the list"
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/source.lua
new file mode 100644
index 00000000..b90250c6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/source.lua
@@ -0,0 +1 @@
+option a
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/tokens.snap
new file mode 100644
index 00000000..9f7d957a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_1/tokens.snap
@@ -0,0 +1,59 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_1
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: option
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 8
+    line: 1
+    character: 9
+  token_type:
+    type: Identifier
+    identifier: a
+- start_position:
+    bytes: 8
+    line: 1
+    character: 9
+  end_position:
+    bytes: 9
+    line: 1
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 9
+    line: 2
+    character: 1
+  end_position:
+    bytes: 9
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/ast.snap
new file mode 100644
index 00000000..059a13e8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/ast.snap
@@ -0,0 +1,107 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.ast()
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_2
+---
+nodes:
+  stmts:
+    - - Assignment:
+          var_list:
+            pairs:
+              - End:
+                  Name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 12
+                        line: 1
+                        character: 13
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 17
+                      token_type:
+                        type: Identifier
+                        identifier: tata
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 16
+                          line: 1
+                          character: 17
+                        end_position:
+                          bytes: 17
+                          line: 1
+                          character: 18
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+          equal_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 17
+                line: 1
+                character: 18
+              end_position:
+                bytes: 18
+                line: 1
+                character: 19
+              token_type:
+                type: Symbol
+                symbol: "="
+            trailing_trivia:
+              - start_position:
+                  bytes: 18
+                  line: 1
+                  character: 19
+                end_position:
+                  bytes: 19
+                  line: 1
+                  character: 20
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          expr_list:
+            pairs:
+              - End:
+                  Number:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 19
+                        line: 1
+                        character: 20
+                      end_position:
+                        bytes: 20
+                        line: 1
+                        character: 21
+                      token_type:
+                        type: Number
+                        text: "1"
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        end_position:
+                          bytes: 21
+                          line: 1
+                          character: 21
+                        token_type:
+                          type: Whitespace
+                          characters: "\n"
+      - ~
+eof:
+  leading_trivia: []
+  token:
+    start_position:
+      bytes: 21
+      line: 2
+      character: 1
+    end_position:
+      bytes: 21
+      line: 2
+      character: 1
+    token_type:
+      type: Eof
+  trailing_trivia: []
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/ast_to_string.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/ast_to_string.snap
new file mode 100644
index 00000000..ee6801e9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/ast_to_string.snap
@@ -0,0 +1,6 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "vvs_parser::print(&ast)"
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_2
+---
+"tata = 1\n"
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/error_display.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/error_display.snap
new file mode 100644
index 00000000..8765e4ba
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/error_display.snap
@@ -0,0 +1,22 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: "String::from_utf8(output.into_inner()).unwrap()"
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_2
+---
+error[ast]: invalid option specifier statement
+  ┌─ source.lua:1:1
+  │
+1 │ option toto.tata = 1
+  │ ^^^^^^
+
+error[ast]: expected ',' to continue option list or '=' to assign default values to the list
+  ┌─ source.lua:1:12
+  │
+1 │ option toto.tata = 1
+  │            ^
+
+error[ast]: unexpected token, this needs to be a statement
+  ┌─ source.lua:1:12
+  │
+1 │ option toto.tata = 1
+  │            ^
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/errors.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/errors.snap
new file mode 100644
index 00000000..3ebe2481
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/errors.snap
@@ -0,0 +1,47 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: result.errors()
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_2
+---
+- AstError:
+    token:
+      start_position:
+        bytes: 0
+        line: 1
+        character: 1
+      end_position:
+        bytes: 6
+        line: 1
+        character: 7
+      token_type:
+        type: Symbol
+        symbol: option
+    additional: invalid option specifier statement
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Symbol
+        symbol: "."
+    additional: "expected ',' to continue option list or '=' to assign default values to the list"
+- AstError:
+    token:
+      start_position:
+        bytes: 11
+        line: 1
+        character: 12
+      end_position:
+        bytes: 12
+        line: 1
+        character: 13
+      token_type:
+        type: Symbol
+        symbol: "."
+    additional: "unexpected token, this needs to be a statement"
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/source.lua
new file mode 100644
index 00000000..eb3a72dc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/source.lua
@@ -0,0 +1 @@
+option toto.tata = 1
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/tokens.snap
new file mode 100644
index 00000000..f9281e81
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/fail/parser/option_decl_2/tokens.snap
@@ -0,0 +1,125 @@
+---
+source: vvs_parser/tests/fail_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/fail/parser/option_decl_2
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: option
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: toto
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: tata
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 17
+    line: 1
+    character: 18
+  end_position:
+    bytes: 18
+    line: 1
+    character: 19
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 18
+    line: 1
+    character: 19
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 21
+    line: 2
+    character: 1
+  end_position:
+    bytes: 21
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/ast.snap
new file mode 100644
index 00000000..c225f36e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/ast.snap
@@ -0,0 +1,62 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+assertion_line: 44
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy/pass/import
+---
+stmts:
+  - - Import:
+        import_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: import
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 7
+              line: 1
+              character: 8
+            end_position:
+              bytes: 13
+              line: 1
+              character: 14
+            token_type:
+              type: StringLiteral
+              literal: math
+              quote_type: Double
+          trailing_trivia:
+            - start_position:
+                bytes: 13
+                line: 1
+                character: 14
+              end_position:
+                bytes: 14
+                line: 1
+                character: 14
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/source.lua
new file mode 100644
index 00000000..468fc97f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/source.lua
@@ -0,0 +1 @@
+import "math"
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/tokens.snap
new file mode 100644
index 00000000..f029aafc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/import/tokens.snap
@@ -0,0 +1,60 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy/pass/import
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: import
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: StringLiteral
+    literal: math
+    quote_type: Double
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 14
+    line: 2
+    character: 1
+  end_position:
+    bytes: 14
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/ast.snap
new file mode 100644
index 00000000..2138fc27
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/ast.snap
@@ -0,0 +1,126 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/job
+---
+stmts:
+  - - JobDeclaration:
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: job
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          names:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 10
+                      line: 1
+                      character: 11
+                    token_type:
+                      type: Identifier
+                      identifier: retime
+                  trailing_trivia: []
+          colon_name: ~
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 10
+                    line: 1
+                    character: 11
+                  end_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  end_position:
+                    bytes: 12
+                    line: 1
+                    character: 13
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia:
+                  - start_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    end_position:
+                      bytes: 13
+                      line: 1
+                      character: 14
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+          parameters:
+            pairs: []
+          type_specifiers: []
+          block:
+            stmts: []
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 13
+                line: 1
+                character: 14
+              end_position:
+                bytes: 16
+                line: 1
+                character: 17
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 16
+                  line: 1
+                  character: 17
+                end_position:
+                  bytes: 17
+                  line: 1
+                  character: 17
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/source.lua
new file mode 100644
index 00000000..34231ae6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/source.lua
@@ -0,0 +1 @@
+job retime() end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/tokens.snap
new file mode 100644
index 00000000..8ee54e75
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job/tokens.snap
@@ -0,0 +1,103 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy/pass/job
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: job
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 10
+    line: 1
+    character: 11
+  token_type:
+    type: Identifier
+    identifier: retime
+- start_position:
+    bytes: 10
+    line: 1
+    character: 11
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 16
+    line: 1
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 16
+    line: 1
+    character: 17
+  end_position:
+    bytes: 17
+    line: 1
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 17
+    line: 2
+    character: 1
+  end_position:
+    bytes: 17
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/ast.snap
new file mode 100644
index 00000000..b629273e
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/ast.snap
@@ -0,0 +1,963 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/job_yield
+---
+stmts:
+  - - JobDeclaration:
+        function_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 3
+              line: 1
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: job
+          trailing_trivia:
+            - start_position:
+                bytes: 3
+                line: 1
+                character: 4
+              end_position:
+                bytes: 4
+                line: 1
+                character: 5
+              token_type:
+                type: Whitespace
+                characters: " "
+        name:
+          names:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 4
+                      line: 1
+                      character: 5
+                    end_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    token_type:
+                      type: Identifier
+                      identifier: syl_modulo
+                  trailing_trivia: []
+          colon_name: ~
+        body:
+          parameters_parentheses:
+            tokens:
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 14
+                    line: 1
+                    character: 15
+                  end_position:
+                    bytes: 15
+                    line: 1
+                    character: 16
+                  token_type:
+                    type: Symbol
+                    symbol: (
+                trailing_trivia: []
+              - leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 51
+                    line: 1
+                    character: 52
+                  end_position:
+                    bytes: 52
+                    line: 1
+                    character: 53
+                  token_type:
+                    type: Symbol
+                    symbol: )
+                trailing_trivia: []
+          parameters:
+            pairs:
+              - Punctuated:
+                  - name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 15
+                          line: 1
+                          character: 16
+                        end_position:
+                          bytes: 20
+                          line: 1
+                          character: 21
+                        token_type:
+                          type: Identifier
+                          identifier: every
+                      trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 28
+                        line: 1
+                        character: 29
+                      end_position:
+                        bytes: 29
+                        line: 1
+                        character: 30
+                      token_type:
+                        type: Symbol
+                        symbol: ","
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 29
+                          line: 1
+                          character: 30
+                        end_position:
+                          bytes: 30
+                          line: 1
+                          character: 31
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+              - Punctuated:
+                  - name:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 30
+                          line: 1
+                          character: 31
+                        end_position:
+                          bytes: 34
+                          line: 1
+                          character: 35
+                        token_type:
+                          type: Identifier
+                          identifier: disp
+                      trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 42
+                        line: 1
+                        character: 43
+                      end_position:
+                        bytes: 43
+                        line: 1
+                        character: 44
+                      token_type:
+                        type: Symbol
+                        symbol: ","
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 43
+                          line: 1
+                          character: 44
+                        end_position:
+                          bytes: 44
+                          line: 1
+                          character: 45
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+              - End:
+                  name:
+                    leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 44
+                        line: 1
+                        character: 45
+                      end_position:
+                        bytes: 45
+                        line: 1
+                        character: 46
+                      token_type:
+                        type: Identifier
+                        identifier: l
+                    trailing_trivia: []
+          type_specifiers:
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 20
+                    line: 1
+                    character: 21
+                  end_position:
+                    bytes: 21
+                    line: 1
+                    character: 22
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 21
+                      line: 1
+                      character: 22
+                    end_position:
+                      bytes: 22
+                      line: 1
+                      character: 23
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Basic:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 22
+                      line: 1
+                      character: 23
+                    end_position:
+                      bytes: 28
+                      line: 1
+                      character: 29
+                    token_type:
+                      type: Identifier
+                      identifier: number
+                  trailing_trivia: []
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 34
+                    line: 1
+                    character: 35
+                  end_position:
+                    bytes: 35
+                    line: 1
+                    character: 36
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 35
+                      line: 1
+                      character: 36
+                    end_position:
+                      bytes: 36
+                      line: 1
+                      character: 37
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Basic:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 36
+                      line: 1
+                      character: 37
+                    end_position:
+                      bytes: 42
+                      line: 1
+                      character: 43
+                    token_type:
+                      type: Identifier
+                      identifier: number
+                  trailing_trivia: []
+            - punctuation:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 45
+                    line: 1
+                    character: 46
+                  end_position:
+                    bytes: 46
+                    line: 1
+                    character: 47
+                  token_type:
+                    type: Symbol
+                    symbol: ":"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 46
+                      line: 1
+                      character: 47
+                    end_position:
+                      bytes: 47
+                      line: 1
+                      character: 48
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              type_info:
+                Basic:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 47
+                      line: 1
+                      character: 48
+                    end_position:
+                      bytes: 51
+                      line: 1
+                      character: 52
+                    token_type:
+                      type: Identifier
+                      identifier: line
+                  trailing_trivia: []
+          return_type:
+            punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 52
+                  line: 1
+                  character: 53
+                end_position:
+                  bytes: 53
+                  line: 1
+                  character: 54
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 53
+                    line: 1
+                    character: 54
+                  end_position:
+                    bytes: 54
+                    line: 1
+                    character: 55
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 54
+                    line: 1
+                    character: 55
+                  end_position:
+                    bytes: 58
+                    line: 1
+                    character: 59
+                  token_type:
+                    type: Identifier
+                    identifier: line
+                trailing_trivia:
+                  - start_position:
+                      bytes: 58
+                      line: 1
+                      character: 59
+                    end_position:
+                      bytes: 59
+                      line: 1
+                      character: 59
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          block:
+            stmts:
+              - - GenericFor:
+                    for_token:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 59
+                            line: 2
+                            character: 1
+                          end_position:
+                            bytes: 63
+                            line: 2
+                            character: 5
+                          token_type:
+                            type: Whitespace
+                            characters: "    "
+                      token:
+                        start_position:
+                          bytes: 63
+                          line: 2
+                          character: 5
+                        end_position:
+                          bytes: 66
+                          line: 2
+                          character: 8
+                        token_type:
+                          type: Symbol
+                          symbol: for
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 66
+                            line: 2
+                            character: 8
+                          end_position:
+                            bytes: 67
+                            line: 2
+                            character: 9
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    names:
+                      pairs:
+                        - Punctuated:
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 67
+                                  line: 2
+                                  character: 9
+                                end_position:
+                                  bytes: 68
+                                  line: 2
+                                  character: 10
+                                token_type:
+                                  type: Identifier
+                                  identifier: i
+                              trailing_trivia: []
+                            - leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 68
+                                  line: 2
+                                  character: 10
+                                end_position:
+                                  bytes: 69
+                                  line: 2
+                                  character: 11
+                                token_type:
+                                  type: Symbol
+                                  symbol: ","
+                              trailing_trivia: []
+                        - End:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 69
+                                line: 2
+                                character: 11
+                              end_position:
+                                bytes: 70
+                                line: 2
+                                character: 12
+                              token_type:
+                                type: Identifier
+                                identifier: s
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 70
+                                  line: 2
+                                  character: 12
+                                end_position:
+                                  bytes: 71
+                                  line: 2
+                                  character: 13
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                    in_token:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 71
+                          line: 2
+                          character: 13
+                        end_position:
+                          bytes: 73
+                          line: 2
+                          character: 15
+                        token_type:
+                          type: Symbol
+                          symbol: in
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 73
+                            line: 2
+                            character: 15
+                          end_position:
+                            bytes: 74
+                            line: 2
+                            character: 16
+                          token_type:
+                            type: Whitespace
+                            characters: " "
+                    expr_list:
+                      pairs:
+                        - End:
+                            Var:
+                              Name:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 74
+                                    line: 2
+                                    character: 16
+                                  end_position:
+                                    bytes: 75
+                                    line: 2
+                                    character: 17
+                                  token_type:
+                                    type: Identifier
+                                    identifier: l
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 75
+                                      line: 2
+                                      character: 17
+                                    end_position:
+                                      bytes: 76
+                                      line: 2
+                                      character: 18
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                    do_token:
+                      leading_trivia: []
+                      token:
+                        start_position:
+                          bytes: 76
+                          line: 2
+                          character: 18
+                        end_position:
+                          bytes: 78
+                          line: 2
+                          character: 20
+                        token_type:
+                          type: Symbol
+                          symbol: do
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 78
+                            line: 2
+                            character: 20
+                          end_position:
+                            bytes: 79
+                            line: 2
+                            character: 20
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                    block:
+                      stmts:
+                        - - If:
+                              if_token:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 79
+                                      line: 3
+                                      character: 1
+                                    end_position:
+                                      bytes: 87
+                                      line: 3
+                                      character: 9
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "        "
+                                token:
+                                  start_position:
+                                    bytes: 87
+                                    line: 3
+                                    character: 9
+                                  end_position:
+                                    bytes: 89
+                                    line: 3
+                                    character: 11
+                                  token_type:
+                                    type: Symbol
+                                    symbol: if
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 89
+                                      line: 3
+                                      character: 11
+                                    end_position:
+                                      bytes: 90
+                                      line: 3
+                                      character: 12
+                                    token_type:
+                                      type: Whitespace
+                                      characters: " "
+                              condition:
+                                BinaryOperator:
+                                  lhs:
+                                    Parentheses:
+                                      contained:
+                                        tokens:
+                                          - leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 90
+                                                line: 3
+                                                character: 12
+                                              end_position:
+                                                bytes: 91
+                                                line: 3
+                                                character: 13
+                                              token_type:
+                                                type: Symbol
+                                                symbol: (
+                                            trailing_trivia: []
+                                          - leading_trivia: []
+                                            token:
+                                              start_position:
+                                                bytes: 100
+                                                line: 3
+                                                character: 22
+                                              end_position:
+                                                bytes: 101
+                                                line: 3
+                                                character: 23
+                                              token_type:
+                                                type: Symbol
+                                                symbol: )
+                                            trailing_trivia:
+                                              - start_position:
+                                                  bytes: 101
+                                                  line: 3
+                                                  character: 23
+                                                end_position:
+                                                  bytes: 102
+                                                  line: 3
+                                                  character: 24
+                                                token_type:
+                                                  type: Whitespace
+                                                  characters: " "
+                                      expression:
+                                        BinaryOperator:
+                                          lhs:
+                                            Var:
+                                              Name:
+                                                leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 91
+                                                    line: 3
+                                                    character: 13
+                                                  end_position:
+                                                    bytes: 92
+                                                    line: 3
+                                                    character: 14
+                                                  token_type:
+                                                    type: Identifier
+                                                    identifier: i
+                                                trailing_trivia:
+                                                  - start_position:
+                                                      bytes: 92
+                                                      line: 3
+                                                      character: 14
+                                                    end_position:
+                                                      bytes: 93
+                                                      line: 3
+                                                      character: 15
+                                                    token_type:
+                                                      type: Whitespace
+                                                      characters: " "
+                                          binop:
+                                            Percent:
+                                              leading_trivia: []
+                                              token:
+                                                start_position:
+                                                  bytes: 93
+                                                  line: 3
+                                                  character: 15
+                                                end_position:
+                                                  bytes: 94
+                                                  line: 3
+                                                  character: 16
+                                                token_type:
+                                                  type: Symbol
+                                                  symbol: "%"
+                                              trailing_trivia:
+                                                - start_position:
+                                                    bytes: 94
+                                                    line: 3
+                                                    character: 16
+                                                  end_position:
+                                                    bytes: 95
+                                                    line: 3
+                                                    character: 17
+                                                  token_type:
+                                                    type: Whitespace
+                                                    characters: " "
+                                          rhs:
+                                            Var:
+                                              Name:
+                                                leading_trivia: []
+                                                token:
+                                                  start_position:
+                                                    bytes: 95
+                                                    line: 3
+                                                    character: 17
+                                                  end_position:
+                                                    bytes: 100
+                                                    line: 3
+                                                    character: 22
+                                                  token_type:
+                                                    type: Identifier
+                                                    identifier: every
+                                                trailing_trivia: []
+                                  binop:
+                                    TwoEqual:
+                                      leading_trivia: []
+                                      token:
+                                        start_position:
+                                          bytes: 102
+                                          line: 3
+                                          character: 24
+                                        end_position:
+                                          bytes: 104
+                                          line: 3
+                                          character: 26
+                                        token_type:
+                                          type: Symbol
+                                          symbol: "=="
+                                      trailing_trivia:
+                                        - start_position:
+                                            bytes: 104
+                                            line: 3
+                                            character: 26
+                                          end_position:
+                                            bytes: 105
+                                            line: 3
+                                            character: 27
+                                          token_type:
+                                            type: Whitespace
+                                            characters: " "
+                                  rhs:
+                                    Var:
+                                      Name:
+                                        leading_trivia: []
+                                        token:
+                                          start_position:
+                                            bytes: 105
+                                            line: 3
+                                            character: 27
+                                          end_position:
+                                            bytes: 109
+                                            line: 3
+                                            character: 31
+                                          token_type:
+                                            type: Identifier
+                                            identifier: disp
+                                        trailing_trivia:
+                                          - start_position:
+                                              bytes: 109
+                                              line: 3
+                                              character: 31
+                                            end_position:
+                                              bytes: 110
+                                              line: 3
+                                              character: 32
+                                            token_type:
+                                              type: Whitespace
+                                              characters: " "
+                              then_token:
+                                leading_trivia: []
+                                token:
+                                  start_position:
+                                    bytes: 110
+                                    line: 3
+                                    character: 32
+                                  end_position:
+                                    bytes: 114
+                                    line: 3
+                                    character: 36
+                                  token_type:
+                                    type: Symbol
+                                    symbol: then
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 114
+                                      line: 3
+                                      character: 36
+                                    end_position:
+                                      bytes: 115
+                                      line: 3
+                                      character: 36
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\n"
+                              block:
+                                stmts:
+                                  - - Yield:
+                                        token:
+                                          leading_trivia:
+                                            - start_position:
+                                                bytes: 115
+                                                line: 4
+                                                character: 1
+                                              end_position:
+                                                bytes: 127
+                                                line: 4
+                                                character: 13
+                                              token_type:
+                                                type: Whitespace
+                                                characters: "            "
+                                          token:
+                                            start_position:
+                                              bytes: 127
+                                              line: 4
+                                              character: 13
+                                            end_position:
+                                              bytes: 132
+                                              line: 4
+                                              character: 18
+                                            token_type:
+                                              type: Symbol
+                                              symbol: yield
+                                          trailing_trivia:
+                                            - start_position:
+                                                bytes: 132
+                                                line: 4
+                                                character: 18
+                                              end_position:
+                                                bytes: 133
+                                                line: 4
+                                                character: 19
+                                              token_type:
+                                                type: Whitespace
+                                                characters: " "
+                                        yielded:
+                                          pairs:
+                                            - End:
+                                                Var:
+                                                  Name:
+                                                    leading_trivia: []
+                                                    token:
+                                                      start_position:
+                                                        bytes: 133
+                                                        line: 4
+                                                        character: 19
+                                                      end_position:
+                                                        bytes: 134
+                                                        line: 4
+                                                        character: 20
+                                                      token_type:
+                                                        type: Identifier
+                                                        identifier: s
+                                                    trailing_trivia:
+                                                      - start_position:
+                                                          bytes: 134
+                                                          line: 4
+                                                          character: 20
+                                                        end_position:
+                                                          bytes: 135
+                                                          line: 4
+                                                          character: 20
+                                                        token_type:
+                                                          type: Whitespace
+                                                          characters: "\n"
+                                    - ~
+                              else_if: ~
+                              else_token: ~
+                              else: ~
+                              end_token:
+                                leading_trivia:
+                                  - start_position:
+                                      bytes: 135
+                                      line: 5
+                                      character: 1
+                                    end_position:
+                                      bytes: 143
+                                      line: 5
+                                      character: 9
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "        "
+                                token:
+                                  start_position:
+                                    bytes: 143
+                                    line: 5
+                                    character: 9
+                                  end_position:
+                                    bytes: 146
+                                    line: 5
+                                    character: 12
+                                  token_type:
+                                    type: Symbol
+                                    symbol: end
+                                trailing_trivia:
+                                  - start_position:
+                                      bytes: 146
+                                      line: 5
+                                      character: 12
+                                    end_position:
+                                      bytes: 147
+                                      line: 5
+                                      character: 12
+                                    token_type:
+                                      type: Whitespace
+                                      characters: "\n"
+                          - ~
+                    end_token:
+                      leading_trivia:
+                        - start_position:
+                            bytes: 147
+                            line: 6
+                            character: 1
+                          end_position:
+                            bytes: 151
+                            line: 6
+                            character: 5
+                          token_type:
+                            type: Whitespace
+                            characters: "    "
+                      token:
+                        start_position:
+                          bytes: 151
+                          line: 6
+                          character: 5
+                        end_position:
+                          bytes: 154
+                          line: 6
+                          character: 8
+                        token_type:
+                          type: Symbol
+                          symbol: end
+                      trailing_trivia:
+                        - start_position:
+                            bytes: 154
+                            line: 6
+                            character: 8
+                          end_position:
+                            bytes: 155
+                            line: 6
+                            character: 8
+                          token_type:
+                            type: Whitespace
+                            characters: "\n"
+                    type_specifiers:
+                      - ~
+                      - ~
+                - ~
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 155
+                line: 7
+                character: 1
+              end_position:
+                bytes: 158
+                line: 7
+                character: 4
+              token_type:
+                type: Symbol
+                symbol: end
+            trailing_trivia:
+              - start_position:
+                  bytes: 158
+                  line: 7
+                  character: 4
+                end_position:
+                  bytes: 159
+                  line: 7
+                  character: 4
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/source.lua
new file mode 100644
index 00000000..0e319dc5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/source.lua
@@ -0,0 +1,7 @@
+job syl_modulo(every: number, disp: number, l: line): line
+    for i,s in l do
+        if (i % every) == disp then
+            yield s
+        end
+    end
+end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/tokens.snap
new file mode 100644
index 00000000..03ccae97
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/job_yield/tokens.snap
@@ -0,0 +1,763 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/pass/job_yield
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 3
+    line: 1
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: job
+- start_position:
+    bytes: 3
+    line: 1
+    character: 4
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Identifier
+    identifier: syl_modulo
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: every
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 28
+    line: 1
+    character: 29
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 28
+    line: 1
+    character: 29
+  end_position:
+    bytes: 29
+    line: 1
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 29
+    line: 1
+    character: 30
+  end_position:
+    bytes: 30
+    line: 1
+    character: 31
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 30
+    line: 1
+    character: 31
+  end_position:
+    bytes: 34
+    line: 1
+    character: 35
+  token_type:
+    type: Identifier
+    identifier: disp
+- start_position:
+    bytes: 34
+    line: 1
+    character: 35
+  end_position:
+    bytes: 35
+    line: 1
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 35
+    line: 1
+    character: 36
+  end_position:
+    bytes: 36
+    line: 1
+    character: 37
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 36
+    line: 1
+    character: 37
+  end_position:
+    bytes: 42
+    line: 1
+    character: 43
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 42
+    line: 1
+    character: 43
+  end_position:
+    bytes: 43
+    line: 1
+    character: 44
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 43
+    line: 1
+    character: 44
+  end_position:
+    bytes: 44
+    line: 1
+    character: 45
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 44
+    line: 1
+    character: 45
+  end_position:
+    bytes: 45
+    line: 1
+    character: 46
+  token_type:
+    type: Identifier
+    identifier: l
+- start_position:
+    bytes: 45
+    line: 1
+    character: 46
+  end_position:
+    bytes: 46
+    line: 1
+    character: 47
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 46
+    line: 1
+    character: 47
+  end_position:
+    bytes: 47
+    line: 1
+    character: 48
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 47
+    line: 1
+    character: 48
+  end_position:
+    bytes: 51
+    line: 1
+    character: 52
+  token_type:
+    type: Identifier
+    identifier: line
+- start_position:
+    bytes: 51
+    line: 1
+    character: 52
+  end_position:
+    bytes: 52
+    line: 1
+    character: 53
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 52
+    line: 1
+    character: 53
+  end_position:
+    bytes: 53
+    line: 1
+    character: 54
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 53
+    line: 1
+    character: 54
+  end_position:
+    bytes: 54
+    line: 1
+    character: 55
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 54
+    line: 1
+    character: 55
+  end_position:
+    bytes: 58
+    line: 1
+    character: 59
+  token_type:
+    type: Identifier
+    identifier: line
+- start_position:
+    bytes: 58
+    line: 1
+    character: 59
+  end_position:
+    bytes: 59
+    line: 1
+    character: 59
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 59
+    line: 2
+    character: 1
+  end_position:
+    bytes: 63
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 63
+    line: 2
+    character: 5
+  end_position:
+    bytes: 66
+    line: 2
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: for
+- start_position:
+    bytes: 66
+    line: 2
+    character: 8
+  end_position:
+    bytes: 67
+    line: 2
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 67
+    line: 2
+    character: 9
+  end_position:
+    bytes: 68
+    line: 2
+    character: 10
+  token_type:
+    type: Identifier
+    identifier: i
+- start_position:
+    bytes: 68
+    line: 2
+    character: 10
+  end_position:
+    bytes: 69
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 69
+    line: 2
+    character: 11
+  end_position:
+    bytes: 70
+    line: 2
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: s
+- start_position:
+    bytes: 70
+    line: 2
+    character: 12
+  end_position:
+    bytes: 71
+    line: 2
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 71
+    line: 2
+    character: 13
+  end_position:
+    bytes: 73
+    line: 2
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: in
+- start_position:
+    bytes: 73
+    line: 2
+    character: 15
+  end_position:
+    bytes: 74
+    line: 2
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 74
+    line: 2
+    character: 16
+  end_position:
+    bytes: 75
+    line: 2
+    character: 17
+  token_type:
+    type: Identifier
+    identifier: l
+- start_position:
+    bytes: 75
+    line: 2
+    character: 17
+  end_position:
+    bytes: 76
+    line: 2
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 76
+    line: 2
+    character: 18
+  end_position:
+    bytes: 78
+    line: 2
+    character: 20
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 78
+    line: 2
+    character: 20
+  end_position:
+    bytes: 79
+    line: 2
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 79
+    line: 3
+    character: 1
+  end_position:
+    bytes: 87
+    line: 3
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "        "
+- start_position:
+    bytes: 87
+    line: 3
+    character: 9
+  end_position:
+    bytes: 89
+    line: 3
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: if
+- start_position:
+    bytes: 89
+    line: 3
+    character: 11
+  end_position:
+    bytes: 90
+    line: 3
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 90
+    line: 3
+    character: 12
+  end_position:
+    bytes: 91
+    line: 3
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: (
+- start_position:
+    bytes: 91
+    line: 3
+    character: 13
+  end_position:
+    bytes: 92
+    line: 3
+    character: 14
+  token_type:
+    type: Identifier
+    identifier: i
+- start_position:
+    bytes: 92
+    line: 3
+    character: 14
+  end_position:
+    bytes: 93
+    line: 3
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 93
+    line: 3
+    character: 15
+  end_position:
+    bytes: 94
+    line: 3
+    character: 16
+  token_type:
+    type: Symbol
+    symbol: "%"
+- start_position:
+    bytes: 94
+    line: 3
+    character: 16
+  end_position:
+    bytes: 95
+    line: 3
+    character: 17
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 95
+    line: 3
+    character: 17
+  end_position:
+    bytes: 100
+    line: 3
+    character: 22
+  token_type:
+    type: Identifier
+    identifier: every
+- start_position:
+    bytes: 100
+    line: 3
+    character: 22
+  end_position:
+    bytes: 101
+    line: 3
+    character: 23
+  token_type:
+    type: Symbol
+    symbol: )
+- start_position:
+    bytes: 101
+    line: 3
+    character: 23
+  end_position:
+    bytes: 102
+    line: 3
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 102
+    line: 3
+    character: 24
+  end_position:
+    bytes: 104
+    line: 3
+    character: 26
+  token_type:
+    type: Symbol
+    symbol: "=="
+- start_position:
+    bytes: 104
+    line: 3
+    character: 26
+  end_position:
+    bytes: 105
+    line: 3
+    character: 27
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 105
+    line: 3
+    character: 27
+  end_position:
+    bytes: 109
+    line: 3
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: disp
+- start_position:
+    bytes: 109
+    line: 3
+    character: 31
+  end_position:
+    bytes: 110
+    line: 3
+    character: 32
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 110
+    line: 3
+    character: 32
+  end_position:
+    bytes: 114
+    line: 3
+    character: 36
+  token_type:
+    type: Symbol
+    symbol: then
+- start_position:
+    bytes: 114
+    line: 3
+    character: 36
+  end_position:
+    bytes: 115
+    line: 3
+    character: 36
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 115
+    line: 4
+    character: 1
+  end_position:
+    bytes: 127
+    line: 4
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: "            "
+- start_position:
+    bytes: 127
+    line: 4
+    character: 13
+  end_position:
+    bytes: 132
+    line: 4
+    character: 18
+  token_type:
+    type: Symbol
+    symbol: yield
+- start_position:
+    bytes: 132
+    line: 4
+    character: 18
+  end_position:
+    bytes: 133
+    line: 4
+    character: 19
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 133
+    line: 4
+    character: 19
+  end_position:
+    bytes: 134
+    line: 4
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: s
+- start_position:
+    bytes: 134
+    line: 4
+    character: 20
+  end_position:
+    bytes: 135
+    line: 4
+    character: 20
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 135
+    line: 5
+    character: 1
+  end_position:
+    bytes: 143
+    line: 5
+    character: 9
+  token_type:
+    type: Whitespace
+    characters: "        "
+- start_position:
+    bytes: 143
+    line: 5
+    character: 9
+  end_position:
+    bytes: 146
+    line: 5
+    character: 12
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 146
+    line: 5
+    character: 12
+  end_position:
+    bytes: 147
+    line: 5
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 147
+    line: 6
+    character: 1
+  end_position:
+    bytes: 151
+    line: 6
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 151
+    line: 6
+    character: 5
+  end_position:
+    bytes: 154
+    line: 6
+    character: 8
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 154
+    line: 6
+    character: 8
+  end_position:
+    bytes: 155
+    line: 6
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 155
+    line: 7
+    character: 1
+  end_position:
+    bytes: 158
+    line: 7
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 158
+    line: 7
+    character: 4
+  end_position:
+    bytes: 159
+    line: 7
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 159
+    line: 8
+    character: 1
+  end_position:
+    bytes: 159
+    line: 8
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/ast.snap
new file mode 100644
index 00000000..98250ff9
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/ast.snap
@@ -0,0 +1,1245 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/main_busy
+---
+stmts:
+  - - Main:
+        main_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Symbol
+              symbol: main
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        initial_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: StringLiteral
+              literal: init
+              quote_type: Double
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        begin_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 1
+              character: 13
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        assignements:
+          - variable:
+              leading_trivia:
+                - start_position:
+                    bytes: 15
+                    line: 2
+                    character: 1
+                  end_position:
+                    bytes: 19
+                    line: 2
+                    character: 5
+                  token_type:
+                    type: Whitespace
+                    characters: "    "
+              token:
+                start_position:
+                  bytes: 19
+                  line: 2
+                  character: 5
+                end_position:
+                  bytes: 27
+                  line: 2
+                  character: 13
+                token_type:
+                  type: StringLiteral
+                  literal: before
+                  quote_type: Double
+              trailing_trivia:
+                - start_position:
+                    bytes: 27
+                    line: 2
+                    character: 13
+                  end_position:
+                    bytes: 30
+                    line: 2
+                    character: 16
+                  token_type:
+                    type: Whitespace
+                    characters: "   "
+            assign_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 30
+                  line: 2
+                  character: 16
+                end_position:
+                  bytes: 31
+                  line: 2
+                  character: 17
+                token_type:
+                  type: Symbol
+                  symbol: "="
+              trailing_trivia:
+                - start_position:
+                    bytes: 31
+                    line: 2
+                    character: 17
+                  end_position:
+                    bytes: 32
+                    line: 2
+                    character: 18
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            module_name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 32
+                  line: 2
+                  character: 18
+                end_position:
+                  bytes: 38
+                  line: 2
+                  character: 24
+                token_type:
+                  type: Identifier
+                  identifier: retime
+              trailing_trivia: []
+            dot_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 38
+                  line: 2
+                  character: 24
+                end_position:
+                  bytes: 39
+                  line: 2
+                  character: 25
+                token_type:
+                  type: Symbol
+                  symbol: "."
+              trailing_trivia: []
+            job_name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 39
+                  line: 2
+                  character: 25
+                end_position:
+                  bytes: 44
+                  line: 2
+                  character: 30
+                token_type:
+                  type: Identifier
+                  identifier: start
+              trailing_trivia:
+                - start_position:
+                    bytes: 44
+                    line: 2
+                    character: 30
+                  end_position:
+                    bytes: 47
+                    line: 2
+                    character: 33
+                  token_type:
+                    type: Whitespace
+                    characters: "   "
+            call_list:
+              begin_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 47
+                    line: 2
+                    character: 33
+                  end_position:
+                    bytes: 48
+                    line: 2
+                    character: 34
+                  token_type:
+                    type: Symbol
+                    symbol: "{"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 48
+                      line: 2
+                      character: 34
+                    end_position:
+                      bytes: 49
+                      line: 2
+                      character: 35
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              items:
+                pairs:
+                  - End:
+                      Variable:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 49
+                            line: 2
+                            character: 35
+                          end_position:
+                            bytes: 55
+                            line: 2
+                            character: 41
+                          token_type:
+                            type: StringLiteral
+                            literal: init
+                            quote_type: Double
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 55
+                              line: 2
+                              character: 41
+                            end_position:
+                              bytes: 56
+                              line: 2
+                              character: 42
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+              end_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 56
+                    line: 2
+                    character: 42
+                  end_position:
+                    bytes: 57
+                    line: 2
+                    character: 43
+                  token_type:
+                    type: Symbol
+                    symbol: "}"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 57
+                      line: 2
+                      character: 43
+                    end_position:
+                      bytes: 58
+                      line: 2
+                      character: 43
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          - variable:
+              leading_trivia:
+                - start_position:
+                    bytes: 58
+                    line: 3
+                    character: 1
+                  end_position:
+                    bytes: 62
+                    line: 3
+                    character: 5
+                  token_type:
+                    type: Whitespace
+                    characters: "    "
+              token:
+                start_position:
+                  bytes: 62
+                  line: 3
+                  character: 5
+                end_position:
+                  bytes: 69
+                  line: 3
+                  character: 12
+                token_type:
+                  type: StringLiteral
+                  literal: after
+                  quote_type: Double
+              trailing_trivia:
+                - start_position:
+                    bytes: 69
+                    line: 3
+                    character: 12
+                  end_position:
+                    bytes: 73
+                    line: 3
+                    character: 16
+                  token_type:
+                    type: Whitespace
+                    characters: "    "
+            assign_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 73
+                  line: 3
+                  character: 16
+                end_position:
+                  bytes: 74
+                  line: 3
+                  character: 17
+                token_type:
+                  type: Symbol
+                  symbol: "="
+              trailing_trivia:
+                - start_position:
+                    bytes: 74
+                    line: 3
+                    character: 17
+                  end_position:
+                    bytes: 75
+                    line: 3
+                    character: 18
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            module_name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 75
+                  line: 3
+                  character: 18
+                end_position:
+                  bytes: 81
+                  line: 3
+                  character: 24
+                token_type:
+                  type: Identifier
+                  identifier: retime
+              trailing_trivia: []
+            dot_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 81
+                  line: 3
+                  character: 24
+                end_position:
+                  bytes: 82
+                  line: 3
+                  character: 25
+                token_type:
+                  type: Symbol
+                  symbol: "."
+              trailing_trivia: []
+            job_name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 82
+                  line: 3
+                  character: 25
+                end_position:
+                  bytes: 88
+                  line: 3
+                  character: 31
+                token_type:
+                  type: Identifier
+                  identifier: finish
+              trailing_trivia:
+                - start_position:
+                    bytes: 88
+                    line: 3
+                    character: 31
+                  end_position:
+                    bytes: 90
+                    line: 3
+                    character: 33
+                  token_type:
+                    type: Whitespace
+                    characters: "  "
+            call_list:
+              begin_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 90
+                    line: 3
+                    character: 33
+                  end_position:
+                    bytes: 91
+                    line: 3
+                    character: 34
+                  token_type:
+                    type: Symbol
+                    symbol: "{"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 91
+                      line: 3
+                      character: 34
+                    end_position:
+                      bytes: 92
+                      line: 3
+                      character: 35
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              items:
+                pairs:
+                  - End:
+                      Variable:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 92
+                            line: 3
+                            character: 35
+                          end_position:
+                            bytes: 98
+                            line: 3
+                            character: 41
+                          token_type:
+                            type: StringLiteral
+                            literal: init
+                            quote_type: Double
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 98
+                              line: 3
+                              character: 41
+                            end_position:
+                              bytes: 99
+                              line: 3
+                              character: 42
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+              end_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 99
+                    line: 3
+                    character: 42
+                  end_position:
+                    bytes: 100
+                    line: 3
+                    character: 43
+                  token_type:
+                    type: Symbol
+                    symbol: "}"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 100
+                      line: 3
+                      character: 43
+                    end_position:
+                      bytes: 101
+                      line: 3
+                      character: 43
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          - variable:
+              leading_trivia:
+                - start_position:
+                    bytes: 101
+                    line: 4
+                    character: 1
+                  end_position:
+                    bytes: 105
+                    line: 4
+                    character: 5
+                  token_type:
+                    type: Whitespace
+                    characters: "    "
+              token:
+                start_position:
+                  bytes: 105
+                  line: 4
+                  character: 5
+                end_position:
+                  bytes: 115
+                  line: 4
+                  character: 15
+                token_type:
+                  type: StringLiteral
+                  literal: outlined
+                  quote_type: Double
+              trailing_trivia:
+                - start_position:
+                    bytes: 115
+                    line: 4
+                    character: 15
+                  end_position:
+                    bytes: 116
+                    line: 4
+                    character: 16
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            assign_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 116
+                  line: 4
+                  character: 16
+                end_position:
+                  bytes: 117
+                  line: 4
+                  character: 17
+                token_type:
+                  type: Symbol
+                  symbol: "="
+              trailing_trivia:
+                - start_position:
+                    bytes: 117
+                    line: 4
+                    character: 17
+                  end_position:
+                    bytes: 118
+                    line: 4
+                    character: 18
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            module_name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 118
+                  line: 4
+                  character: 18
+                end_position:
+                  bytes: 123
+                  line: 4
+                  character: 23
+                token_type:
+                  type: Identifier
+                  identifier: utils
+              trailing_trivia: []
+            dot_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 123
+                  line: 4
+                  character: 23
+                end_position:
+                  bytes: 124
+                  line: 4
+                  character: 24
+                token_type:
+                  type: Symbol
+                  symbol: "."
+              trailing_trivia: []
+            job_name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 124
+                  line: 4
+                  character: 24
+                end_position:
+                  bytes: 131
+                  line: 4
+                  character: 31
+                token_type:
+                  type: Identifier
+                  identifier: outline
+              trailing_trivia:
+                - start_position:
+                    bytes: 131
+                    line: 4
+                    character: 31
+                  end_position:
+                    bytes: 133
+                    line: 4
+                    character: 33
+                  token_type:
+                    type: Whitespace
+                    characters: "  "
+            call_list:
+              begin_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 133
+                    line: 4
+                    character: 33
+                  end_position:
+                    bytes: 134
+                    line: 4
+                    character: 34
+                  token_type:
+                    type: Symbol
+                    symbol: "{"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 134
+                      line: 4
+                      character: 34
+                    end_position:
+                      bytes: 135
+                      line: 4
+                      character: 35
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              items:
+                pairs:
+                  - Punctuated:
+                      - Variable:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 135
+                              line: 4
+                              character: 35
+                            end_position:
+                              bytes: 143
+                              line: 4
+                              character: 43
+                            token_type:
+                              type: StringLiteral
+                              literal: before
+                              quote_type: Double
+                          trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 143
+                            line: 4
+                            character: 43
+                          end_position:
+                            bytes: 144
+                            line: 4
+                            character: 44
+                          token_type:
+                            type: Symbol
+                            symbol: ","
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 144
+                              line: 4
+                              character: 44
+                            end_position:
+                              bytes: 145
+                              line: 4
+                              character: 45
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  - Punctuated:
+                      - Variable:
+                          leading_trivia: []
+                          token:
+                            start_position:
+                              bytes: 145
+                              line: 4
+                              character: 45
+                            end_position:
+                              bytes: 151
+                              line: 4
+                              character: 51
+                            token_type:
+                              type: StringLiteral
+                              literal: init
+                              quote_type: Double
+                          trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 151
+                            line: 4
+                            character: 51
+                          end_position:
+                            bytes: 152
+                            line: 4
+                            character: 52
+                          token_type:
+                            type: Symbol
+                            symbol: ","
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 152
+                              line: 4
+                              character: 52
+                            end_position:
+                              bytes: 153
+                              line: 4
+                              character: 53
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  - End:
+                      Variable:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 153
+                            line: 4
+                            character: 53
+                          end_position:
+                            bytes: 160
+                            line: 4
+                            character: 60
+                          token_type:
+                            type: StringLiteral
+                            literal: after
+                            quote_type: Double
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 160
+                              line: 4
+                              character: 60
+                            end_position:
+                              bytes: 161
+                              line: 4
+                              character: 61
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+              end_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 161
+                    line: 4
+                    character: 61
+                  end_position:
+                    bytes: 162
+                    line: 4
+                    character: 62
+                  token_type:
+                    type: Symbol
+                    symbol: "}"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 162
+                      line: 4
+                      character: 62
+                    end_position:
+                      bytes: 163
+                      line: 4
+                      character: 62
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+          - variable:
+              leading_trivia:
+                - start_position:
+                    bytes: 163
+                    line: 5
+                    character: 1
+                  end_position:
+                    bytes: 164
+                    line: 5
+                    character: 1
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+                - start_position:
+                    bytes: 164
+                    line: 6
+                    character: 1
+                  end_position:
+                    bytes: 168
+                    line: 6
+                    character: 5
+                  token_type:
+                    type: Whitespace
+                    characters: "    "
+                - start_position:
+                    bytes: 168
+                    line: 6
+                    character: 5
+                  end_position:
+                    bytes: 198
+                    line: 6
+                    character: 35
+                  token_type:
+                    type: SingleLineComment
+                    comment: " Here we tag some objects..."
+                - start_position:
+                    bytes: 198
+                    line: 6
+                    character: 35
+                  end_position:
+                    bytes: 199
+                    line: 6
+                    character: 35
+                  token_type:
+                    type: Whitespace
+                    characters: "\n"
+                - start_position:
+                    bytes: 199
+                    line: 7
+                    character: 1
+                  end_position:
+                    bytes: 203
+                    line: 7
+                    character: 5
+                  token_type:
+                    type: Whitespace
+                    characters: "    "
+              token:
+                start_position:
+                  bytes: 203
+                  line: 7
+                  character: 5
+                end_position:
+                  bytes: 211
+                  line: 7
+                  character: 13
+                token_type:
+                  type: StringLiteral
+                  literal: tagged
+                  quote_type: Double
+              trailing_trivia:
+                - start_position:
+                    bytes: 211
+                    line: 7
+                    character: 13
+                  end_position:
+                    bytes: 214
+                    line: 7
+                    character: 16
+                  token_type:
+                    type: Whitespace
+                    characters: "   "
+            assign_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 214
+                  line: 7
+                  character: 16
+                end_position:
+                  bytes: 215
+                  line: 7
+                  character: 17
+                token_type:
+                  type: Symbol
+                  symbol: "="
+              trailing_trivia:
+                - start_position:
+                    bytes: 215
+                    line: 7
+                    character: 17
+                  end_position:
+                    bytes: 216
+                    line: 7
+                    character: 18
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            module_name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 216
+                  line: 7
+                  character: 18
+                end_position:
+                  bytes: 219
+                  line: 7
+                  character: 21
+                token_type:
+                  type: Identifier
+                  identifier: tag
+              trailing_trivia: []
+            dot_token:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 219
+                  line: 7
+                  character: 21
+                end_position:
+                  bytes: 220
+                  line: 7
+                  character: 22
+                token_type:
+                  type: Symbol
+                  symbol: "."
+              trailing_trivia: []
+            job_name:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 220
+                  line: 7
+                  character: 22
+                end_position:
+                  bytes: 230
+                  line: 7
+                  character: 32
+                token_type:
+                  type: Identifier
+                  identifier: syl_modulo
+              trailing_trivia:
+                - start_position:
+                    bytes: 230
+                    line: 7
+                    character: 32
+                  end_position:
+                    bytes: 231
+                    line: 7
+                    character: 33
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            call_list:
+              begin_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 231
+                    line: 7
+                    character: 33
+                  end_position:
+                    bytes: 232
+                    line: 7
+                    character: 34
+                  token_type:
+                    type: Symbol
+                    symbol: "{"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 232
+                      line: 7
+                      character: 34
+                    end_position:
+                      bytes: 233
+                      line: 7
+                      character: 35
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+              items:
+                pairs:
+                  - Punctuated:
+                      - SetParameter:
+                          parameter:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 233
+                                line: 7
+                                character: 35
+                              end_position:
+                                bytes: 238
+                                line: 7
+                                character: 40
+                              token_type:
+                                type: Identifier
+                                identifier: every
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 238
+                                  line: 7
+                                  character: 40
+                                end_position:
+                                  bytes: 239
+                                  line: 7
+                                  character: 41
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          equal_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 239
+                                line: 7
+                                character: 41
+                              end_position:
+                                bytes: 240
+                                line: 7
+                                character: 42
+                              token_type:
+                                type: Symbol
+                                symbol: "="
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 240
+                                  line: 7
+                                  character: 42
+                                end_position:
+                                  bytes: 241
+                                  line: 7
+                                  character: 43
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          expression:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 241
+                                  line: 7
+                                  character: 43
+                                end_position:
+                                  bytes: 242
+                                  line: 7
+                                  character: 44
+                                token_type:
+                                  type: Number
+                                  text: "3"
+                              trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 242
+                            line: 7
+                            character: 44
+                          end_position:
+                            bytes: 243
+                            line: 7
+                            character: 45
+                          token_type:
+                            type: Symbol
+                            symbol: ","
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 243
+                              line: 7
+                              character: 45
+                            end_position:
+                              bytes: 244
+                              line: 7
+                              character: 46
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  - Punctuated:
+                      - SetParameter:
+                          parameter:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 244
+                                line: 7
+                                character: 46
+                              end_position:
+                                bytes: 248
+                                line: 7
+                                character: 50
+                              token_type:
+                                type: Identifier
+                                identifier: disp
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 248
+                                  line: 7
+                                  character: 50
+                                end_position:
+                                  bytes: 249
+                                  line: 7
+                                  character: 51
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          equal_token:
+                            leading_trivia: []
+                            token:
+                              start_position:
+                                bytes: 249
+                                line: 7
+                                character: 51
+                              end_position:
+                                bytes: 250
+                                line: 7
+                                character: 52
+                              token_type:
+                                type: Symbol
+                                symbol: "="
+                            trailing_trivia:
+                              - start_position:
+                                  bytes: 250
+                                  line: 7
+                                  character: 52
+                                end_position:
+                                  bytes: 251
+                                  line: 7
+                                  character: 53
+                                token_type:
+                                  type: Whitespace
+                                  characters: " "
+                          expression:
+                            Number:
+                              leading_trivia: []
+                              token:
+                                start_position:
+                                  bytes: 251
+                                  line: 7
+                                  character: 53
+                                end_position:
+                                  bytes: 252
+                                  line: 7
+                                  character: 54
+                                token_type:
+                                  type: Number
+                                  text: "1"
+                              trailing_trivia: []
+                      - leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 252
+                            line: 7
+                            character: 54
+                          end_position:
+                            bytes: 253
+                            line: 7
+                            character: 55
+                          token_type:
+                            type: Symbol
+                            symbol: ","
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 253
+                              line: 7
+                              character: 55
+                            end_position:
+                              bytes: 254
+                              line: 7
+                              character: 56
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+                  - End:
+                      Variable:
+                        leading_trivia: []
+                        token:
+                          start_position:
+                            bytes: 254
+                            line: 7
+                            character: 56
+                          end_position:
+                            bytes: 264
+                            line: 7
+                            character: 66
+                          token_type:
+                            type: StringLiteral
+                            literal: outlined
+                            quote_type: Double
+                        trailing_trivia:
+                          - start_position:
+                              bytes: 264
+                              line: 7
+                              character: 66
+                            end_position:
+                              bytes: 265
+                              line: 7
+                              character: 67
+                            token_type:
+                              type: Whitespace
+                              characters: " "
+              end_token:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 265
+                    line: 7
+                    character: 67
+                  end_position:
+                    bytes: 266
+                    line: 7
+                    character: 68
+                  token_type:
+                    type: Symbol
+                    symbol: "}"
+                trailing_trivia:
+                  - start_position:
+                      bytes: 266
+                      line: 7
+                      character: 68
+                    end_position:
+                      bytes: 267
+                      line: 7
+                      character: 68
+                    token_type:
+                      type: Whitespace
+                      characters: "\n"
+        write_stmt: ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 267
+              line: 8
+              character: 1
+            end_position:
+              bytes: 270
+              line: 8
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 270
+                line: 8
+                character: 4
+              end_position:
+                bytes: 271
+                line: 8
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/source.lua
new file mode 100644
index 00000000..94cd169d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/source.lua
@@ -0,0 +1,8 @@
+main "init" do
+    "before"   = retime.start   { "init" }
+    "after"    = retime.finish  { "init" }
+    "outlined" = utils.outline  { "before", "init", "after" }
+
+    -- Here we tag some objects...
+    "tagged"   = tag.syl_modulo { every = 3, disp = 1, "outlined" }
+end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/tokens.snap
new file mode 100644
index 00000000..032339db
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_busy/tokens.snap
@@ -0,0 +1,1038 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/pass/main_busy
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: main
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 19
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 5
+  end_position:
+    bytes: 27
+    line: 2
+    character: 13
+  token_type:
+    type: StringLiteral
+    literal: before
+    quote_type: Double
+- start_position:
+    bytes: 27
+    line: 2
+    character: 13
+  end_position:
+    bytes: 30
+    line: 2
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "   "
+- start_position:
+    bytes: 30
+    line: 2
+    character: 16
+  end_position:
+    bytes: 31
+    line: 2
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 31
+    line: 2
+    character: 17
+  end_position:
+    bytes: 32
+    line: 2
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 32
+    line: 2
+    character: 18
+  end_position:
+    bytes: 38
+    line: 2
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: retime
+- start_position:
+    bytes: 38
+    line: 2
+    character: 24
+  end_position:
+    bytes: 39
+    line: 2
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 39
+    line: 2
+    character: 25
+  end_position:
+    bytes: 44
+    line: 2
+    character: 30
+  token_type:
+    type: Identifier
+    identifier: start
+- start_position:
+    bytes: 44
+    line: 2
+    character: 30
+  end_position:
+    bytes: 47
+    line: 2
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: "   "
+- start_position:
+    bytes: 47
+    line: 2
+    character: 33
+  end_position:
+    bytes: 48
+    line: 2
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 48
+    line: 2
+    character: 34
+  end_position:
+    bytes: 49
+    line: 2
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 49
+    line: 2
+    character: 35
+  end_position:
+    bytes: 55
+    line: 2
+    character: 41
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 55
+    line: 2
+    character: 41
+  end_position:
+    bytes: 56
+    line: 2
+    character: 42
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 56
+    line: 2
+    character: 42
+  end_position:
+    bytes: 57
+    line: 2
+    character: 43
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 57
+    line: 2
+    character: 43
+  end_position:
+    bytes: 58
+    line: 2
+    character: 43
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 58
+    line: 3
+    character: 1
+  end_position:
+    bytes: 62
+    line: 3
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 62
+    line: 3
+    character: 5
+  end_position:
+    bytes: 69
+    line: 3
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: after
+    quote_type: Double
+- start_position:
+    bytes: 69
+    line: 3
+    character: 12
+  end_position:
+    bytes: 73
+    line: 3
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 73
+    line: 3
+    character: 16
+  end_position:
+    bytes: 74
+    line: 3
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 74
+    line: 3
+    character: 17
+  end_position:
+    bytes: 75
+    line: 3
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 75
+    line: 3
+    character: 18
+  end_position:
+    bytes: 81
+    line: 3
+    character: 24
+  token_type:
+    type: Identifier
+    identifier: retime
+- start_position:
+    bytes: 81
+    line: 3
+    character: 24
+  end_position:
+    bytes: 82
+    line: 3
+    character: 25
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 82
+    line: 3
+    character: 25
+  end_position:
+    bytes: 88
+    line: 3
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: finish
+- start_position:
+    bytes: 88
+    line: 3
+    character: 31
+  end_position:
+    bytes: 90
+    line: 3
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: "  "
+- start_position:
+    bytes: 90
+    line: 3
+    character: 33
+  end_position:
+    bytes: 91
+    line: 3
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 91
+    line: 3
+    character: 34
+  end_position:
+    bytes: 92
+    line: 3
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 92
+    line: 3
+    character: 35
+  end_position:
+    bytes: 98
+    line: 3
+    character: 41
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 98
+    line: 3
+    character: 41
+  end_position:
+    bytes: 99
+    line: 3
+    character: 42
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 99
+    line: 3
+    character: 42
+  end_position:
+    bytes: 100
+    line: 3
+    character: 43
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 100
+    line: 3
+    character: 43
+  end_position:
+    bytes: 101
+    line: 3
+    character: 43
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 101
+    line: 4
+    character: 1
+  end_position:
+    bytes: 105
+    line: 4
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 105
+    line: 4
+    character: 5
+  end_position:
+    bytes: 115
+    line: 4
+    character: 15
+  token_type:
+    type: StringLiteral
+    literal: outlined
+    quote_type: Double
+- start_position:
+    bytes: 115
+    line: 4
+    character: 15
+  end_position:
+    bytes: 116
+    line: 4
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 116
+    line: 4
+    character: 16
+  end_position:
+    bytes: 117
+    line: 4
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 117
+    line: 4
+    character: 17
+  end_position:
+    bytes: 118
+    line: 4
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 118
+    line: 4
+    character: 18
+  end_position:
+    bytes: 123
+    line: 4
+    character: 23
+  token_type:
+    type: Identifier
+    identifier: utils
+- start_position:
+    bytes: 123
+    line: 4
+    character: 23
+  end_position:
+    bytes: 124
+    line: 4
+    character: 24
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 124
+    line: 4
+    character: 24
+  end_position:
+    bytes: 131
+    line: 4
+    character: 31
+  token_type:
+    type: Identifier
+    identifier: outline
+- start_position:
+    bytes: 131
+    line: 4
+    character: 31
+  end_position:
+    bytes: 133
+    line: 4
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: "  "
+- start_position:
+    bytes: 133
+    line: 4
+    character: 33
+  end_position:
+    bytes: 134
+    line: 4
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 134
+    line: 4
+    character: 34
+  end_position:
+    bytes: 135
+    line: 4
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 135
+    line: 4
+    character: 35
+  end_position:
+    bytes: 143
+    line: 4
+    character: 43
+  token_type:
+    type: StringLiteral
+    literal: before
+    quote_type: Double
+- start_position:
+    bytes: 143
+    line: 4
+    character: 43
+  end_position:
+    bytes: 144
+    line: 4
+    character: 44
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 144
+    line: 4
+    character: 44
+  end_position:
+    bytes: 145
+    line: 4
+    character: 45
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 145
+    line: 4
+    character: 45
+  end_position:
+    bytes: 151
+    line: 4
+    character: 51
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 151
+    line: 4
+    character: 51
+  end_position:
+    bytes: 152
+    line: 4
+    character: 52
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 152
+    line: 4
+    character: 52
+  end_position:
+    bytes: 153
+    line: 4
+    character: 53
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 153
+    line: 4
+    character: 53
+  end_position:
+    bytes: 160
+    line: 4
+    character: 60
+  token_type:
+    type: StringLiteral
+    literal: after
+    quote_type: Double
+- start_position:
+    bytes: 160
+    line: 4
+    character: 60
+  end_position:
+    bytes: 161
+    line: 4
+    character: 61
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 161
+    line: 4
+    character: 61
+  end_position:
+    bytes: 162
+    line: 4
+    character: 62
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 162
+    line: 4
+    character: 62
+  end_position:
+    bytes: 163
+    line: 4
+    character: 62
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 163
+    line: 5
+    character: 1
+  end_position:
+    bytes: 164
+    line: 5
+    character: 1
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 164
+    line: 6
+    character: 1
+  end_position:
+    bytes: 168
+    line: 6
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 168
+    line: 6
+    character: 5
+  end_position:
+    bytes: 198
+    line: 6
+    character: 35
+  token_type:
+    type: SingleLineComment
+    comment: " Here we tag some objects..."
+- start_position:
+    bytes: 198
+    line: 6
+    character: 35
+  end_position:
+    bytes: 199
+    line: 6
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 199
+    line: 7
+    character: 1
+  end_position:
+    bytes: 203
+    line: 7
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 203
+    line: 7
+    character: 5
+  end_position:
+    bytes: 211
+    line: 7
+    character: 13
+  token_type:
+    type: StringLiteral
+    literal: tagged
+    quote_type: Double
+- start_position:
+    bytes: 211
+    line: 7
+    character: 13
+  end_position:
+    bytes: 214
+    line: 7
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "   "
+- start_position:
+    bytes: 214
+    line: 7
+    character: 16
+  end_position:
+    bytes: 215
+    line: 7
+    character: 17
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 215
+    line: 7
+    character: 17
+  end_position:
+    bytes: 216
+    line: 7
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 216
+    line: 7
+    character: 18
+  end_position:
+    bytes: 219
+    line: 7
+    character: 21
+  token_type:
+    type: Identifier
+    identifier: tag
+- start_position:
+    bytes: 219
+    line: 7
+    character: 21
+  end_position:
+    bytes: 220
+    line: 7
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: "."
+- start_position:
+    bytes: 220
+    line: 7
+    character: 22
+  end_position:
+    bytes: 230
+    line: 7
+    character: 32
+  token_type:
+    type: Identifier
+    identifier: syl_modulo
+- start_position:
+    bytes: 230
+    line: 7
+    character: 32
+  end_position:
+    bytes: 231
+    line: 7
+    character: 33
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 231
+    line: 7
+    character: 33
+  end_position:
+    bytes: 232
+    line: 7
+    character: 34
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 232
+    line: 7
+    character: 34
+  end_position:
+    bytes: 233
+    line: 7
+    character: 35
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 233
+    line: 7
+    character: 35
+  end_position:
+    bytes: 238
+    line: 7
+    character: 40
+  token_type:
+    type: Identifier
+    identifier: every
+- start_position:
+    bytes: 238
+    line: 7
+    character: 40
+  end_position:
+    bytes: 239
+    line: 7
+    character: 41
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 239
+    line: 7
+    character: 41
+  end_position:
+    bytes: 240
+    line: 7
+    character: 42
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 240
+    line: 7
+    character: 42
+  end_position:
+    bytes: 241
+    line: 7
+    character: 43
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 241
+    line: 7
+    character: 43
+  end_position:
+    bytes: 242
+    line: 7
+    character: 44
+  token_type:
+    type: Number
+    text: "3"
+- start_position:
+    bytes: 242
+    line: 7
+    character: 44
+  end_position:
+    bytes: 243
+    line: 7
+    character: 45
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 243
+    line: 7
+    character: 45
+  end_position:
+    bytes: 244
+    line: 7
+    character: 46
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 244
+    line: 7
+    character: 46
+  end_position:
+    bytes: 248
+    line: 7
+    character: 50
+  token_type:
+    type: Identifier
+    identifier: disp
+- start_position:
+    bytes: 248
+    line: 7
+    character: 50
+  end_position:
+    bytes: 249
+    line: 7
+    character: 51
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 249
+    line: 7
+    character: 51
+  end_position:
+    bytes: 250
+    line: 7
+    character: 52
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 250
+    line: 7
+    character: 52
+  end_position:
+    bytes: 251
+    line: 7
+    character: 53
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 251
+    line: 7
+    character: 53
+  end_position:
+    bytes: 252
+    line: 7
+    character: 54
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 252
+    line: 7
+    character: 54
+  end_position:
+    bytes: 253
+    line: 7
+    character: 55
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 253
+    line: 7
+    character: 55
+  end_position:
+    bytes: 254
+    line: 7
+    character: 56
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 254
+    line: 7
+    character: 56
+  end_position:
+    bytes: 264
+    line: 7
+    character: 66
+  token_type:
+    type: StringLiteral
+    literal: outlined
+    quote_type: Double
+- start_position:
+    bytes: 264
+    line: 7
+    character: 66
+  end_position:
+    bytes: 265
+    line: 7
+    character: 67
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 265
+    line: 7
+    character: 67
+  end_position:
+    bytes: 266
+    line: 7
+    character: 68
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 266
+    line: 7
+    character: 68
+  end_position:
+    bytes: 267
+    line: 7
+    character: 68
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 267
+    line: 8
+    character: 1
+  end_position:
+    bytes: 270
+    line: 8
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 270
+    line: 8
+    character: 4
+  end_position:
+    bytes: 271
+    line: 8
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 271
+    line: 9
+    character: 1
+  end_position:
+    bytes: 271
+    line: 9
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/ast.snap
new file mode 100644
index 00000000..8ad1f4c8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/ast.snap
@@ -0,0 +1,115 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/main_empty
+---
+stmts:
+  - - Main:
+        main_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Symbol
+              symbol: main
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        initial_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: StringLiteral
+              literal: init
+              quote_type: Double
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        begin_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 1
+              character: 13
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        assignements: []
+        write_stmt: ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 15
+              line: 2
+              character: 1
+            end_position:
+              bytes: 18
+              line: 2
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 18
+                line: 2
+                character: 4
+              end_position:
+                bytes: 19
+                line: 2
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/source.lua
new file mode 100644
index 00000000..8701206c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/source.lua
@@ -0,0 +1,2 @@
+main "init" do
+end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/tokens.snap
new file mode 100644
index 00000000..e5d60f28
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_empty/tokens.snap
@@ -0,0 +1,104 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/pass/main_empty
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: main
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 18
+    line: 2
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 18
+    line: 2
+    character: 4
+  end_position:
+    bytes: 19
+    line: 2
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 19
+    line: 3
+    character: 1
+  end_position:
+    bytes: 19
+    line: 3
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/ast.snap
new file mode 100644
index 00000000..064c435c
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/ast.snap
@@ -0,0 +1,183 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/main_returns
+---
+stmts:
+  - - Main:
+        main_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Symbol
+              symbol: main
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        initial_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: StringLiteral
+              literal: init
+              quote_type: Double
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        begin_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 1
+              character: 13
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        assignements: []
+        write_stmt:
+          write_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 15
+                  line: 2
+                  character: 1
+                end_position:
+                  bytes: 19
+                  line: 2
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: "    "
+            token:
+              start_position:
+                bytes: 19
+                line: 2
+                character: 5
+              end_position:
+                bytes: 25
+                line: 2
+                character: 11
+              token_type:
+                type: Symbol
+                symbol: return
+            trailing_trivia:
+              - start_position:
+                  bytes: 25
+                  line: 2
+                  character: 11
+                end_position:
+                  bytes: 26
+                  line: 2
+                  character: 12
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          begin_token: ~
+          variable_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 26
+                      line: 2
+                      character: 12
+                    end_position:
+                      bytes: 32
+                      line: 2
+                      character: 18
+                    token_type:
+                      type: StringLiteral
+                      literal: init
+                      quote_type: Double
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 32
+                        line: 2
+                        character: 18
+                      end_position:
+                        bytes: 33
+                        line: 2
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+          end_token: ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 33
+              line: 3
+              character: 1
+            end_position:
+              bytes: 36
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 36
+                line: 3
+                character: 4
+              end_position:
+                bytes: 37
+                line: 3
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/source.lua
new file mode 100644
index 00000000..75ac778d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/source.lua
@@ -0,0 +1,3 @@
+main "init" do
+    return "init"
+end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/tokens.snap
new file mode 100644
index 00000000..57984b66
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/main_returns/tokens.snap
@@ -0,0 +1,160 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/pass/main_returns
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: main
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 19
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 5
+  end_position:
+    bytes: 25
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 25
+    line: 2
+    character: 11
+  end_position:
+    bytes: 26
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 2
+    character: 12
+  end_position:
+    bytes: 32
+    line: 2
+    character: 18
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 32
+    line: 2
+    character: 18
+  end_position:
+    bytes: 33
+    line: 2
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 33
+    line: 3
+    character: 1
+  end_position:
+    bytes: 36
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 36
+    line: 3
+    character: 4
+  end_position:
+    bytes: 37
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 37
+    line: 4
+    character: 1
+  end_position:
+    bytes: 37
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/ast.snap
new file mode 100644
index 00000000..885a4e55
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/ast.snap
@@ -0,0 +1,160 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/option_decl_1
+---
+stmts:
+  - - OptionDecl:
+        option_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: option
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  end_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  token_type:
+                    type: Identifier
+                    identifier: titi
+                trailing_trivia: []
+        type_specifiers:
+          - punctuation:
+              leading_trivia: []
+              token:
+                start_position:
+                  bytes: 11
+                  line: 1
+                  character: 12
+                end_position:
+                  bytes: 12
+                  line: 1
+                  character: 13
+                token_type:
+                  type: Symbol
+                  symbol: ":"
+              trailing_trivia:
+                - start_position:
+                    bytes: 12
+                    line: 1
+                    character: 13
+                  end_position:
+                    bytes: 13
+                    line: 1
+                    character: 14
+                  token_type:
+                    type: Whitespace
+                    characters: " "
+            type_info:
+              Basic:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 13
+                    line: 1
+                    character: 14
+                  end_position:
+                    bytes: 19
+                    line: 1
+                    character: 20
+                  token_type:
+                    type: Identifier
+                    identifier: number
+                trailing_trivia:
+                  - start_position:
+                      bytes: 19
+                      line: 1
+                      character: 20
+                    end_position:
+                      bytes: 20
+                      line: 1
+                      character: 21
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 20
+              line: 1
+              character: 21
+            end_position:
+              bytes: 21
+              line: 1
+              character: 22
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 21
+                line: 1
+                character: 22
+              end_position:
+                bytes: 22
+                line: 1
+                character: 23
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 22
+                      line: 1
+                      character: 23
+                    end_position:
+                      bytes: 23
+                      line: 1
+                      character: 24
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 23
+                        line: 1
+                        character: 24
+                      end_position:
+                        bytes: 24
+                        line: 1
+                        character: 24
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/source.lua
new file mode 100644
index 00000000..1da84c8f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/source.lua
@@ -0,0 +1 @@
+option titi: number = 1
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/tokens.snap
new file mode 100644
index 00000000..5831befa
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_1/tokens.snap
@@ -0,0 +1,136 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/pass/option_decl_1
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: option
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: titi
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: ":"
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 19
+    line: 1
+    character: 20
+  token_type:
+    type: Identifier
+    identifier: number
+- start_position:
+    bytes: 19
+    line: 1
+    character: 20
+  end_position:
+    bytes: 20
+    line: 1
+    character: 21
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 20
+    line: 1
+    character: 21
+  end_position:
+    bytes: 21
+    line: 1
+    character: 22
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 21
+    line: 1
+    character: 22
+  end_position:
+    bytes: 22
+    line: 1
+    character: 23
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 22
+    line: 1
+    character: 23
+  end_position:
+    bytes: 23
+    line: 1
+    character: 24
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 23
+    line: 1
+    character: 24
+  end_position:
+    bytes: 24
+    line: 1
+    character: 24
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 24
+    line: 2
+    character: 1
+  end_position:
+    bytes: 24
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/ast.snap
new file mode 100644
index 00000000..a985e625
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/ast.snap
@@ -0,0 +1,117 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/option_decl_3
+---
+stmts:
+  - - OptionDecl:
+        option_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 6
+              line: 1
+              character: 7
+            token_type:
+              type: Symbol
+              symbol: option
+          trailing_trivia:
+            - start_position:
+                bytes: 6
+                line: 1
+                character: 7
+              end_position:
+                bytes: 7
+                line: 1
+                character: 8
+              token_type:
+                type: Whitespace
+                characters: " "
+        name_list:
+          pairs:
+            - End:
+                leading_trivia: []
+                token:
+                  start_position:
+                    bytes: 7
+                    line: 1
+                    character: 8
+                  end_position:
+                    bytes: 11
+                    line: 1
+                    character: 12
+                  token_type:
+                    type: Identifier
+                    identifier: titi
+                trailing_trivia:
+                  - start_position:
+                      bytes: 11
+                      line: 1
+                      character: 12
+                    end_position:
+                      bytes: 12
+                      line: 1
+                      character: 13
+                    token_type:
+                      type: Whitespace
+                      characters: " "
+        equal_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 1
+              character: 13
+            end_position:
+              bytes: 13
+              line: 1
+              character: 14
+            token_type:
+              type: Symbol
+              symbol: "="
+          trailing_trivia:
+            - start_position:
+                bytes: 13
+                line: 1
+                character: 14
+              end_position:
+                bytes: 14
+                line: 1
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: " "
+        expr_list:
+          pairs:
+            - End:
+                Number:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 14
+                      line: 1
+                      character: 15
+                    end_position:
+                      bytes: 15
+                      line: 1
+                      character: 16
+                    token_type:
+                      type: Number
+                      text: "1"
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 15
+                        line: 1
+                        character: 16
+                      end_position:
+                        bytes: 16
+                        line: 1
+                        character: 16
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/source.lua
new file mode 100644
index 00000000..8264a0bc
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/source.lua
@@ -0,0 +1 @@
+option titi = 1
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/tokens.snap
new file mode 100644
index 00000000..507c559d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/option_decl_2/tokens.snap
@@ -0,0 +1,103 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/pass/option_decl_3
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 6
+    line: 1
+    character: 7
+  token_type:
+    type: Symbol
+    symbol: option
+- start_position:
+    bytes: 6
+    line: 1
+    character: 7
+  end_position:
+    bytes: 7
+    line: 1
+    character: 8
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 7
+    line: 1
+    character: 8
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: Identifier
+    identifier: titi
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 13
+    line: 1
+    character: 14
+  token_type:
+    type: Symbol
+    symbol: "="
+- start_position:
+    bytes: 13
+    line: 1
+    character: 14
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 16
+  token_type:
+    type: Number
+    text: "1"
+- start_position:
+    bytes: 15
+    line: 1
+    character: 16
+  end_position:
+    bytes: 16
+    line: 1
+    character: 16
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 16
+    line: 2
+    character: 1
+  end_position:
+    bytes: 16
+    line: 2
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/ast.snap
new file mode 100644
index 00000000..3ba9b7ea
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/ast.snap
@@ -0,0 +1,274 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/write_multiple
+---
+stmts:
+  - - Main:
+        main_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Symbol
+              symbol: main
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        initial_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: StringLiteral
+              literal: init
+              quote_type: Double
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        begin_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 1
+              character: 13
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        assignements: []
+        write_stmt:
+          write_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 15
+                  line: 2
+                  character: 1
+                end_position:
+                  bytes: 19
+                  line: 2
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: "    "
+            token:
+              start_position:
+                bytes: 19
+                line: 2
+                character: 5
+              end_position:
+                bytes: 25
+                line: 2
+                character: 11
+              token_type:
+                type: Symbol
+                symbol: return
+            trailing_trivia:
+              - start_position:
+                  bytes: 25
+                  line: 2
+                  character: 11
+                end_position:
+                  bytes: 26
+                  line: 2
+                  character: 12
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          begin_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 26
+                line: 2
+                character: 12
+              end_position:
+                bytes: 27
+                line: 2
+                character: 13
+              token_type:
+                type: Symbol
+                symbol: "{"
+            trailing_trivia:
+              - start_position:
+                  bytes: 27
+                  line: 2
+                  character: 13
+                end_position:
+                  bytes: 28
+                  line: 2
+                  character: 14
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          variable_list:
+            pairs:
+              - Punctuated:
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 28
+                        line: 2
+                        character: 14
+                      end_position:
+                        bytes: 34
+                        line: 2
+                        character: 20
+                      token_type:
+                        type: StringLiteral
+                        literal: init
+                        quote_type: Double
+                    trailing_trivia: []
+                  - leading_trivia: []
+                    token:
+                      start_position:
+                        bytes: 34
+                        line: 2
+                        character: 20
+                      end_position:
+                        bytes: 35
+                        line: 2
+                        character: 21
+                      token_type:
+                        type: Symbol
+                        symbol: ","
+                    trailing_trivia:
+                      - start_position:
+                          bytes: 35
+                          line: 2
+                          character: 21
+                        end_position:
+                          bytes: 36
+                          line: 2
+                          character: 22
+                        token_type:
+                          type: Whitespace
+                          characters: " "
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 36
+                      line: 2
+                      character: 22
+                    end_position:
+                      bytes: 42
+                      line: 2
+                      character: 28
+                    token_type:
+                      type: StringLiteral
+                      literal: last
+                      quote_type: Double
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 42
+                        line: 2
+                        character: 28
+                      end_position:
+                        bytes: 43
+                        line: 2
+                        character: 29
+                      token_type:
+                        type: Whitespace
+                        characters: " "
+          end_token:
+            leading_trivia: []
+            token:
+              start_position:
+                bytes: 43
+                line: 2
+                character: 29
+              end_position:
+                bytes: 44
+                line: 2
+                character: 30
+              token_type:
+                type: Symbol
+                symbol: "}"
+            trailing_trivia:
+              - start_position:
+                  bytes: 44
+                  line: 2
+                  character: 30
+                end_position:
+                  bytes: 45
+                  line: 2
+                  character: 30
+                token_type:
+                  type: Whitespace
+                  characters: "\n"
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 45
+              line: 3
+              character: 1
+            end_position:
+              bytes: 48
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 48
+                line: 3
+                character: 4
+              end_position:
+                bytes: 49
+                line: 3
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/source.lua
new file mode 100644
index 00000000..2cd2ac93
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/source.lua
@@ -0,0 +1,3 @@
+main "init" do
+    return { "init", "last" }
+end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/tokens.snap
new file mode 100644
index 00000000..311abb0a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_multiple/tokens.snap
@@ -0,0 +1,238 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/pass/write_multiple
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: main
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 19
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 5
+  end_position:
+    bytes: 25
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 25
+    line: 2
+    character: 11
+  end_position:
+    bytes: 26
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 2
+    character: 12
+  end_position:
+    bytes: 27
+    line: 2
+    character: 13
+  token_type:
+    type: Symbol
+    symbol: "{"
+- start_position:
+    bytes: 27
+    line: 2
+    character: 13
+  end_position:
+    bytes: 28
+    line: 2
+    character: 14
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 28
+    line: 2
+    character: 14
+  end_position:
+    bytes: 34
+    line: 2
+    character: 20
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 34
+    line: 2
+    character: 20
+  end_position:
+    bytes: 35
+    line: 2
+    character: 21
+  token_type:
+    type: Symbol
+    symbol: ","
+- start_position:
+    bytes: 35
+    line: 2
+    character: 21
+  end_position:
+    bytes: 36
+    line: 2
+    character: 22
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 36
+    line: 2
+    character: 22
+  end_position:
+    bytes: 42
+    line: 2
+    character: 28
+  token_type:
+    type: StringLiteral
+    literal: last
+    quote_type: Double
+- start_position:
+    bytes: 42
+    line: 2
+    character: 28
+  end_position:
+    bytes: 43
+    line: 2
+    character: 29
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 43
+    line: 2
+    character: 29
+  end_position:
+    bytes: 44
+    line: 2
+    character: 30
+  token_type:
+    type: Symbol
+    symbol: "}"
+- start_position:
+    bytes: 44
+    line: 2
+    character: 30
+  end_position:
+    bytes: 45
+    line: 2
+    character: 30
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 45
+    line: 3
+    character: 1
+  end_position:
+    bytes: 48
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 48
+    line: 3
+    character: 4
+  end_position:
+    bytes: 49
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 49
+    line: 4
+    character: 1
+  end_position:
+    bytes: 49
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/ast.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/ast.snap
new file mode 100644
index 00000000..4fb5aafd
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/ast.snap
@@ -0,0 +1,183 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: ast.nodes()
+input_file: vvs_parser/tests/vivy_cases/pass/write_single
+---
+stmts:
+  - - Main:
+        main_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 0
+              line: 1
+              character: 1
+            end_position:
+              bytes: 4
+              line: 1
+              character: 5
+            token_type:
+              type: Symbol
+              symbol: main
+          trailing_trivia:
+            - start_position:
+                bytes: 4
+                line: 1
+                character: 5
+              end_position:
+                bytes: 5
+                line: 1
+                character: 6
+              token_type:
+                type: Whitespace
+                characters: " "
+        initial_variable:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 5
+              line: 1
+              character: 6
+            end_position:
+              bytes: 11
+              line: 1
+              character: 12
+            token_type:
+              type: StringLiteral
+              literal: init
+              quote_type: Double
+          trailing_trivia:
+            - start_position:
+                bytes: 11
+                line: 1
+                character: 12
+              end_position:
+                bytes: 12
+                line: 1
+                character: 13
+              token_type:
+                type: Whitespace
+                characters: " "
+        begin_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 12
+              line: 1
+              character: 13
+            end_position:
+              bytes: 14
+              line: 1
+              character: 15
+            token_type:
+              type: Symbol
+              symbol: do
+          trailing_trivia:
+            - start_position:
+                bytes: 14
+                line: 1
+                character: 15
+              end_position:
+                bytes: 15
+                line: 1
+                character: 15
+              token_type:
+                type: Whitespace
+                characters: "\n"
+        assignements: []
+        write_stmt:
+          write_token:
+            leading_trivia:
+              - start_position:
+                  bytes: 15
+                  line: 2
+                  character: 1
+                end_position:
+                  bytes: 19
+                  line: 2
+                  character: 5
+                token_type:
+                  type: Whitespace
+                  characters: "    "
+            token:
+              start_position:
+                bytes: 19
+                line: 2
+                character: 5
+              end_position:
+                bytes: 25
+                line: 2
+                character: 11
+              token_type:
+                type: Symbol
+                symbol: return
+            trailing_trivia:
+              - start_position:
+                  bytes: 25
+                  line: 2
+                  character: 11
+                end_position:
+                  bytes: 26
+                  line: 2
+                  character: 12
+                token_type:
+                  type: Whitespace
+                  characters: " "
+          begin_token: ~
+          variable_list:
+            pairs:
+              - End:
+                  leading_trivia: []
+                  token:
+                    start_position:
+                      bytes: 26
+                      line: 2
+                      character: 12
+                    end_position:
+                      bytes: 32
+                      line: 2
+                      character: 18
+                    token_type:
+                      type: StringLiteral
+                      literal: init
+                      quote_type: Double
+                  trailing_trivia:
+                    - start_position:
+                        bytes: 32
+                        line: 2
+                        character: 18
+                      end_position:
+                        bytes: 33
+                        line: 2
+                        character: 18
+                      token_type:
+                        type: Whitespace
+                        characters: "\n"
+          end_token: ~
+        end_token:
+          leading_trivia: []
+          token:
+            start_position:
+              bytes: 33
+              line: 3
+              character: 1
+            end_position:
+              bytes: 36
+              line: 3
+              character: 4
+            token_type:
+              type: Symbol
+              symbol: end
+          trailing_trivia:
+            - start_position:
+                bytes: 36
+                line: 3
+                character: 4
+              end_position:
+                bytes: 37
+                line: 3
+                character: 4
+              token_type:
+                type: Whitespace
+                characters: "\n"
+    - ~
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/source.lua b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/source.lua
new file mode 100644
index 00000000..75ac778d
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/source.lua
@@ -0,0 +1,3 @@
+main "init" do
+    return "init"
+end
diff --git a/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/tokens.snap b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/tokens.snap
new file mode 100644
index 00000000..a41eb1ed
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tests/vivy_cases/pass/write_single/tokens.snap
@@ -0,0 +1,160 @@
+---
+source: vvs_parser/tests/pass_cases.rs
+expression: tokens
+input_file: vvs_parser/tests/vivy_cases/pass/write_single
+---
+- start_position:
+    bytes: 0
+    line: 1
+    character: 1
+  end_position:
+    bytes: 4
+    line: 1
+    character: 5
+  token_type:
+    type: Symbol
+    symbol: main
+- start_position:
+    bytes: 4
+    line: 1
+    character: 5
+  end_position:
+    bytes: 5
+    line: 1
+    character: 6
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 5
+    line: 1
+    character: 6
+  end_position:
+    bytes: 11
+    line: 1
+    character: 12
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 11
+    line: 1
+    character: 12
+  end_position:
+    bytes: 12
+    line: 1
+    character: 13
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 12
+    line: 1
+    character: 13
+  end_position:
+    bytes: 14
+    line: 1
+    character: 15
+  token_type:
+    type: Symbol
+    symbol: do
+- start_position:
+    bytes: 14
+    line: 1
+    character: 15
+  end_position:
+    bytes: 15
+    line: 1
+    character: 15
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 15
+    line: 2
+    character: 1
+  end_position:
+    bytes: 19
+    line: 2
+    character: 5
+  token_type:
+    type: Whitespace
+    characters: "    "
+- start_position:
+    bytes: 19
+    line: 2
+    character: 5
+  end_position:
+    bytes: 25
+    line: 2
+    character: 11
+  token_type:
+    type: Symbol
+    symbol: return
+- start_position:
+    bytes: 25
+    line: 2
+    character: 11
+  end_position:
+    bytes: 26
+    line: 2
+    character: 12
+  token_type:
+    type: Whitespace
+    characters: " "
+- start_position:
+    bytes: 26
+    line: 2
+    character: 12
+  end_position:
+    bytes: 32
+    line: 2
+    character: 18
+  token_type:
+    type: StringLiteral
+    literal: init
+    quote_type: Double
+- start_position:
+    bytes: 32
+    line: 2
+    character: 18
+  end_position:
+    bytes: 33
+    line: 2
+    character: 18
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 33
+    line: 3
+    character: 1
+  end_position:
+    bytes: 36
+    line: 3
+    character: 4
+  token_type:
+    type: Symbol
+    symbol: end
+- start_position:
+    bytes: 36
+    line: 3
+    character: 4
+  end_position:
+    bytes: 37
+    line: 3
+    character: 4
+  token_type:
+    type: Whitespace
+    characters: "\n"
+- start_position:
+    bytes: 37
+    line: 4
+    character: 1
+  end_position:
+    bytes: 37
+    line: 4
+    character: 1
+  token_type:
+    type: Eof
diff --git a/src/Rust/vvs_parser/src/tokenizer/lexer.rs b/src/Rust/vvs_parser/src/tokenizer/lexer.rs
new file mode 100644
index 00000000..7ce1b9b5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tokenizer/lexer.rs
@@ -0,0 +1,764 @@
+//! Build the tokens. Don't need for outter world to know the lexer.
+
+use crate::{
+    tokenizer::{
+        Position, StringLiteralQuoteType, Symbol, Token, TokenReference, TokenType, TokenizerError, TokenizerErrorType,
+    },
+    ShortString,
+};
+use serde::{Deserialize, Serialize};
+
+/// A lexer, which will produce a stream of tokens from a source string.
+/// If you just want to create an [`Ast`](crate::ast::Ast) from a string, you want to use
+/// [`parse`](crate::parse) instead.
+pub struct Lexer {
+    pub(crate) source: LexerSource,
+    sent_eof: bool,
+
+    next_token: Option<LexerResult<TokenReference>>,
+    peek_token: Option<LexerResult<TokenReference>>,
+}
+
+impl Lexer {
+    /// Creates a new Lexer from the given source string.
+    pub fn new(source: &str) -> Self {
+        let mut lexer = Self::new_lazy(source);
+        lexer.next_token = lexer.process_first_with_trivia();
+        lexer.peek_token = lexer.process_next_with_trivia();
+        lexer
+    }
+
+    /// Creates a new Lexer from the given source string, but does not process
+    /// the first token.
+    pub fn new_lazy(source: &str) -> Self {
+        Self { source: LexerSource::new(source), sent_eof: false, next_token: None, peek_token: None }
+    }
+
+    /// Returns the current token.
+    pub fn current(&self) -> Option<&LexerResult<TokenReference>> {
+        self.next_token.as_ref()
+    }
+
+    /// Returns the next token.
+    pub fn peek(&self) -> Option<&LexerResult<TokenReference>> {
+        self.peek_token.as_ref()
+    }
+
+    /// Consumes the current token and returns the next token.
+    pub fn consume(&mut self) -> Option<LexerResult<TokenReference>> {
+        let next = self.next_token.take()?;
+        self.next_token = self.peek_token.take();
+        self.peek_token = self.process_next_with_trivia();
+        Some(next)
+    }
+
+    /// Returns a vector of all tokens left in the source string.
+    pub fn collect(self) -> LexerResult<Vec<Token>> {
+        let mut tokens = Vec::new();
+        let mut lexer = self;
+        let mut errors = Vec::new();
+
+        while let Some(token_reference) = lexer.consume() {
+            let mut token_reference = match token_reference {
+                LexerResult::Ok(token_reference) => token_reference,
+                LexerResult::Recovered(token_reference, mut new_errors) => {
+                    errors.append(&mut new_errors);
+                    token_reference
+                }
+                LexerResult::Fatal(mut new_errors) => {
+                    errors.append(&mut new_errors);
+                    continue;
+                }
+            };
+            tokens.append(&mut token_reference.leading_trivia);
+            tokens.push(token_reference.token);
+            tokens.append(&mut token_reference.trailing_trivia);
+        }
+
+        LexerResult::new(tokens, errors)
+    }
+
+    fn create(&self, start_position: Position, token_type: TokenType) -> Option<LexerResult<Token>> {
+        Some(LexerResult::Ok(Token { token_type, start_position, end_position: self.source.position() }))
+    }
+
+    fn create_recovered(
+        &self,
+        start_position: Position,
+        token_type: TokenType,
+        errors: Vec<TokenizerError>,
+    ) -> Option<LexerResult<Token>> {
+        Some(LexerResult::new(Token { token_type, start_position, end_position: self.source.position() }, errors))
+    }
+
+    fn process_next_with_trivia(&mut self) -> Option<LexerResult<TokenReference>> {
+        let mut leading_trivia = Vec::new();
+        let mut errors: Option<Vec<TokenizerError>> = None;
+
+        let nontrivial_token = loop {
+            match self.process_next()? {
+                LexerResult::Ok(token) if token.token_type().is_trivia() => leading_trivia.push(token),
+                LexerResult::Ok(token) => break token,
+                LexerResult::Fatal(error) => return Some(LexerResult::Fatal(error)),
+                LexerResult::Recovered(token, mut new_errors) => {
+                    match errors.as_mut() {
+                        Some(errors) => errors.append(&mut new_errors),
+                        None => errors = Some(new_errors),
+                    }
+                    if token.token_type().is_trivia() {
+                        leading_trivia.push(token);
+                    } else {
+                        break token;
+                    }
+                }
+            }
+        };
+
+        let trailing_trivia = self.collect_trailing_trivia();
+        let token = TokenReference { token: nontrivial_token, leading_trivia, trailing_trivia };
+        match errors {
+            Some(errors) => Some(LexerResult::Recovered(token, errors)),
+            None => Some(LexerResult::Ok(token)),
+        }
+    }
+
+    fn process_first_with_trivia(&mut self) -> Option<LexerResult<TokenReference>> {
+        if self.source.current() == Some('#') && self.source.peek() == Some('!') {
+            let start_position = self.source.position();
+            let mut line = "#!".to_string();
+
+            self.source.next();
+            self.source.next();
+
+            while let Some(next) = self.source.current() {
+                if next == '\n' {
+                    break;
+                }
+                self.source.next();
+                line.push(next);
+            }
+
+            let end_position = self.source.position();
+            let shebang = Token { token_type: TokenType::Shebang { line: line.into() }, start_position, end_position };
+
+            // rewrite todo: handle LexerResult better here
+            if let Some(LexerResult::Ok(mut token_reference)) = self.process_next_with_trivia() {
+                token_reference.leading_trivia.insert(0, shebang);
+                return Some(LexerResult::Ok(token_reference));
+            }
+        }
+
+        self.process_next_with_trivia()
+    }
+
+    fn collect_trailing_trivia(&mut self) -> Vec<Token> {
+        let mut trailing_trivia = Vec::new();
+
+        loop {
+            let sent_eof = self.sent_eof;
+            let start_position = self.source.lexer_position;
+
+            match self.process_next() {
+                Some(LexerResult::Ok(token)) if token.token_type().is_trivia() => {
+                    // Take all trivia up to and including the newline character. If we see a newline character
+                    // we should break once we have taken it in.
+                    let should_break = if let TokenType::Whitespace { ref characters } = token.token_type() {
+                        // Use contains in order to tolerate \r\n line endings and mixed whitespace tokens
+                        characters.contains('\n')
+                    } else {
+                        false
+                    };
+                    trailing_trivia.push(token);
+                    if should_break {
+                        break;
+                    }
+                }
+
+                _ => {
+                    self.source.lexer_position = start_position;
+                    self.sent_eof = sent_eof;
+                    break;
+                }
+            }
+        }
+
+        trailing_trivia
+    }
+
+    /// Processes and returns the next token in the source string, ignoring trivia.
+    pub fn process_next(&mut self) -> Option<LexerResult<Token>> {
+        let start_position = self.source.position();
+        let Some(next) = self.source.next() else {
+            if self.sent_eof {
+                return None;
+            } else {
+                self.sent_eof = true;
+                return self.create(start_position, TokenType::Eof);
+            }
+        };
+
+        macro_rules! consume {
+            ($first: literal, $second: literal) => {
+                self.source.consume_two($first, $second)
+            };
+            ($first: literal) => {
+                self.source.consume($first)
+            };
+        }
+        macro_rules! create {
+            ($symbol: ident) => {
+                self.create(start_position, TokenType::Symbol { symbol: Symbol::$symbol })
+            };
+        }
+
+        match next {
+            // Identifiers
+            initial if is_identifier_start(initial) => {
+                let mut identifier = String::new();
+                identifier.push(initial);
+
+                while let Some(next) = self.source.current() {
+                    if is_identifier_start(next) || next.is_ascii_digit() {
+                        identifier.push(self.source.next().expect("peeked, but no next"));
+                    } else {
+                        break;
+                    }
+                }
+
+                let token_type = if let Some(symbol) = Symbol::from_str(&identifier) {
+                    TokenType::Symbol { symbol }
+                } else {
+                    TokenType::Identifier { identifier: ShortString::from(identifier) }
+                };
+                self.create(start_position, token_type)
+            }
+
+            // Spaces
+            initial @ (' ' | '\t' | '\r') => {
+                let mut whitespace = String::new();
+                whitespace.push(initial);
+
+                // Handle end_position appropriately: for a newline, we increment the bytes, but
+                // do not increment line/char
+                let mut end_position = Position {
+                    bytes: start_position.bytes() + initial.len_utf8(),
+                    line: start_position.line,
+                    character: start_position.character + 1,
+                };
+
+                while let Some(next) = self.source.current() {
+                    if next == ' ' || next == '\t' {
+                        end_position.bytes += next.len_utf8();
+                        end_position.character += 1;
+                        whitespace.push(self.source.next().expect("peeked, but no next"));
+                        continue;
+                    }
+
+                    if next == '\n' {
+                        end_position.bytes += next.len_utf8();
+                        whitespace.push(self.source.next().expect("peeked, but no next"));
+                    } else if next == '\r' && self.source.peek() == Some('\n') {
+                        let carriage_return = self.source.next().expect("peeked, but no next");
+                        let new_line = self.source.next().expect("peeked, but no next");
+                        end_position.bytes += carriage_return.len_utf8() + new_line.len_utf8();
+                        end_position.character += 1;
+                        whitespace.push(carriage_return);
+                        whitespace.push(new_line);
+                    }
+                    break;
+                }
+
+                Some(LexerResult::Ok(Token {
+                    token_type: TokenType::Whitespace { characters: ShortString::from(whitespace.as_str()) },
+                    start_position,
+                    end_position,
+                }))
+            }
+
+            // Integers
+            '0' if matches!(self.source.current(), Some('x' | 'X')) => {
+                let hex_character = self.source.next().unwrap();
+                self.read_hex_number(hex_character, start_position)
+            }
+            '0' if matches!(self.source.current(), Some('b' | 'B')) => {
+                let binary_character = self.source.next().unwrap();
+                self.read_binary_number(binary_character, start_position)
+            }
+            initial @ '0' => self.read_number(start_position, initial.to_string()),
+            initial @ ('1'..='9') => self.read_number(start_position, initial.to_string()),
+
+            // Strings
+            quote @ ('"' | '\'') => {
+                let (string, recovered) = self.read_string(quote);
+                let errors = recovered.then(|| TokenizerError {
+                    error: TokenizerErrorType::UnclosedString,
+                    range: (start_position, self.source.position()),
+                });
+                self.create_recovered(start_position, string, errors.into_iter().collect())
+            }
+
+            // Complicated things
+            '[' if matches!(self.source.current(), Some('[' | '=')) => {
+                let start_lexer_position = self.source.lexer_position;
+                match self.read_multi_line_body() {
+                    MultiLineBodyResult::Ok { blocks, body } => self.create(
+                        start_position,
+                        TokenType::StringLiteral {
+                            literal: body.into(),
+                            multi_line_depth: blocks,
+                            quote_type: StringLiteralQuoteType::Brackets,
+                        },
+                    ),
+                    MultiLineBodyResult::Unclosed { blocks, body } => self.create_recovered(
+                        start_position,
+                        TokenType::StringLiteral {
+                            literal: body.into(),
+                            multi_line_depth: blocks,
+                            quote_type: StringLiteralQuoteType::Brackets,
+                        },
+                        vec![TokenizerError {
+                            error: TokenizerErrorType::UnclosedString,
+                            range: (start_position, self.source.position()),
+                        }],
+                    ),
+                    MultiLineBodyResult::NotMultiLine { .. } => {
+                        // Reset back, parse the one `[`, and let the rest be parsed again
+                        self.source.lexer_position = start_lexer_position;
+                        create!(LeftBracket)
+                    }
+                }
+            }
+
+            // Consume three
+            '/' if consume!('/', '=') => create!(DoubleSlashEqual),
+            '.' if consume!('.', '=') => create!(TwoDotsEqual),
+
+            // Consume two
+            '/' if consume!('/') => create!(DoubleSlash),
+            '/' if consume!('=') => create!(SlashEqual),
+            ':' if consume!(':') => create!(TwoColons),
+            '+' if consume!('=') => create!(PlusEqual),
+            '*' if consume!('=') => create!(StarEqual),
+            '%' if consume!('=') => create!(PercentEqual),
+            '^' if consume!('=') => create!(CaretEqual),
+            '=' if consume!('=') => create!(TwoEqual),
+            '~' if consume!('>') => create!(DoubleGreaterThan),
+            '~' if consume!('=') => create!(TildeEqual),
+            '<' if consume!('~') => create!(DoubleLesserThan),
+            '<' if consume!('=') => create!(LessThanEqual),
+            '>' if consume!('=') => create!(GreaterThanEqual),
+            '.' if consume!('.') => create!(TwoDots),
+            '-' if consume!('=') => create!(MinusEqual),
+            '-' if consume!('>') => create!(ThinArrow),
+            '-' if consume!('-') => {
+                let (token, recovered) = self.read_comment();
+                let errors = recovered.then(|| TokenizerError {
+                    error: TokenizerErrorType::UnclosedComment,
+                    range: (start_position, self.source.position()),
+                });
+                self.create_recovered(start_position, token, errors.into_iter().collect())
+            }
+            '.' if matches!(self.source.current(), Some('0'..='9')) => {
+                self.read_number(start_position, ".".to_string())
+            }
+
+            // Consume one
+            ':' => create!(Colon),
+            '+' => create!(Plus),
+            '*' => create!(Star),
+            '%' => create!(Percent),
+            '^' => create!(Caret),
+            '=' => create!(Equal),
+            '~' => create!(Tilde),
+            '<' => create!(LessThan),
+            '>' => create!(GreaterThan),
+            '(' => create!(LeftParen),
+            ')' => create!(RightParen),
+            ']' => create!(RightBracket),
+            ';' => create!(Semicolon),
+            '&' => create!(Ampersand),
+            '|' => create!(Pipe),
+            '?' => create!(QuestionMark),
+            '#' => create!(Hash),
+            ',' => create!(Comma),
+            '[' => create!(LeftBracket),
+            '}' => create!(RightBrace),
+            '/' => create!(Slash),
+            '.' => create!(Dot),
+            '-' => create!(Minus),
+            '{' => create!(LeftBrace),
+
+            '\n' => Some(LexerResult::Ok(Token {
+                token_type: TokenType::Whitespace { characters: ShortString::from("\n") },
+                start_position,
+                end_position: Position { bytes: start_position.bytes() + 1, ..start_position },
+            })),
+
+            // Oupsy
+            unknown_char => Some(LexerResult::Fatal(vec![TokenizerError {
+                error: TokenizerErrorType::UnexpectedToken(unknown_char),
+                range: (start_position, self.source.position()),
+            }])),
+        }
+    }
+
+    fn read_number(&mut self, start_position: Position, mut number: String) -> Option<LexerResult<Token>> {
+        let mut hit_decimal = false;
+        while let Some(next) = self.source.current() {
+            if next.is_ascii_digit() || matches!(next, '_') {
+                number.push(self.source.next().expect("peeked, but no next"));
+            } else if matches!(next, '.') && hit_decimal {
+                return Some(self.eat_invalid_number(start_position, number));
+            } else if matches!(next, '.') {
+                hit_decimal = true;
+                number.push(self.source.next().expect("peeked, but no next"));
+            } else if matches!(next, 'e' | 'E') {
+                return self.read_exponent_part(start_position, number);
+            } else {
+                break;
+            }
+        }
+        self.create(start_position, TokenType::Number { text: ShortString::from(number) })
+    }
+
+    fn eat_invalid_number(&mut self, start_position: Position, mut number: String) -> LexerResult<Token> {
+        loop {
+            if matches!(self.source.current(), Some(token) if token.is_ascii_whitespace())
+                || self.source.current().is_none()
+            {
+                return LexerResult::new(
+                    Token {
+                        token_type: TokenType::Number { text: number.into() },
+                        start_position,
+                        end_position: self.source.position(),
+                    },
+                    vec![TokenizerError {
+                        error: TokenizerErrorType::InvalidNumber,
+                        range: (start_position, self.source.position()),
+                    }],
+                );
+            }
+
+            number.push(self.source.next().expect("peeked, but no next"));
+        }
+    }
+
+    // Starts from the exponent marker (like 'e')
+    fn read_exponent_part(&mut self, start_position: Position, mut number: String) -> Option<LexerResult<Token>> {
+        number.push(self.source.next().expect("peeked, but no next"));
+
+        let next = self.source.current();
+        if matches!(next, Some('+') | Some('-')) {
+            number.push(self.source.next().expect("peeked, but no next"));
+        }
+
+        if !matches!(self.source.current(), Some('0'..='9')) {
+            return Some(self.eat_invalid_number(start_position, number));
+        }
+
+        while let Some(next) = self.source.current() {
+            if !next.is_ascii_digit() && !matches!(next, '_') {
+                break;
+            }
+            number.push(self.source.next().expect("peeked, but no next"));
+        }
+
+        self.create(start_position, TokenType::Number { text: ShortString::from(number) })
+    }
+
+    fn read_hex_number(&mut self, hex_character: char, start_position: Position) -> Option<LexerResult<Token>> {
+        let mut number = String::from_iter(['0', hex_character]);
+        let mut hit_decimal = false;
+
+        while let Some(next) = self.source.current() {
+            match next {
+                '0'..='9' | 'a'..='f' | 'A'..='F' | '_' => {
+                    number.push(self.source.next().expect("peeked, but no next"))
+                }
+
+                'p' | 'P' if number.len() == 2 => return Some(self.eat_invalid_number(start_position, number)),
+                'p' | 'P' => return self.read_exponent_part(start_position, number),
+                '.' if hit_decimal => return Some(self.eat_invalid_number(start_position, number)),
+
+                '.' => {
+                    hit_decimal = true;
+                    number.push(self.source.next().expect("peeked, but no next"));
+                }
+
+                _ => break,
+            }
+        }
+
+        if number.len() == 2 {
+            return Some(self.eat_invalid_number(start_position, number));
+        }
+
+        self.create(start_position, TokenType::Number { text: ShortString::from(number) })
+    }
+
+    fn read_binary_number(&mut self, binary_character: char, start_position: Position) -> Option<LexerResult<Token>> {
+        let mut number = String::from_iter(['0', binary_character]);
+
+        while matches!(self.source.current(), Some('0' | '1' | '_')) {
+            number.push(self.source.next().expect("peeked, but no next"))
+        }
+
+        if number.len() == 2 {
+            return Some(self.eat_invalid_number(start_position, number));
+        }
+
+        self.create(start_position, TokenType::Number { text: ShortString::from(number) })
+    }
+
+    // (string, had to be recovered?)
+    fn read_string(&mut self, quote: char) -> (TokenType, bool) {
+        let quote_type = match quote {
+            '"' => StringLiteralQuoteType::Double,
+            '\'' => StringLiteralQuoteType::Single,
+            _ => unreachable!(),
+        };
+
+        let mut literal = String::new();
+        let mut escape = false;
+        let mut z_escaped = false;
+
+        loop {
+            let Some(next) = self.source.next() else {
+                let token = TokenType::StringLiteral { literal: literal.into(), multi_line_depth: 0, quote_type };
+                return (token, true);
+            };
+
+            match (escape, next) {
+                (true, 'z') => {
+                    escape = false;
+                    z_escaped = true;
+                    literal.push('z');
+                }
+
+                (true, ..) => {
+                    escape = false;
+                    z_escaped = true; // support for '\' followed by a new line
+                    literal.push(next);
+                }
+
+                (false, '\\') => {
+                    escape = true;
+                    literal.push('\\');
+                }
+
+                (false, '\n' | '\r') if z_escaped => {
+                    z_escaped = false;
+                    literal.push(next);
+                }
+
+                (false, '\n' | '\r') => {
+                    let token = TokenType::StringLiteral { literal: literal.into(), multi_line_depth: 0, quote_type };
+                    return (token, true);
+                }
+
+                (false, ..) if next == quote => {
+                    let token = TokenType::StringLiteral { literal: literal.into(), multi_line_depth: 0, quote_type };
+                    return (token, false);
+                }
+
+                (false, ..) => literal.push(next),
+            }
+        }
+    }
+
+    // (comment, had to be recovered?)
+    fn read_comment(&mut self) -> (TokenType, bool) {
+        let mut comment = String::new();
+
+        if self.source.consume('[') {
+            match self.read_multi_line_body() {
+                MultiLineBodyResult::Ok { blocks, body } | MultiLineBodyResult::Unclosed { blocks, body } => {
+                    return (TokenType::MultiLineComment { blocks, comment: body.into() }, false);
+                }
+
+                MultiLineBodyResult::NotMultiLine { blocks } => {
+                    comment.push('[');
+                    (0..blocks).for_each(|_| comment.push('='));
+                }
+            }
+        }
+
+        let mut position_before_new_line = self.source.lexer_position;
+
+        while let Some(next) = self.source.next() {
+            if next == '\n' {
+                break;
+            }
+            comment.push(next);
+            position_before_new_line = self.source.lexer_position;
+        }
+
+        self.source.lexer_position = position_before_new_line;
+        (TokenType::SingleLineComment { comment: comment.into() }, false)
+    }
+
+    fn read_multi_line_body(&mut self) -> MultiLineBodyResult {
+        let mut blocks = 0;
+        while self.source.consume('=') {
+            blocks += 1;
+        }
+
+        if !self.source.consume('[') {
+            return MultiLineBodyResult::NotMultiLine { blocks };
+        }
+
+        let mut body = String::new();
+        'read_comment_char: loop {
+            let Some(next) = self.source.next() else {
+                return MultiLineBodyResult::Unclosed { blocks, body };
+            };
+
+            if next == ']' {
+                let mut equal_signs = 0;
+                while equal_signs < blocks {
+                    if !self.source.consume('=') {
+                        body.push(']');
+                        (0..equal_signs).for_each(|_| body.push('='));
+                        continue 'read_comment_char;
+                    }
+                    equal_signs += 1;
+                }
+
+                if self.source.consume(']') {
+                    break;
+                }
+
+                body.push(']');
+                (0..equal_signs).for_each(|_| body.push('='));
+
+                continue;
+            }
+
+            body.push(next);
+        }
+
+        MultiLineBodyResult::Ok { blocks, body }
+    }
+}
+
+fn is_identifier_start(character: char) -> bool {
+    matches!(character, 'a'..='z' | 'A'..='Z' | '_')
+}
+
+pub(crate) struct LexerSource {
+    source: Vec<char>,
+    lexer_position: LexerPosition,
+}
+
+impl LexerSource {
+    fn new(source: &str) -> Self {
+        Self { source: source.chars().collect(), lexer_position: LexerPosition::new() }
+    }
+
+    pub(crate) fn current(&self) -> Option<char> {
+        self.source.get(self.lexer_position.index).copied()
+    }
+
+    pub(crate) fn next(&mut self) -> Option<char> {
+        let next = self.current()?;
+        if next == '\n' {
+            self.lexer_position.position.line += 1;
+            self.lexer_position.position.character = 1;
+        } else {
+            self.lexer_position.position.character += 1;
+        }
+        self.lexer_position.position.bytes += next.len_utf8();
+        self.lexer_position.index += 1;
+        Some(next)
+    }
+
+    pub(crate) fn peek(&self) -> Option<char> {
+        self.source.get(self.lexer_position.index + 1).copied()
+    }
+
+    pub(crate) fn consume(&mut self, character: char) -> bool {
+        if self.current() == Some(character) {
+            self.next();
+            return true;
+        }
+        false
+    }
+
+    pub(crate) fn consume_two(&mut self, one: char, two: char) -> bool {
+        if self.current() == Some(one) && self.peek() == Some(two) {
+            self.next();
+            self.next();
+            return true;
+        }
+        false
+    }
+
+    pub(crate) fn position(&self) -> Position {
+        self.lexer_position.position
+    }
+}
+
+#[derive(Clone, Copy)]
+struct LexerPosition {
+    position: Position,
+    index: usize,
+}
+
+impl LexerPosition {
+    fn new() -> Self {
+        Self { position: Position { line: 1, character: 1, bytes: 0 }, index: 0 }
+    }
+}
+
+/// The result of a lexer operation.
+#[derive(Debug, Deserialize, Serialize)]
+pub enum LexerResult<T> {
+    /// The lexer operation was successful.
+    Ok(T),
+
+    /// The lexer operation was unsuccessful, and could not be recovered.
+    Fatal(Vec<TokenizerError>),
+
+    /// The lexer operation was unsuccessful, but some result can be extracted.
+    Recovered(T, Vec<TokenizerError>),
+}
+
+impl<T: std::fmt::Debug> LexerResult<T> {
+    fn new(value: T, errors: Vec<TokenizerError>) -> Self {
+        if errors.is_empty() {
+            Self::Ok(value)
+        } else {
+            Self::Recovered(value, errors)
+        }
+    }
+
+    /// Unwraps the result, panicking if it is not [`LexerResult::Ok`].
+    pub fn unwrap(self) -> T {
+        match self {
+            Self::Ok(value) => value,
+            _ => panic!("expected ok, got {self:#?}"),
+        }
+    }
+
+    /// Unwraps the errors, panicking if it is [`LexerResult::Ok`].
+    pub fn unwrap_errors(self) -> Vec<TokenizerError> {
+        match self {
+            Self::Fatal(errors) | Self::Recovered(_, errors) => errors,
+            _ => panic!("expected fatal error, got {self:#?}"),
+        }
+    }
+
+    /// Returns the errors, if there was any.
+    pub fn errors(self) -> Vec<TokenizerError> {
+        match self {
+            Self::Recovered(_, errors) => errors,
+            _ => Vec::new(),
+        }
+    }
+}
+
+enum MultiLineBodyResult {
+    Ok { blocks: usize, body: String },
+    NotMultiLine { blocks: usize },
+    Unclosed { blocks: usize, body: String },
+}
diff --git a/src/Rust/vvs_parser/src/tokenizer/mod.rs b/src/Rust/vvs_parser/src/tokenizer/mod.rs
new file mode 100644
index 00000000..e21238a7
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tokenizer/mod.rs
@@ -0,0 +1,8 @@
+//! Used for tokenizing, the process of converting the code to individual tokens. Useful for
+//! getting symbols and manually tokenizing without going using an AST.
+
+mod lexer;
+mod structs;
+
+pub(crate) use lexer::*;
+pub use structs::*;
diff --git a/src/Rust/vvs_parser/src/tokenizer/structs.rs b/src/Rust/vvs_parser/src/tokenizer/structs.rs
new file mode 100644
index 00000000..717e145f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/tokenizer/structs.rs
@@ -0,0 +1,719 @@
+use crate::{
+    tokenizer::{Lexer, LexerResult},
+    visitors::{Visit, VisitMut, Visitor, VisitorMut},
+    ShortString,
+};
+use derive_more::{Deref, Display};
+use serde::{Deserialize, Serialize};
+use std::{cmp::Ordering, fmt};
+
+macro_rules! symbol {
+    {
+        $(#[$symbol_meta:meta])*
+        pub enum Symbol {
+            $(
+                $(#[$meta:meta])*
+                $name:ident => $string:literal,
+            )+
+        }
+    } => {
+        paste::paste! {
+            $(#[$symbol_meta])*
+            #[derive(Display)]
+            pub enum Symbol {
+                $(
+                    $(#[$meta])*
+                    #[serde(rename = $string)]
+                    #[display("{}", $string)]
+                    $name,
+                )+
+            }
+
+            impl Symbol {
+                /// Given just the symbol text (no whitespace), returns the associated symbol, if
+                /// it exists. If you want a TokenReference instead, consider [TokenReference::symbol].
+                #[allow(clippy::should_implement_trait)]
+                pub fn from_str(symbol: &str) -> Option<Self> {
+                    match symbol {
+                        $($string => { Some(Self::$name) },)+
+                        _ => None,
+                    }
+                }
+            }
+
+        }
+    };
+}
+
+symbol! {
+    #[non_exhaustive]
+    #[allow(missing_docs)]
+    #[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
+    /// A literal symbol, used for both words important to syntax (like while) and operators (like +)
+    pub enum Symbol {
+        And      => "and",
+        Break    => "break",
+        Do       => "do",
+        Else     => "else",
+        ElseIf   => "elseif",
+        ElIf     => "elif",
+        End      => "end",
+        False    => "false",
+        For      => "for",
+        Function => "function",
+        If       => "if",
+        In       => "in",
+        Local    => "local",
+        Nil      => "nil",
+        Not      => "not",
+        Or       => "or",
+        Repeat   => "repeat",
+        Return   => "return",
+        Then     => "then",
+        True     => "true",
+        Until    => "until",
+        While    => "while",
+        Import   => "import",
+        Job      => "job",
+        Option   => "option",
+        Main     => "main",
+        Yield    => "yield",
+
+        PlusEqual        => "+=",
+        MinusEqual       => "-=",
+        StarEqual        => "*=",
+        SlashEqual       => "/=",
+        DoubleSlashEqual => "//=",
+        PercentEqual     => "%=",
+        CaretEqual       => "^=",
+        TwoDotsEqual     => "..=",
+
+        Ampersand         => "&",
+        ThinArrow         => "->",
+        TwoColons         => "::",
+        Caret             => "^",
+        Colon             => ":",
+        Comma             => ",",
+        Dot               => ".",
+        TwoDots           => "..",
+        Equal             => "=",
+        TwoEqual          => "==",
+        GreaterThan       => ">",
+        GreaterThanEqual  => ">=",
+        Hash              => "#",
+        LeftBrace         => "{",
+        LeftBracket       => "[",
+        LeftParen         => "(",
+        LessThan          => "<",
+        LessThanEqual     => "<=",
+        Minus             => "-",
+        Percent           => "%",
+        Pipe              => "|",
+        Plus              => "+",
+        QuestionMark      => "?",
+        RightBrace        => "}",
+        RightBracket      => "]",
+        RightParen        => ")",
+        Semicolon         => ";",
+        Slash             => "/",
+        DoubleSlash       => "//",
+        Star              => "*",
+        Tilde             => "~",
+        TildeEqual        => "~=",
+        DoubleGreaterThan => "~>",
+        DoubleLesserThan  => "<~",
+    }
+}
+
+/// The possible errors that can happen while tokenizing.
+#[derive(Clone, Debug, PartialEq, Eq, Display, Deserialize, Serialize)]
+pub enum TokenizerErrorType {
+    /// An unclosed multi-line comment was found
+    #[display("unclosed comment")]
+    UnclosedComment,
+
+    /// An unclosed string was found
+    #[display("unclosed string")]
+    UnclosedString,
+
+    /// An invalid number was found
+    #[display("invalid number")]
+    InvalidNumber,
+
+    /// An unexpected token was found
+    #[display("unexpected character {_0}")]
+    UnexpectedToken(char),
+
+    /// Symbol passed is not valid
+    /// Returned from [`TokenReference::symbol`]
+    #[display("invalid symbol {_0}")]
+    InvalidSymbol(String),
+}
+
+/// Used by serde
+fn is_usize_zero(input: &usize) -> bool {
+    *input == 0
+}
+
+/// The type of tokens in parsed code
+#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
+#[serde(tag = "type")]
+#[non_exhaustive]
+pub enum TokenType {
+    /// End of file, should always be the very last token
+    Eof,
+
+    /// An identifier, such as `foo`
+    Identifier {
+        /// The identifier itself
+        identifier: ShortString,
+    },
+
+    /// A multi line comment in the format of `--[[ comment ]]`
+    MultiLineComment {
+        /// Number of equals signs, if any, for the multi line comment
+        /// For example, `--[=[` would have a `blocks` value of `1`
+        blocks: usize,
+
+        /// The comment itself, ignoring opening and closing tags
+        comment: ShortString,
+    },
+
+    /// A literal number, such as `3.3`
+    Number {
+        /// The text representing the number, includes details such as `0x`
+        text: ShortString,
+    },
+
+    /// A shebang line
+    Shebang {
+        /// The shebang line itself
+        line: ShortString,
+    },
+
+    /// A single line comment, such as `-- comment`
+    SingleLineComment {
+        /// The comment, ignoring initial `--`
+        comment: ShortString,
+    },
+
+    /// A literal string, such as "Hello, world"
+    StringLiteral {
+        /// The literal itself, ignoring quotation marks
+        literal: ShortString,
+
+        #[serde(skip_serializing_if = "is_usize_zero")]
+        /// Number of equals signs used for a multi line string, if it is one
+        /// For example, `[=[string]=]` would have a `multi_line_depth` value of 1
+        /// `[[string]]` would have a `multi_line_depth` value of 0
+        /// A string such as `"string"` would have also have a `multi_line_depth` value of 0
+        multi_line_depth: usize,
+
+        /// The type of quotation mark used to make the string
+        quote_type: StringLiteralQuoteType,
+    },
+
+    /// A [`Symbol`], such as `local` or `+`
+    Symbol {
+        /// The symbol itself
+        symbol: Symbol,
+    },
+
+    /// Whitespace, such as tabs or new lines
+    Whitespace {
+        /// Characters consisting of the whitespace
+        characters: ShortString,
+    },
+}
+
+impl TokenType {
+    /// Returns whether a token can be practically ignored in most cases
+    /// Comments and whitespace will return `true`, everything else will return `false`
+    pub fn is_trivia(&self) -> bool {
+        use TokenType::*;
+        matches!(self, Shebang { .. } | SingleLineComment { .. } | MultiLineComment { .. } | Whitespace { .. })
+    }
+
+    /// Returns the kind of the token type.
+    ///
+    /// ```rust
+    /// use vvs_parser::prelude::ast::*;
+    ///
+    /// assert_eq!(
+    ///     TokenType::Identifier {
+    ///         identifier: ShortString::new("hello")
+    ///     }.kind(),
+    ///     TokenKind::Identifier,
+    /// );
+    /// ```
+    pub fn kind(&self) -> TokenKind {
+        match self {
+            TokenType::Eof => TokenKind::Eof,
+            TokenType::Identifier { .. } => TokenKind::Identifier,
+            TokenType::MultiLineComment { .. } => TokenKind::MultiLineComment,
+            TokenType::Number { .. } => TokenKind::Number,
+            TokenType::Shebang { .. } => TokenKind::Shebang,
+            TokenType::SingleLineComment { .. } => TokenKind::SingleLineComment,
+            TokenType::StringLiteral { .. } => TokenKind::StringLiteral,
+            TokenType::Symbol { .. } => TokenKind::Symbol,
+            TokenType::Whitespace { .. } => TokenKind::Whitespace,
+        }
+    }
+
+    /// Returns a whitespace `TokenType` consisting of spaces
+    pub fn spaces(spaces: usize) -> Self {
+        TokenType::Whitespace { characters: " ".repeat(spaces).into() }
+    }
+
+    /// Returns a whitespace `TokenType` consisting of tabs
+    pub fn tabs(tabs: usize) -> Self {
+        TokenType::Whitespace { characters: "\t".repeat(tabs).into() }
+    }
+
+    /// Try to convert the token into a string slice. If it's not possible returns [None]. In the
+    /// [TokenType::StringLiteral] case, we try to unquote the string.
+    pub fn to_str(&self) -> Option<&str> {
+        use StringLiteralQuoteType::*;
+        match self {
+            TokenType::Identifier { identifier } => Some(identifier),
+            TokenType::StringLiteral { literal, quote_type: Double, .. } => Some(literal.trim_matches('\"').trim()),
+            TokenType::StringLiteral { literal, quote_type: Single, .. } => Some(literal.trim_matches('\'').trim()),
+            TokenType::StringLiteral { literal, quote_type: Brackets, multi_line_depth } => {
+                todo!("use {multi_line_depth} to get ride of the [==[ or the [[ or the [=[ in {literal}")
+            }
+            _ => None,
+        }
+    }
+
+    /// Same as [TokenType::to_str] but panics instead of returning [None].
+    pub fn as_str(&self) -> &str {
+        self.to_str().unwrap()
+    }
+}
+
+impl fmt::Display for TokenType {
+    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            TokenType::Eof => Ok(()),
+            TokenType::Number { text } => text.fmt(formatter),
+            TokenType::Identifier { identifier } => identifier.fmt(formatter),
+            TokenType::MultiLineComment { blocks, comment } => {
+                write!(formatter, "--[{0}[{1}]{0}]", "=".repeat(*blocks), comment)
+            }
+            TokenType::Shebang { line } => line.fmt(formatter),
+            TokenType::SingleLineComment { comment } => write!(formatter, "--{comment}"),
+            TokenType::StringLiteral { literal, multi_line_depth, quote_type } => {
+                if *quote_type == StringLiteralQuoteType::Brackets {
+                    write!(formatter, "[{0}[{1}]{0}]", "=".repeat(*multi_line_depth), literal)
+                } else {
+                    write!(formatter, "{0}{1}{0}", quote_type.to_string(), literal)
+                }
+            }
+            TokenType::Symbol { symbol } => symbol.fmt(formatter),
+            TokenType::Whitespace { characters } => characters.fmt(formatter),
+        }
+    }
+}
+
+/// The kind of token. Contains no additional data.
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+#[non_exhaustive]
+pub enum TokenKind {
+    /// End of file, should always be the very last token
+    Eof,
+
+    /// An identifier, such as `foo`
+    Identifier,
+
+    /// A multi line comment in the format of `--[[ comment ]]`
+    MultiLineComment,
+
+    /// A literal number, such as `3.3`
+    Number,
+
+    /// The shebang line
+    Shebang,
+
+    /// A single line comment, such as `-- comment`
+    SingleLineComment,
+
+    /// A literal string, such as "Hello, world"
+    StringLiteral,
+
+    /// A [`Symbol`], such as `local` or `+`
+    Symbol,
+
+    /// Whitespace, such as tabs or new lines
+    Whitespace,
+}
+
+/// A token such consisting of its [`Position`] and a [`TokenType`]
+#[derive(Clone, Debug, Eq, PartialEq, Display, Deserialize, Serialize)]
+#[display("{token_type}")]
+pub struct Token {
+    pub(crate) start_position: Position,
+    pub(crate) end_position: Position,
+    pub(crate) token_type: TokenType,
+}
+
+impl Token {
+    /// Creates a token with a zero position
+    pub const fn new(token_type: TokenType) -> Token {
+        Token { start_position: Position::new(), end_position: Position::new(), token_type }
+    }
+
+    /// The position a token begins at
+    pub fn start_position(&self) -> Position {
+        self.start_position
+    }
+
+    /// The position a token ends at
+    pub fn end_position(&self) -> Position {
+        self.end_position
+    }
+
+    /// The type of token as well as the data needed to represent it
+    /// If you don't need any other information, use [`token_kind`](Token::token_kind) instead.
+    pub fn token_type(&self) -> &TokenType {
+        &self.token_type
+    }
+
+    /// The kind of token with no additional data.
+    /// If you need any information such as idenitfier names, use [`token_type`](Token::token_type) instead.
+    pub fn token_kind(&self) -> TokenKind {
+        self.token_type().kind()
+    }
+}
+
+impl Ord for Token {
+    fn cmp(&self, other: &Self) -> Ordering {
+        self.start_position().cmp(&other.start_position())
+    }
+}
+
+impl PartialOrd for Token {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl Visit for Token {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_token(self);
+        match self.token_kind() {
+            TokenKind::Eof => {}
+            TokenKind::Identifier => visitor.visit_identifier(self),
+            TokenKind::MultiLineComment => visitor.visit_multi_line_comment(self),
+            TokenKind::Number => visitor.visit_number(self),
+            TokenKind::Shebang => {}
+            TokenKind::SingleLineComment => visitor.visit_single_line_comment(self),
+            TokenKind::StringLiteral => visitor.visit_string_literal(self),
+            TokenKind::Symbol => visitor.visit_symbol(self),
+            TokenKind::Whitespace => visitor.visit_whitespace(self),
+        }
+    }
+}
+
+impl VisitMut for Token {
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self {
+        let token = visitor.visit_token(self);
+        match token.token_kind() {
+            TokenKind::Eof => token,
+            TokenKind::Identifier => visitor.visit_identifier(token),
+            TokenKind::MultiLineComment => visitor.visit_multi_line_comment(token),
+            TokenKind::Number => visitor.visit_number(token),
+            TokenKind::Shebang => token,
+            TokenKind::SingleLineComment => visitor.visit_single_line_comment(token),
+            TokenKind::StringLiteral => visitor.visit_string_literal(token),
+            TokenKind::Symbol => visitor.visit_symbol(token),
+            TokenKind::Whitespace => visitor.visit_whitespace(token),
+        }
+    }
+}
+
+/// A reference to a token used by Ast's.
+/// Dereferences to a [`Token`]
+#[derive(Clone, Debug, Deref, Deserialize, Serialize)]
+pub struct TokenReference {
+    pub(crate) leading_trivia: Vec<Token>,
+    #[deref]
+    pub(crate) token: Token,
+    pub(crate) trailing_trivia: Vec<Token>,
+}
+
+impl TokenReference {
+    /// Creates a TokenReference from leading/trailing trivia as well as the leading token
+    pub const fn new(leading_trivia: Vec<Token>, token: Token, trailing_trivia: Vec<Token>) -> Self {
+        Self { leading_trivia, token, trailing_trivia }
+    }
+
+    /// Returns a symbol with the leading and trailing whitespace
+    /// Only whitespace is supported
+    /// ```rust
+    /// # use vvs_parser::prelude::{ast::*, *};
+    /// # fn main() -> Result<(), Box<TokenizerErrorType>> {
+    /// let symbol = TokenReference::symbol("\nreturn ")?;
+    /// assert_eq!(symbol.leading_trivia().next().unwrap().to_string(), "\n");
+    /// assert_eq!(symbol.token().token_type(), &TokenType::Symbol { symbol: Symbol::Return });
+    /// assert_eq!(symbol.trailing_trivia().next().unwrap().to_string(), " ");
+    /// assert!(TokenReference::symbol("isnt whitespace").is_err());
+    /// assert!(TokenReference::symbol(" notasymbol ").is_err());
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn symbol(text: &str) -> Result<Self, TokenizerErrorType> {
+        let mut lexer = Lexer::new_lazy(text);
+        let mut leading_trivia = Vec::new();
+        let symbol;
+        loop {
+            match lexer.process_next().expect("we shouldn't have hit eof") {
+                LexerResult::Ok(token @ Token { token_type: TokenType::Whitespace { .. }, .. }) => {
+                    leading_trivia.push(token)
+                }
+                LexerResult::Ok(token @ Token { token_type: TokenType::Symbol { .. }, .. }) => {
+                    symbol = token;
+                    break;
+                }
+                LexerResult::Ok(Token { token_type: TokenType::Eof, .. }) => {
+                    return Err(TokenizerErrorType::InvalidSymbol(text.to_owned()))
+                }
+                LexerResult::Ok(token) => {
+                    return Err(TokenizerErrorType::UnexpectedToken(token.to_string().chars().next().unwrap()))
+                }
+                LexerResult::Fatal(mut errors) | LexerResult::Recovered(_, mut errors) => {
+                    return Err(errors.remove(0).error);
+                }
+            }
+        }
+
+        let mut trailing_trivia = Vec::new();
+        loop {
+            match lexer.process_next().expect("we shouldn't have hit eof") {
+                LexerResult::Ok(token @ Token { token_type: TokenType::Whitespace { .. }, .. }) => {
+                    trailing_trivia.push(token);
+                }
+                LexerResult::Ok(Token { token_type: TokenType::Eof, .. }) => break,
+                LexerResult::Ok(token) => {
+                    return Err(TokenizerErrorType::UnexpectedToken(token.to_string().chars().next().unwrap()));
+                }
+                LexerResult::Fatal(mut errors) | LexerResult::Recovered(_, mut errors) => {
+                    return Err(errors.remove(0).error);
+                }
+            }
+        }
+
+        Ok(TokenReference { leading_trivia, token: symbol, trailing_trivia })
+    }
+
+    pub(crate) fn basic_symbol(text: &str) -> Self {
+        TokenReference::symbol(text).unwrap()
+    }
+
+    /// Returns the inner token.
+    pub fn token(&self) -> &Token {
+        &self.token
+    }
+
+    /// Returns the leading trivia
+    pub fn leading_trivia(&self) -> impl Iterator<Item = &Token> {
+        self.leading_trivia.iter()
+    }
+
+    /// Returns the trailing trivia
+    pub fn trailing_trivia(&self) -> impl Iterator<Item = &Token> {
+        self.trailing_trivia.iter()
+    }
+
+    /// Creates a clone of the current TokenReference with the new inner token, preserving trivia.
+    pub fn with_token(&self, token: Token) -> Self {
+        Self { token, leading_trivia: self.leading_trivia.clone(), trailing_trivia: self.trailing_trivia.clone() }
+    }
+
+    /// Checks if the token is the given symbol
+    pub fn is_symbol(&self, symbol: Symbol) -> bool {
+        self.token.token_type() == &TokenType::Symbol { symbol }
+    }
+
+    /// Checks if the token is in the given symbol set
+    pub fn in_symbols(&self, symbols: &[Symbol]) -> bool {
+        symbols.iter().any(|&symbol| self.is_symbol(symbol))
+    }
+
+    /// Checks if the token is of the given kind
+    pub fn is_kind(&self, kind: TokenKind) -> bool {
+        self.token.token_kind() == kind
+    }
+}
+
+impl std::borrow::Borrow<Token> for &TokenReference {
+    fn borrow(&self) -> &Token {
+        self
+    }
+}
+
+impl fmt::Display for TokenReference {
+    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+        for trivia in &self.leading_trivia {
+            trivia.fmt(formatter)?;
+        }
+        self.token.fmt(formatter)?;
+        for trivia in &self.trailing_trivia {
+            trivia.fmt(formatter)?;
+        }
+        Ok(())
+    }
+}
+
+impl From<&TokenReference> for TokenReference {
+    fn from(value: &TokenReference) -> Self {
+        value.clone()
+    }
+}
+
+impl PartialEq<Self> for TokenReference {
+    fn eq(&self, other: &Self) -> bool {
+        (**self).eq(other)
+            && self.leading_trivia == other.leading_trivia
+            && self.trailing_trivia == other.trailing_trivia
+    }
+}
+
+impl Eq for TokenReference {}
+
+impl Ord for TokenReference {
+    fn cmp(&self, other: &Self) -> Ordering {
+        (**self).cmp(&**other)
+    }
+}
+
+impl PartialOrd for TokenReference {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl Visit for TokenReference {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        visitor.visit_token(self);
+        if matches!(self.token().token_kind(), TokenKind::Eof) {
+            visitor.visit_eof(self);
+        }
+        self.leading_trivia.visit(visitor);
+        self.token.visit(visitor);
+        self.trailing_trivia.visit(visitor);
+    }
+}
+
+impl VisitMut for TokenReference {
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self {
+        let mut token_reference = visitor.visit_token_reference(self);
+        if matches!(token_reference.token().token_kind(), TokenKind::Eof) {
+            token_reference = visitor.visit_eof(token_reference);
+        }
+        token_reference.leading_trivia = token_reference.leading_trivia.visit_mut(visitor);
+        token_reference.token = token_reference.token.visit_mut(visitor);
+        token_reference.trailing_trivia = token_reference.trailing_trivia.visit_mut(visitor);
+        token_reference
+    }
+}
+
+/// Used to represent exact positions of tokens in code
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
+pub struct Position {
+    pub(crate) bytes: usize,
+    pub(crate) line: usize,
+    pub(crate) character: usize,
+}
+
+impl Position {
+    /// Create a new default position. Can be called in const context.
+    pub const fn new() -> Self {
+        Self { bytes: 0, line: 0, character: 0 }
+    }
+
+    /// How many bytes, ignoring lines, it would take to find this position
+    pub fn bytes(self) -> usize {
+        self.bytes
+    }
+
+    /// Index of the character on the line for this position
+    pub fn character(self) -> usize {
+        self.character
+    }
+
+    /// Line the position lies on
+    pub fn line(self) -> usize {
+        self.line
+    }
+}
+
+impl Ord for Position {
+    fn cmp(&self, other: &Self) -> Ordering {
+        self.bytes.cmp(&other.bytes)
+    }
+}
+
+impl PartialOrd for Position {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+/// The types of quotes used in a Lua string
+#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
+#[non_exhaustive]
+pub enum StringLiteralQuoteType {
+    /// Strings formatted \[\[with brackets\]\]
+    Brackets,
+
+    /// Strings formatted "with double quotes"
+    Double,
+
+    /// Strings formatted 'with single quotes'
+    Single,
+}
+
+impl fmt::Display for StringLiteralQuoteType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match *self {
+            // Brackets cannot be properly displayed, as not only do they have
+            // variable depth (`=`), but also they don't open the same as
+            // they end, meaning this can't really be used for display purposes.
+            StringLiteralQuoteType::Brackets => Err(fmt::Error),
+            StringLiteralQuoteType::Double => write!(f, "\""),
+            StringLiteralQuoteType::Single => write!(f, "'"),
+        }
+    }
+}
+
+/// Information about an error that occurs while tokenizing
+#[derive(Clone, Debug, PartialEq, Eq, Display, Deserialize, Serialize)]
+#[display("{error} ({}:{} to {}:{})",
+    range.0.line, range.0.character, range.1.line, range.1.character
+)]
+pub struct TokenizerError {
+    /// The type of error
+    pub(crate) error: TokenizerErrorType,
+
+    /// The range of the token that caused the error
+    pub(crate) range: (Position, Position),
+}
+
+impl TokenizerError {
+    /// The type of error
+    pub fn error(&self) -> &TokenizerErrorType {
+        &self.error
+    }
+
+    /// The position of the first token that caused the error
+    pub fn position(&self) -> Position {
+        self.range.0
+    }
+
+    /// The range of the token that caused the error
+    pub fn range(&self) -> (Position, Position) {
+        self.range
+    }
+}
+
+impl std::error::Error for TokenizerError {}
diff --git a/src/Rust/vvs_parser/src/traits.rs b/src/Rust/vvs_parser/src/traits.rs
new file mode 100644
index 00000000..6567e0e1
--- /dev/null
+++ b/src/Rust/vvs_parser/src/traits.rs
@@ -0,0 +1,85 @@
+#![allow(dead_code)]
+
+//! Usefull traits for the vivy parser crate.
+
+use std::borrow::Cow;
+
+/// Extensions for the [Result] enum.
+pub trait ResultExtension<T, E> {
+    /// Inspect the value part of the result and transform it with a callback.
+    fn inspect_mut(self, cb: impl FnOnce(&mut T)) -> Self;
+
+    /// Inspect the error part of the result and transform it with a callback.
+    fn inspect_err_mut(self, cb: impl FnOnce(&mut E)) -> Self;
+}
+
+impl<T, E> ResultExtension<T, E> for Result<T, E> {
+    fn inspect_err_mut(mut self, cb: impl FnOnce(&mut E)) -> Self {
+        if let Err(error) = &mut self {
+            cb(error);
+        }
+        self
+    }
+
+    fn inspect_mut(mut self, cb: impl FnOnce(&mut T)) -> Self {
+        if let Ok(value) = &mut self {
+            cb(value);
+        }
+        self
+    }
+}
+
+/// Extensions for the [Vec] struct.
+pub trait VecExtension<T> {
+    /// Push an item at the end of the vector and returns the result.
+    fn join(self, value: T) -> Self;
+
+    /// Returns the without the elements as selected by the callback.
+    fn without(self, cb: impl FnMut(&T) -> bool) -> Self;
+}
+
+impl<T> VecExtension<T> for Vec<T> {
+    fn join(mut self, value: T) -> Self {
+        self.push(value);
+        self
+    }
+
+    fn without(mut self, cb: impl FnMut(&T) -> bool) -> Self {
+        self.retain(cb);
+        self
+    }
+}
+
+impl<T> VecExtension<T> for std::collections::VecDeque<T> {
+    fn join(mut self, value: T) -> Self {
+        self.push_back(value);
+        self
+    }
+
+    fn without(mut self, cb: impl FnMut(&T) -> bool) -> Self {
+        self.retain(cb);
+        self
+    }
+}
+
+/// Like [Default], but we get a reference to a static instead.
+pub trait DefaultRef {
+    fn default_ref() -> &'static Self;
+}
+
+/// A string that can be lazy.
+pub trait MaybeLazyString {
+    fn to_str(self) -> Cow<'static, str>;
+}
+
+impl MaybeLazyString for &'static str {
+    fn to_str(self) -> Cow<'static, str> {
+        Cow::Borrowed(self)
+    }
+}
+
+impl<F: FnOnce() -> String> MaybeLazyString for F {
+    fn to_str(self) -> Cow<'static, str> {
+        Cow::Owned(self())
+    }
+}
diff --git a/src/Rust/vvs_parser/src/util.rs b/src/Rust/vvs_parser/src/util.rs
new file mode 100644
index 00000000..cb6059f6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/util.rs
@@ -0,0 +1,111 @@
+use crate::{ast::Punctuated, tokenizer::TokenReference};
+use std::{
+    borrow::Borrow,
+    fmt::{Display, Write},
+};
+
+// Check if the vector is empty or full of None's
+#[allow(clippy::ptr_arg)]
+pub fn empty_optional_vector<T>(vec: &Vec<Option<T>>) -> bool {
+    vec.iter().all(Option::is_none)
+}
+
+pub fn display_option<T: Display, O: Borrow<Option<T>>>(option: O) -> String {
+    match option.borrow() {
+        Some(x) => x.to_string(),
+        None => "".to_string(),
+    }
+}
+
+pub fn display_optional_punctuated<T: Display>(pair: &(T, Option<TokenReference>)) -> String {
+    format!("{}{}", pair.0, display_option(&pair.1))
+}
+
+pub fn display_optional_punctuated_vec<T: Display>(vec: &[(T, Option<TokenReference>)]) -> String {
+    let mut string = String::new();
+    for pair in vec {
+        string.push_str(&display_optional_punctuated(pair));
+    }
+    string
+}
+
+pub fn join_vec<T: Display, V: AsRef<[T]>>(vec: V) -> String {
+    let mut string = String::new();
+    for item in vec.as_ref() {
+        string.push_str(&item.to_string());
+    }
+    string
+}
+
+pub fn join_type_specifiers<I: IntoIterator<Item = Option<T2>>, T1: Display, T2: Display>(
+    parameters: &Punctuated<T1>,
+    type_specifiers: I,
+) -> String {
+    let mut string = String::new();
+
+    for (parameter, type_specifier) in parameters
+        .pairs()
+        .zip(type_specifiers.into_iter().chain(std::iter::repeat_with(|| None)))
+    {
+        let _ = write!(
+            string,
+            "{}{}{}",
+            parameter.value(),
+            display_option(type_specifier),
+            display_option(parameter.punctuation())
+        );
+    }
+
+    string
+}
+
+pub fn join_iterators<
+    I1: IntoIterator<Item = Option<T2>>,
+    I2: IntoIterator<Item = Option<T3>>,
+    T1: Display,
+    T2: Display,
+    T3: Display,
+>(
+    parameters: &Punctuated<T1>,
+    first_iterator: I1,
+    second_iterator: I2,
+) -> String {
+    let mut string = String::new();
+
+    for ((name, item1), item2) in parameters
+        .pairs()
+        .zip(first_iterator.into_iter())
+        .zip(second_iterator.into_iter())
+    {
+        let _ = write!(
+            string,
+            "{}{}{}{}",
+            name.value(),
+            display_option(item1),
+            display_option(item2),
+            display_option(name.punctuation())
+        );
+    }
+
+    string
+}
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! has_version {
+    ($lua_state:expr,) => {
+        true
+    };
+
+    ($lua_version:expr, $($version:ident,)+) => {{
+        paste::paste! {
+            let mut version_passes = false;
+            $(
+                if $lua_version.[<has_ $version>]() {
+                    version_passes = true;
+                }
+            )+
+            version_passes
+        }}
+    };
+}
diff --git a/src/Rust/vvs_parser/src/visitors.rs b/src/Rust/vvs_parser/src/visitors.rs
new file mode 100644
index 00000000..45a88c68
--- /dev/null
+++ b/src/Rust/vvs_parser/src/visitors.rs
@@ -0,0 +1,227 @@
+//! Used to create visitors that recurse through [`Ast`](ast::Ast) nodes.
+
+use crate::{
+    ast::*,
+    private::Sealed,
+    tokenizer::{Token, TokenReference},
+};
+
+macro_rules! create_visitor {
+    (ast: {
+        $($visit_name:ident => $ast_type:ident,)+
+    }, token: {
+        $($visit_token:ident,)+
+    }) => {
+        /// A trait that implements functions to listen for specific nodes/tokens.
+        /// Unlike [`VisitorMut`], nodes/tokens passed are immutable.
+        pub trait Visitor {
+            /// Visit the nodes of an [`Ast`](crate::ast::Ast)
+            fn visit_ast(&mut self, ast: &Ast) where Self: Sized {
+                ast.nodes().visit(self);
+                ast.eof().visit(self);
+            }
+
+            paste::item! {
+                $(
+                    #[allow(missing_docs)]
+                    fn $visit_name(&mut self, _node: &$ast_type) { }
+                    #[allow(missing_docs)]
+                    fn [<$visit_name _end>](&mut self, _node: &$ast_type) { }
+                )+
+            }
+
+            $(
+                #[allow(missing_docs)]
+                fn $visit_token(&mut self, _token: &Token) { }
+            )+
+        }
+
+        /// A trait that implements functions to listen for specific nodes/tokens.
+        /// Unlike [`Visitor`], nodes/tokens passed are mutable.
+        pub trait VisitorMut {
+            /// Visit the nodes of an [`Ast`](crate::ast::Ast)
+            fn visit_ast(&mut self, ast: Ast) -> Ast where Self: Sized {
+                // TODO: Visit tokens?
+                let eof = ast.eof().to_owned();
+                let nodes = ast.nodes.visit_mut(self);
+
+                Ast {
+                    nodes,
+                    // Everything gets cloned with this visitor, so there's no original tokens
+                    eof: self.visit_eof(eof),
+                }
+            }
+
+            paste::item! { $(
+                #[allow(missing_docs)]
+                fn $visit_name(&mut self, node: $ast_type) -> $ast_type {
+                    node
+                }
+
+                #[allow(missing_docs)]
+                fn [<$visit_name _end>](&mut self, node: $ast_type) -> $ast_type {
+                    node
+                }
+            )+ }
+
+            $(
+                #[allow(missing_docs)]
+                fn $visit_token(&mut self, token: Token) -> Token {
+                    token
+                }
+            )+
+        }
+    };
+}
+
+#[doc(hidden)]
+pub trait Visit: Sealed {
+    fn visit<V: Visitor>(&self, visitor: &mut V);
+}
+
+#[doc(hidden)]
+pub trait VisitMut: Sealed
+where
+    Self: Sized,
+{
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self;
+}
+
+impl<T: Visit> Visit for &T {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        (**self).visit(visitor);
+    }
+}
+
+impl<T: Visit> Visit for &mut T {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        (**self).visit(visitor);
+    }
+}
+
+impl<T: Visit> Visit for Vec<T> {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        for item in self {
+            item.visit(visitor);
+        }
+    }
+}
+
+impl<T: VisitMut> VisitMut for Vec<T> {
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self {
+        self.into_iter().map(|item| item.visit_mut(visitor)).collect()
+    }
+}
+
+impl<T: Visit> Visit for Option<T> {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        if let Some(item) = self {
+            item.visit(visitor);
+        }
+    }
+}
+
+impl<T: VisitMut> VisitMut for Option<T> {
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self {
+        self.map(|item| item.visit_mut(visitor))
+    }
+}
+
+impl<A: Visit, B: Visit> Visit for (A, B) {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        self.0.visit(visitor);
+        self.1.visit(visitor);
+    }
+}
+
+impl<A: VisitMut, B: VisitMut> VisitMut for (A, B) {
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self {
+        (self.0.visit_mut(visitor), self.1.visit_mut(visitor))
+    }
+}
+
+impl<T: Visit> Visit for Box<T> {
+    fn visit<V: Visitor>(&self, visitor: &mut V) {
+        (**self).visit(visitor);
+    }
+}
+
+impl<T: VisitMut> VisitMut for Box<T> {
+    fn visit_mut<V: VisitorMut>(self, visitor: &mut V) -> Self {
+        Box::new((*self).visit_mut(visitor))
+    }
+}
+
+create_visitor!(ast: {
+    visit_anonymous_call => FunctionArgs,
+    visit_assignment => Assignment,
+    visit_block => Block,
+    visit_call => Call,
+    visit_contained_span => ContainedSpan,
+    visit_do => Do,
+    visit_else_if => ElseIf,
+    visit_eof => TokenReference,
+    visit_expression => Expression,
+    visit_field => Field,
+    visit_function_args => FunctionArgs,
+    visit_function_body => FunctionBody,
+    visit_function_call => FunctionCall,
+    visit_function_declaration => FunctionDeclaration,
+    visit_function_name => FunctionName,
+    visit_generic_for => GenericFor,
+    visit_if => If,
+    visit_index => Index,
+    visit_local_assignment => LocalAssignment,
+    visit_local_function => LocalFunction,
+    visit_last_stmt => LastStmt,
+    visit_method_call => MethodCall,
+    visit_numeric_for => NumericFor,
+    visit_parameter => Parameter,
+    visit_prefix => Prefix,
+    visit_return => Return,
+    visit_repeat => Repeat,
+    visit_stmt => Stmt,
+    visit_suffix => Suffix,
+    visit_table_constructor => TableConstructor,
+    visit_token_reference => TokenReference,
+    visit_un_op => UnOp,
+    visit_var => Var,
+    visit_var_expression => VarExpression,
+    visit_while => While,
+    visit_compound_assignment => CompoundAssignment,
+    visit_compound_op => CompoundOp,
+    visit_else_if_expression => ElseIfExpression,
+    visit_if_expression => IfExpression,
+
+    // Types
+    visit_type_argument => TypeArgument,
+    visit_type_assertion => TypeAssertion,
+    visit_type_declaration => TypeDeclaration,
+    visit_type_field => TypeField,
+    visit_type_field_key => TypeFieldKey,
+    visit_type_info => TypeInfo,
+    visit_type_specifier => TypeSpecifier,
+
+    // Lua >=5.2
+    visit_attribute => Attribute,
+
+    // Vivy
+    visit_main => Main,
+    visit_write => Write,
+    visit_yield => Yield,
+    visit_import => Import,
+    visit_call_list => CallList,
+    visit_option_decl => OptionDecl,
+    visit_call_list_item => CallListItem,
+    visit_main_assignement => MainAssignement,
+}, token: {
+    visit_identifier,
+    visit_multi_line_comment,
+    visit_number,
+    visit_single_line_comment,
+    visit_string_literal,
+    visit_symbol,
+    visit_token,
+    visit_whitespace,
+    visit_interpolated_string_segment,
+});
diff --git a/src/Rust/vvs_parser/src/vivy/error_report.rs b/src/Rust/vvs_parser/src/vivy/error_report.rs
new file mode 100644
index 00000000..1ddc23d0
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/error_report.rs
@@ -0,0 +1,126 @@
+use crate::Error;
+use codespan_reporting::{
+    diagnostic::{Diagnostic, Label},
+    files::SimpleFiles,
+    term::{Chars, DisplayStyle},
+};
+use derive_more::Display;
+use hashbrown::HashMap;
+use std::{mem, str};
+use termcolor::ColorChoice;
+
+/// Utility to report error to the user.
+pub struct ErrorReport<'a> {
+    /// The list of parsed files.
+    files: SimpleFiles<&'a str, &'a str>,
+
+    /// We cache the ID, so that we can call the [ErrorReport::add_error] and
+    /// [ErrorReport::add_warning] multiple times on the same file.
+    id_cache: HashMap<&'a str, usize>,
+
+    /// The list of [Error], can be errors or warnings depending on their [ErrorReportType].
+    messages: HashMap<usize, Vec<(ErrorReportType, Error)>>,
+}
+
+#[derive(Clone, Copy, PartialEq, Eq, Display)]
+enum ErrorReportType {
+    #[display("error")]
+    Error,
+
+    #[display("warning")]
+    Warning,
+}
+
+impl<'a> ErrorReport<'a> {
+    /// Create a new error report.
+    pub fn new() -> Self {
+        Default::default()
+    }
+
+    fn add<I, T>(&mut self, name: &'a str, src: &'a str, ty: ErrorReportType, iter: I) -> &mut Self
+    where
+        I: IntoIterator<Item = T>,
+        T: Into<Error>,
+    {
+        let file_id = self.id_cache.entry(name).or_insert_with(|| self.files.add(name, src));
+        self.messages
+            .entry(*file_id)
+            .or_default()
+            .extend(iter.into_iter().map(|error| (ty, error.into())));
+        self
+    }
+
+    /// Add errors to the report.
+    pub fn add_errors<I, T>(&mut self, name: &'a str, source: &'a str, errors: I) -> &mut Self
+    where
+        I: IntoIterator<Item = T>,
+        T: Into<Error>,
+    {
+        self.add(name, source, ErrorReportType::Error, errors)
+    }
+
+    /// Add warnings to the report.
+    pub fn add_warnings<I, T>(&mut self, name: &'a str, source: &'a str, errors: I) -> &mut Self
+    where
+        I: IntoIterator<Item = T>,
+        T: Into<Error>,
+    {
+        self.add(name, source, ErrorReportType::Warning, errors)
+    }
+
+    /// Report all the stored errors. Returns true if the report contained any error. Return false
+    /// if the report was empty or contained only warnings. Note that this operation will empty the
+    /// report struct.
+    pub fn report(&mut self) -> bool {
+        if self.messages.is_empty() {
+            return false;
+        }
+
+        let Self { files, messages, .. } = mem::take(self);
+        let mut output = termcolor::StandardStream::stdout(ColorChoice::Auto);
+        let config = codespan_reporting::term::Config {
+            display_style: DisplayStyle::Rich,
+            chars: Chars::box_drawing(),
+            ..Default::default()
+        };
+
+        messages.into_iter().fold(false, |acc, (file_id, messages)| {
+            messages.iter().fold(false, |acc, (report_type, message)| {
+                let diagnostic = match report_type {
+                    ErrorReportType::Error => Diagnostic::error(),
+                    ErrorReportType::Warning => Diagnostic::warning(),
+                }
+                .with_message(message.error_message())
+                .with_code(message.error_code())
+                .with_labels(vec![Label::primary(file_id, message.byte_range())]);
+
+                codespan_reporting::term::emit(&mut output, &config, &files, &diagnostic).is_err()
+                    || (*report_type == ErrorReportType::Error || acc)
+            }) || acc
+        })
+    }
+
+    /// Report all stored errors and warnings, but don't say if any error was actually reported.
+    /// Like [ErrorReport::report], this operation will empty the report.
+    pub fn report_and_ignore(&mut self) {
+        self.report();
+    }
+}
+
+impl ErrorReport<'_> {
+    /// Reports a single error
+    pub fn error(name: &'_ str, source: &'_ str, error: impl Into<Error>) {
+        ErrorReport::new().add_errors(name, source, [error.into()]).report();
+    }
+
+    /// Reports a single warning
+    pub fn warning(name: &'_ str, source: &'_ str, warning: impl Into<Error>) {
+        ErrorReport::new().add_warnings(name, source, [warning.into()]).report();
+    }
+}
+
+impl<'a> Default for ErrorReport<'a> {
+    fn default() -> Self {
+        Self { files: SimpleFiles::new(), messages: Default::default(), id_cache: Default::default() }
+    }
+}
diff --git a/src/Rust/vvs_parser/src/vivy/frontend_pipeline.rs b/src/Rust/vvs_parser/src/vivy/frontend_pipeline.rs
new file mode 100644
index 00000000..53bc5d77
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/frontend_pipeline.rs
@@ -0,0 +1,327 @@
+//! Contains the main code for the compiler. The compiler parses and do checks on the code, do some
+//! optimisations and then returns the [ast::Ast] if no errors where found.
+
+use crate::{
+    ast::*,
+    tokenizer::TokenReference,
+    traits::VecExtension as _,
+    vivy::{
+        error_report::ErrorReport,
+        library::Library,
+        passes::*,
+        search_path::{SearchPath, DEFAULT_SEARCH_PATH},
+        symbol_table::SymbolTable,
+        *,
+    },
+    ShortString,
+};
+use derive_more::Display;
+use hashbrown::{HashMap, HashSet};
+use std::{borrow::Cow, cell::RefCell, fmt, fs, mem, path::Path, rc::Rc};
+
+/// Process a program.
+pub struct FrontendPipeline<'a> {
+    /// Options from a possibly passed file to the compiler.
+    options: Option<Rc<OptionTable>>,
+
+    /// The content of the program / main module.
+    program: Cow<'a, str>,
+
+    /// List of imported modules.
+    imports: HashMap<ShortString, Rc<(Ast, Cow<'static, str>)>>,
+
+    /// List of imported symbol tables.
+    symbols: Vec<Rc<SymbolTable<'a, TypeInfo>>>,
+
+    /// The search path.
+    search: &'a SearchPath,
+
+    /// Is the current module being compiled the main module?
+    is_main: bool,
+
+    /// The include path, upper in the vector is the modules importing the ones down in the vector.
+    process_path: Vec<ShortString>,
+
+    /// The library of available types.
+    library: Rc<RefCell<Library>>,
+
+    /// List of user defined passes. Will be run in order after we are done with our own passes.
+    passes: &'a [&'a dyn UserFrontendPass],
+}
+
+/// Record of all the options defined, unused, setted in the program.
+pub struct OptionsRecord {
+    /// List of all unused declared options.
+    unused_options: Vec<(ShortString, ShortString)>,
+
+    /// All setted options.
+    setted_options: Vec<(ShortString, ShortString, Expression)>,
+
+    /// All declared options.
+    declared_options: Vec<(ShortString, ShortString, Expression)>,
+}
+
+impl fmt::Display for OptionsRecord {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let Self { setted_options, .. } = self;
+        match setted_options.iter().map(|(a, b, _)| a.len() + b.len()).max() {
+            None | Some(0) => Ok(()),
+            Some(len) => setted_options.iter().try_for_each(|(module, name, expression)| {
+                writeln!(f, "{module}.{name: >len$} {expression}", len = len - module.len())
+            }),
+        }
+    }
+}
+
+/// Result of the front-end. Don't show that directly to the user, will show [FrontendOutput].
+struct CompilerResult {
+    /// The [Ast] of the main program's module.
+    ast: Ast,
+
+    /// List of all imported modules' [Ast]
+    imports: HashMap<ShortString, Rc<(Ast, Cow<'static, str>)>>,
+
+    /// The main program.
+    main: MainProgram,
+
+    /// Record of all options in the program.
+    options: OptionsRecord,
+
+    /// All the defined types.
+    library: Rc<RefCell<Library>>,
+}
+
+/// The result of the frontend.
+pub struct FrontendOutput {
+    /// The [Ast] of the main program's module.
+    pub ast: Ast,
+
+    /// List of all imported modules' [Ast]
+    pub imports: HashMap<ShortString, Ast>,
+
+    /// The main program.
+    pub main: MainProgram,
+
+    /// Record of all options in the program.
+    pub options: OptionsRecord,
+
+    /// All the defined types.
+    pub library: Library,
+}
+
+impl From<CompilerResult> for FrontendOutput {
+    fn from(value: CompilerResult) -> Self {
+        let CompilerResult { ast, imports, main, options, library } = value;
+        let library = RefCell::into_inner(Rc::into_inner(library).expect("unique owner"));
+        let imports = HashMap::from_iter(
+            imports
+                .into_iter()
+                .map(|(module, ptr)| (module, Rc::into_inner(ptr).expect("unique owner").0)),
+        );
+        Self { ast, main, options, imports, library }
+    }
+}
+
+impl fmt::Display for FrontendOutput {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let Self { imports, main, options, library, .. } = self;
+        write!(f, "imported modules: ")?;
+        imports.keys().try_for_each(|module| write!(f, "{module} "))?;
+        writeln!(f)?;
+
+        writeln!(f, "{options}")?;
+        writeln!(f, "{library}")?;
+        writeln!(f, "{main:#?}")
+    }
+}
+
+/// Tells if the frontend failed or not.
+#[derive(Debug, Display, Clone, Copy)]
+#[display("frontend error")]
+pub struct FrontendError;
+
+impl std::error::Error for FrontendError {}
+
+impl From<()> for FrontendError {
+    fn from(_: ()) -> Self {
+        Self {}
+    }
+}
+
+#[derive(Default)]
+struct ImportAllResult {
+    declared_options: Vec<(ShortString, ShortString, Expression)>,
+    unused: Vec<(ShortString, ShortString)>,
+}
+
+impl FromIterator<ImportAllResult> for ImportAllResult {
+    fn from_iter<T: IntoIterator<Item = ImportAllResult>>(iter: T) -> Self {
+        let mut iter = iter.into_iter();
+        let Some(ret) = iter.next() else {
+            return Default::default();
+        };
+        iter.fold(ret, |mut ret, item| {
+            let Self { mut declared_options, unused } = item;
+            ret.declared_options.append(&mut declared_options);
+            ret.unused.retain(|option| unused.contains(option));
+            ret
+        })
+    }
+}
+
+impl<'a> FrontendPipeline<'a> {
+    /// Create a new pipeline to parse, to check and do black magic.
+    pub fn new(SourceCode { name, code }: &'a SourceCode) -> Self {
+        Self {
+            program: Cow::Borrowed(code.as_ref()),
+            options: None,
+            imports: Default::default(),
+            symbols: vec![],
+            is_main: true,
+            search: &DEFAULT_SEARCH_PATH,
+            process_path: vec![ShortString::new(name.as_ref())],
+            library: Rc::new(RefCell::new(Library::default())),
+            passes: &[],
+        }
+    }
+
+    /// Add passes to do for each module at the end of mendatory passes.
+    pub fn passes(self, passes: &'a [&'a dyn UserFrontendPass]) -> Self {
+        Self { passes, ..self }
+    }
+
+    /// Get the name of the module we are compiling here. We should always have a name, if we parse
+    /// the stdin we still have a name for the module: stdin...
+    pub fn name(&self) -> &ShortString {
+        self.process_path.last().expect("module name")
+    }
+
+    /// Set the option file to use for this instance of the program.
+    pub fn options(self, options: Option<impl AsRef<Path>>) -> Result<Self, FrontendError> {
+        let Some(options) = options else { return Ok(self) };
+        let options = options.as_ref();
+
+        let name = options
+            .file_name()
+            .ok_or_else(|| log::error!("expected a file with an actual name"))?
+            .to_str()
+            .ok_or_else(|| log::error!("expected files with utf8 names"))?;
+
+        let code = fs::read_to_string(options)
+            .map_err(|err| log::error!("failed to read option file '{}': {err}", options.display()))?;
+
+        Ok(crate::ast::OptionTableResult::parse_fallible(&code)
+            .into_result()
+            .map(|options| Self { options: Some(Rc::new(options)), ..self })
+            .map_err(|errors| ErrorReport::new().add_errors(name, &code, errors).report_and_ignore())?)
+    }
+
+    /// Set the [SearchPath] to use for this instance of the program.
+    pub fn search(self, search: &'a SearchPath) -> Self {
+        Self { search, ..self }
+    }
+
+    /// Import all modules from the given list and add them to the current pipeline.
+    fn import_all(&mut self, import_list: Vec<TokenReference>) -> Result<ImportAllResult, FrontendError> {
+        Iterator::collect(import_list.into_iter().map(|import| {
+            let name = import.token_type().as_str();
+            if self.imports.contains_key(name) {
+                return Ok(ImportAllResult::default());
+            } else if self.process_path.iter().any(|path| path.as_str() == name) {
+                ErrorReport::error(
+                    self.name(),
+                    &self.program,
+                    AstError::from_parts(import.clone(), "recursive indlude of module"),
+                );
+                return Err(FrontendError);
+            }
+
+            let program = self.search.resolve(name).ok_or_else(|| {
+                ErrorReport::error(
+                    self.name(),
+                    &self.program,
+                    AstError::from_parts(import.clone(), "failed to find the module to import"),
+                )
+            })?;
+
+            let CompilerResult {
+                ast, imports, options: OptionsRecord { unused_options, declared_options, .. }, ..
+            } = FrontendPipeline {
+                process_path: self.process_path.clone().join(ShortString::new(name)),
+                imports: mem::take(&mut self.imports), // Will be replaced.
+                program: match program {
+                    Cow::Borrowed(program) => Cow::Borrowed(program),
+                    Cow::Owned(ref program) => Cow::Borrowed(program.as_str()),
+                },
+                options: self.options.clone(),
+                symbols: self.symbols.clone(),
+                library: self.library.clone(),
+                is_main: false,
+                ..*self
+            }
+            .process()?;
+
+            debug_assert!({
+                let prev = HashSet::<&ShortString>::from_iter(self.imports.keys());
+                let news = HashSet::<&ShortString>::from_iter(imports.keys());
+                (prev.len() <= news.len()) && (prev.intersection(&news).count() == prev.len())
+            });
+            let _ = mem::replace(&mut self.imports, imports); // Replace with a more complete import list.
+            self.imports.insert(ShortString::new(name), Rc::new((ast, program)));
+
+            Ok(ImportAllResult { declared_options, unused: unused_options })
+        }))
+    }
+
+    /// Process the pipeline. Some returned values may be hidden from the user, or things
+    /// transformed a but more for the main result, but here we keep them.
+    fn process(mut self) -> Result<CompilerResult, FrontendError> {
+        let ast = AstResult::parse_fallible(&self.program).into_result().map_err(|err| {
+            let _ = ErrorReport::new().add_errors(self.name(), &self.program, err).report();
+        })?;
+
+        let (ast, StmtCheckerResult { decl_opts, setd_opts, main, imported }) =
+            StmtChecker::new(ast, (self.name().as_str(), self.program.as_ref()))
+                .is_main(self.is_main)
+                .process()?;
+        let ImportAllResult { mut declared_options, unused } = self.import_all(imported)?;
+
+        declared_options.extend(
+            decl_opts
+                .into_iter()
+                .map(|(name, value)| (self.name().clone(), name, value.into())),
+        );
+
+        let symbols = SymbolTable::new(&ast, self.options.as_deref())
+            .import(self.symbols.iter().map(Rc::as_ref))
+            .take();
+
+        let loc = (self.name().as_str(), self.program.as_ref());
+        let (ast, _) = TypeCollector::new(ast, loc, &mut self.library.borrow_mut()).process()?;
+        let (ast, _) = TypeChecker::new(ast, loc, &self.library.borrow(), symbols.sub_scope()).process()?;
+        let (ast, OptsTransformResult { unused }) = match self.options.clone() {
+            None => (ast, Default::default()),
+            Some(options) => {
+                let (ast, results) = OptsTransform::new(ast, loc, &options).process()?;
+                (ast, OptsTransformResult { unused: results.unused.without(|opt| unused.contains(opt)) })
+            }
+        };
+
+        Ok(CompilerResult {
+            ast: self.passes.iter().try_fold(ast, |prog, pass| {
+                log::debug!("apply pass {} on module {}", pass.name(), self.name());
+                pass.process(prog, self.name(), self.program.as_ref())
+            })?,
+            imports: self.imports,
+            options: OptionsRecord { declared_options, setted_options: setd_opts, unused_options: unused },
+            library: self.library.clone(),
+            main: main.unwrap_or_default(),
+        })
+    }
+
+    /// Process the pipeline. Returns the [Ast] or an error. Note that if an error occured, they
+    /// will be printed out to the terminal.
+    pub fn run(self) -> Result<FrontendOutput, FrontendError> {
+        self.process().map(Into::into)
+    }
+}
diff --git a/src/Rust/vvs_parser/src/vivy/library.rs b/src/Rust/vvs_parser/src/vivy/library.rs
new file mode 100644
index 00000000..95d15e5f
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/library.rs
@@ -0,0 +1,333 @@
+//! Store informations about methods and fields for types.
+
+use crate::{ast::TypeInfo, ShortString};
+use derive_more::{Display, IntoIterator, IsVariant};
+use hashbrown::HashMap;
+use std::{fmt, sync::LazyLock};
+
+/// Tells whether a field is mutable or constant.
+#[derive(PartialEq, Eq, Clone, Copy, Debug, IsVariant)]
+pub enum FieldMutability {
+    /// The field can be mutated by a user.
+    Mutable,
+
+    /// The field can't be mutated by a user and can represent an internal variant of the variable.
+    Constant,
+}
+
+/// Informations about a field of a [TypeRecord].
+#[derive(PartialEq, Clone, Copy)]
+pub struct TypeRecordField<'a>(pub FieldMutability, pub &'a TypeInfo);
+
+/// Informations about a method of a [TypeRecord].
+#[derive(PartialEq, Clone, Copy)]
+pub struct TypeRecordMethod<'a>(pub &'a [TypeInfo], pub &'a TypeInfo, pub bool);
+
+impl TypeRecordMethod<'_> {
+    /// Tells whether the method is really a method or just a free function.
+    pub fn is_method(&self) -> bool {
+        let TypeRecordMethod(_, _, is_method) = self;
+        *is_method
+    }
+}
+
+/// A record stores informations about a type, the fields and the methods.
+#[derive(Clone)]
+pub struct TypeRecord {
+    type_info: TypeInfo,
+    is_std: bool,
+    fields: HashMap<ShortString, (FieldMutability, TypeInfo)>,
+    methods: HashMap<ShortString, (Vec<TypeInfo>, TypeInfo)>,
+}
+
+static STANDARD_RECORDS: LazyLock<Vec<TypeRecord>> = LazyLock::new(|| {
+    macro_rules! records {
+        ($( struct $ty: ident $struct: tt impl $methods: tt )*) => { Vec::from_iter([$(records!(@ $ty $struct $methods)),*]) };
+        (@ $type: ident $fields: tt { $($(fn $method: ident ($($arg: ident),*) -> $ret: ident;)+)? }) => {
+            std::mem::take(records!(@ TypeRecord::new_std(TypeInfo::$type().clone()), $fields)
+                $(.with_methods([
+                    $((ShortString::new(stringify!($method)), vec![$(TypeInfo::$arg().clone()),*], TypeInfo::$ret().clone())),*
+                ]))?
+            )
+        };
+        (@ $a: expr, const $f: ident : $fty: ident ) => { $a.with_field(stringify!($f).into(), FieldMutability::Constant, TypeInfo::$fty().clone()) };
+        (@ $a: expr, mut   $f: ident : $fty: ident ) => { $a.with_field(stringify!($f).into(), FieldMutability::Mutable,  TypeInfo::$fty().clone()) };
+        (@ $acc: expr, {}) => { $acc };
+        (@ $acc: expr, { $v: tt $f: ident : $fty: ident $(, $vs: tt $fs: ident : $ftys: ident)* $(,)? }) => {
+            records!(@ records!(@ $acc, $v $f: $fty), { $($vs $fs: $ftys),* })
+        };
+    }
+
+    records! {
+        struct number {} impl {
+            fn is_nan()   -> number;
+            fn is_zero()  -> number;
+            fn is_true()  -> number;
+            fn is_false() -> number;
+            fn floor()    -> number;
+            fn ceil()     -> number;
+        }
+
+        struct string {} impl {
+            fn new() -> string;
+            fn put(char) -> string;
+            fn append(string) -> string;
+
+            fn len() -> number;
+            fn get(number) -> char;
+
+            fn is_lowercase() -> number;
+            fn is_uppercase() -> number;
+            fn to_lowercase() -> string;
+            fn to_uppercase() -> string;
+        }
+
+        struct char {} impl {
+            fn is_lowercase() -> number;
+            fn is_uppercase() -> number;
+            fn to_lowercase() -> char;
+            fn to_uppercase() -> char;
+        }
+
+        struct table {} impl {
+            fn new() -> table;
+            fn len() -> number;
+            fn get(any) -> any;
+            fn set(any, any) -> nil;
+        }
+
+        struct any {} impl {
+            fn new() -> any;
+
+            fn to_string() -> string;
+            fn to_number() -> number;
+            fn to_table()  -> table;
+        }
+
+        struct line {
+            const index: number, // Index of the line in the original document.
+            mut   start: number, // Start time of the line.
+            mut   end:   number, // End time of the line.
+        } impl {
+            fn len() -> number;
+            fn syllabe(number) -> syllabe;
+            fn syllabes()      -> syllabes;
+        }
+
+        struct lines {} impl {
+            fn len() -> number;
+            fn line(number) -> line;
+            fn syllabes()   -> syllabes;
+        }
+
+        struct syllabes {} impl {
+            fn len() -> number;
+            fn syllabe(number) -> syllabe;
+        }
+
+        struct syllabe {
+            const index: number, // Index in the parent line.
+            mut   start: number, // Start time of the syllabe.
+            mut   end:   number, // End time of the syllabe.
+        } impl {
+            fn len() -> number;
+            fn text() -> string;
+            fn get(number) -> char;
+        }
+    }
+});
+
+impl TypeRecord {
+    /// Create a new type record.
+    pub fn new(type_info: TypeInfo) -> Self {
+        Self { type_info, is_std: false, ..Default::default() }
+    }
+
+    /// Create a new standard type record.
+    fn new_std(type_info: TypeInfo) -> Self {
+        Self { type_info, is_std: true, ..Default::default() }
+    }
+
+    /// Add or override a field in the record.
+    pub fn with_field(&mut self, field: ShortString, mutability: FieldMutability, type_info: TypeInfo) -> &mut Self {
+        self.fields.insert(field, (mutability, type_info));
+        self
+    }
+
+    /// Add or override a method in the record.
+    pub fn with_method(&mut self, method: ShortString, arguments: Vec<TypeInfo>, returns: TypeInfo) -> &mut Self {
+        self.methods.insert(method, (arguments, returns));
+        self
+    }
+
+    /// Add or override fields in the record.
+    pub fn with_fields(
+        &mut self,
+        iter: impl IntoIterator<Item = (ShortString, FieldMutability, TypeInfo)>,
+    ) -> &mut Self {
+        iter.into_iter().fold(self, |s, (k, m, t)| s.with_field(k, m, t))
+    }
+
+    /// Add or override methods in the record.
+    pub fn with_methods(
+        &mut self,
+        iter: impl IntoIterator<Item = (ShortString, Vec<TypeInfo>, TypeInfo)>,
+    ) -> &mut Self {
+        iter.into_iter().fold(self, |s, (k, m, t)| s.with_method(k, m, t))
+    }
+
+    /// Get the fields of instances of this type.
+    pub fn fields(&self) -> impl Iterator<Item = (&ShortString, TypeRecordField)> {
+        self.fields
+            .iter()
+            .map(|(field, (mutability, type_info))| (field, TypeRecordField(*mutability, type_info)))
+    }
+
+    /// Get the methods of instances of this type.
+    pub fn methods(&self) -> impl Iterator<Item = (&ShortString, TypeRecordMethod)> {
+        self.methods.iter().map(|(method, (args, returns))| {
+            (method, TypeRecordMethod(args, returns, args.first().map(|_| todo!()).unwrap_or_default()))
+        })
+    }
+
+    /// Get a field's informations if it exists, otherwise get [None].
+    pub fn field(&self, field: impl AsRef<str>) -> Option<TypeRecordField> {
+        self.fields
+            .get(field.as_ref())
+            .map(|(mutability, type_info)| TypeRecordField(*mutability, type_info))
+    }
+
+    /// Get a method's informations if it exists, otherwise get [None].
+    pub fn method(&self, method: impl AsRef<str>) -> Option<TypeRecordMethod> {
+        self.methods
+            .get(method.as_ref())
+            .map(|(args, returns)| TypeRecordMethod(args, returns, args.first().map(|_| todo!()).unwrap_or_default()))
+    }
+
+    /// Get the [TypeInfo] of this record.
+    pub fn type_info(&self) -> &TypeInfo {
+        &self.type_info
+    }
+}
+
+impl Default for TypeRecord {
+    fn default() -> Self {
+        Self { is_std: true, type_info: Default::default(), fields: Default::default(), methods: Default::default() }
+    }
+}
+
+impl fmt::Display for TypeRecord {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let this = self.type_info();
+        let std_comment = match self.is_std {
+            true => "--[[ std! ]]",
+            false => "",
+        };
+        writeln!(f, "struct {std_comment} {this} {{")?;
+        self.fields()
+            .try_for_each(|(name, TypeRecordField(mutability, type_info))| {
+                let mutability = (mutability == FieldMutability::Mutable)
+                    .then_some("mut ")
+                    .unwrap_or_default();
+                writeln!(f, "\t{mutability} {name}: {type_info},")
+            })?;
+        writeln!(f, "}}")?;
+
+        self.methods()
+            .try_for_each(|(name, func @ TypeRecordMethod(args, ret, ..))| {
+                write!(f, "function {this}:{name}(")?;
+                if func.is_method() && !args.is_empty() {
+                    write!(f, "{this},")?;
+                } else if func.is_method() {
+                    write!(f, "{this}")?;
+                }
+                args.iter().enumerate().try_for_each(|(idx, arg)| match idx {
+                    0 => write!(f, "{arg}"),
+                    _ => write!(f, ", {arg}"),
+                })?;
+                writeln!(f, ") -> {ret};")
+            })
+    }
+}
+
+/// Stores all the knowned [TypeRecord] for a program. Can differentiate between standard type
+/// records and users' type records.
+#[derive(IntoIterator)]
+pub struct Library(Vec<TypeRecord>);
+
+impl Library {
+    /// Create a new library.
+    pub fn new() -> Self {
+        Self::from_iter(STANDARD_RECORDS.iter())
+    }
+
+    /// Iterate throu the records.
+    pub fn iter(&self) -> impl Iterator<Item = &TypeRecord> {
+        self.0.iter()
+    }
+
+    /// Iterate throu the records in a mutable way. Not that you can only mutate non-standard
+    /// types' record.
+    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut TypeRecord> {
+        self.0.iter_mut().filter(|TypeRecord { is_std, .. }| !*is_std)
+    }
+
+    /// Tells wether a specific record for a type name is present or not.
+    pub fn has(&self, name: impl AsRef<str>) -> bool {
+        self.get(name).is_some()
+    }
+
+    /// Get the record for a type name, if not present returns a newly created record.
+    pub fn get(&self, name: impl AsRef<str>) -> Option<&TypeRecord> {
+        self.iter().find(|TypeRecord { type_info, .. }| match type_info {
+            TypeInfo::Basic(type_info) => type_info.token_type().as_str() == name.as_ref(),
+            _ => false,
+        })
+    }
+
+    /// Get the record for a type name in a mutable way, if not present returns [None]. If the
+    /// record is from standard type, also returns [None].
+    pub fn get_mut(&mut self, name: impl AsRef<str>) -> Option<&mut TypeRecord> {
+        self.iter_mut().find(|TypeRecord { type_info, .. }| match type_info {
+            TypeInfo::Basic(type_info) => type_info.token_type().as_str() == name.as_ref(),
+            _ => false,
+        })
+    }
+
+    /// Set a type record for a type. If the record is already present, replace it. If the already
+    /// present record is of a standard type, it won't be replaced.
+    pub fn put(&mut self, record: TypeRecord) {
+        let find = |(idx, TypeRecord { type_info, is_std, .. }): (_, &_)| {
+            (*type_info == record.type_info).then_some((idx, *is_std))
+        };
+        match self.0.iter().enumerate().find_map(find) {
+            Some((_, true)) => {}
+            Some((idx, false)) => self.0[idx] = record,
+            None => self.0.push(record),
+        }
+    }
+}
+
+impl FromIterator<TypeRecord> for Library {
+    fn from_iter<T: IntoIterator<Item = TypeRecord>>(iter: T) -> Self {
+        Self(iter.into_iter().collect())
+    }
+}
+
+impl<'a> FromIterator<&'a TypeRecord> for Library {
+    fn from_iter<T: IntoIterator<Item = &'a TypeRecord>>(iter: T) -> Self {
+        Self(iter.into_iter().cloned().collect())
+    }
+}
+
+impl Default for Library {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+impl fmt::Display for Library {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        self.iter().try_for_each(|record| write!(f, "{record}"))
+    }
+}
diff --git a/src/Rust/vvs_parser/src/vivy/main_program.rs b/src/Rust/vvs_parser/src/vivy/main_program.rs
new file mode 100644
index 00000000..54ddd090
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/main_program.rs
@@ -0,0 +1,120 @@
+//! Main program and utilities to be able to complete the work.
+
+use crate::{ast::Expression, ShortString};
+use derive_more::{IntoIterator, IsVariant};
+
+/// The main program to execute in the parsed script.
+#[derive(Default, Debug)]
+pub struct MainProgram {
+    /// The initial variable name of the read ASS file.
+    pub initial: ShortString,
+
+    /// Steps to do, in order, to make the program progress.
+    pub steps: Vec<MainProgramStep>,
+
+    /// The variables to write at the end of the program.
+    pub returns: MainProgramReturns,
+}
+
+impl MainProgram {
+    /// Set the initial variable name.
+    pub fn with_initial(self, initial: ShortString) -> Self {
+        Self { initial, ..self }
+    }
+
+    /// Set the steps for the main program.
+    pub fn with_steps(self, steps: Vec<MainProgramStep>) -> Self {
+        Self { steps, ..self }
+    }
+
+    /// Set the returned variables
+    pub fn with_returns(self, returns: impl IntoIterator<Item = ShortString>) -> Self {
+        Self { returns: returns.into_iter().collect(), ..self }
+    }
+}
+
+/// The returned variables from the main program.
+#[derive(Debug, Default, IntoIterator)]
+pub struct MainProgramReturns {
+    #[into_iterator(owned)]
+    variables: Vec<ShortString>,
+}
+
+impl FromIterator<ShortString> for MainProgramReturns {
+    fn from_iter<T: IntoIterator<Item = ShortString>>(iter: T) -> Self {
+        Self { variables: iter.into_iter().collect() }
+    }
+}
+
+/// A step to do for the main program.
+#[derive(Debug)]
+pub struct MainProgramStep {
+    /// The name of the assignated variable.
+    destination: ShortString,
+
+    /// The name of the job with its source module, in this order: `(module, job)`.
+    job: (ShortString, ShortString),
+
+    /// The arguments to pass to the job, the variables to read (and possibly rearange), and the
+    /// parameters to set.
+    call_list: Vec<MainProgramCallListItem>,
+}
+
+impl MainProgramStep {
+    /// Create a new program step.
+    pub fn new(
+        destination: ShortString,
+        job: (ShortString, ShortString),
+        call_list: impl IntoIterator<Item = MainProgramCallListItem>,
+    ) -> Self {
+        Self { destination, job, call_list: call_list.into_iter().collect() }
+    }
+
+    /// Get the name of the variable to write the result of the job into.
+    pub fn destination(&self) -> &ShortString {
+        &self.destination
+    }
+
+    /// Get the name of the source module where to find the job we are trying to call.
+    pub fn module(&self) -> &ShortString {
+        &self.job.0
+    }
+
+    /// Get the name of the job we are trying to call.
+    pub fn job(&self) -> &ShortString {
+        &self.job.1
+    }
+
+    /// Get the arguments of the job.
+    pub fn call_list_items(&self) -> impl Iterator<Item = &MainProgramCallListItem> {
+        self.call_list.iter()
+    }
+}
+
+/// An item to pass to a job when we call it.
+#[derive(Debug, IsVariant)]
+pub enum MainProgramCallListItem {
+    /// We add a variable to process.
+    Variable(ShortString),
+
+    /// We set a parameter for the job.
+    Parameter(ShortString, Expression),
+}
+
+impl MainProgramCallListItem {
+    /// Treat the call list item as a variable if possible.
+    pub fn as_variable(&self) -> Option<&ShortString> {
+        match self {
+            MainProgramCallListItem::Variable(variable) => Some(variable),
+            _ => None,
+        }
+    }
+
+    /// Treat the call list item as a parameter setting if possible.
+    pub fn as_parameter(&self) -> Option<(&ShortString, &Expression)> {
+        match self {
+            MainProgramCallListItem::Parameter(argument, value) => Some((argument, value)),
+            _ => None,
+        }
+    }
+}
diff --git a/src/Rust/vvs_parser/src/vivy/mod.rs b/src/Rust/vvs_parser/src/vivy/mod.rs
new file mode 100644
index 00000000..e28ae6ec
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/mod.rs
@@ -0,0 +1,45 @@
+//! Vivy specific logic
+
+mod error_report;
+mod frontend_pipeline;
+mod library;
+mod main_program;
+mod passes;
+mod search_path;
+mod symbol_table;
+
+use std::{borrow::Cow, fs, io, path::Path};
+
+pub use self::{error_report::ErrorReport, frontend_pipeline::*, main_program::*, passes::UserFrontendPass};
+
+/// The representation of a source file.
+pub struct SourceCode {
+    name: Cow<'static, str>,
+    code: Cow<'static, str>,
+}
+
+impl SourceCode {
+    /// Create a new source file from a file.
+    pub fn from_path(path: impl AsRef<Path>) -> io::Result<Self> {
+        Ok(Self {
+            name: Cow::Owned(
+                path.as_ref()
+                    .file_name()
+                    .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "path doesn't have a file name"))?
+                    .to_string_lossy()
+                    .to_string(),
+            ),
+            code: Cow::Owned(fs::read_to_string(path.as_ref())?),
+        })
+    }
+
+    /// Create a new source file from memory.
+    pub fn from_memory(code: Cow<'static, str>) -> Self {
+        Self { name: Cow::Borrowed("--"), code }
+    }
+
+    /// Get the name of the source file.
+    pub fn name(&self) -> &str {
+        &self.name
+    }
+}
diff --git a/src/Rust/vvs_parser/src/vivy/passes/mod.rs b/src/Rust/vvs_parser/src/vivy/passes/mod.rs
new file mode 100644
index 00000000..6c6f8e65
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/passes/mod.rs
@@ -0,0 +1,141 @@
+//! Passes to verify and transform the Vivy Script code written by an user.
+
+mod opts_transform;
+mod stmt_checker;
+mod type_checker;
+mod type_collector;
+
+pub use self::{opts_transform::*, stmt_checker::*, type_checker::*, type_collector::*};
+
+/// Macro used to declare a pass, can be a transform pass or a visit pass (for the role).
+/// ```ignore
+/// declare_pass! {
+///     transform::OptsTransform
+///     aux_infos { options: toml::Table }
+///     opt_infos { verbose: u8 }
+///     results { replaced_count: usize, unused_options: Vec<String> }
+/// };
+/// impl VisitorMut for OptsTransform {}
+/// ```
+#[macro_export]
+macro_rules! declare_pass {
+    (
+        $(#[$meta: meta])*
+        $role: ident :: $name: ident : $lifetime: lifetime {
+            $($field_attr: ident : $field_ty: ty),* $(,)?
+        }
+
+        $(aux_infos { $($info_attr: ident : $info_ty: ty),+$(,)? })?
+        $(opt_infos { $($opts_attr: ident : $opts_ty: ty),+$(,)? })?
+        $(results   { $($res_attr:  ident : $res_ty:  ty),+$(,)? })?
+    ) => {
+        $(#[$meta])*
+        pub struct $name <$lifetime> {
+            program: Option<$crate::ast::Ast>,
+            name:    &$lifetime str,
+            source:  &$lifetime str,
+            report:  $crate::vivy::error_report::ErrorReport<$lifetime>,
+            $(  $field_attr: $field_ty,)*
+            $($($info_attr:  $info_ty),+,)?
+            $($($opts_attr:  Option<$opts_ty>),+,)?
+            $($($res_attr:   $res_ty),+,)?
+        }
+
+        paste::paste! {
+            #[doc = "The resut structure for the  [" $name "] pass."]
+            #[derive(Default)]
+            pub struct [< $name Result >]  {
+                $($(pub $res_attr: $res_ty),+)?
+            }
+        }
+
+        impl <$lifetime> $name <$lifetime> {
+            paste::paste! {
+                #[doc = "Create a new [" $name "] pass."]
+                pub fn new(
+                    program:        $crate::ast::Ast,
+                    (name, source): (&$lifetime str, &$lifetime str)
+                    $($(, $info_attr: $info_ty)+)?
+                ) -> Self {
+                    Self {
+                        program: Some(program), name, source,
+                        report: $crate::vivy::error_report::ErrorReport::new(),
+                        $($($info_attr),+,)?
+                        $(  $field_attr: Default::default(),)*
+                        $($($opts_attr:  None),+,)?
+                        $($($res_attr:   Default::default()),+,)?
+                    }
+                }
+
+                /// Add a new ast error to the error list.
+                #[allow(dead_code)]
+                fn error(&mut self, token: impl Into<$crate::tokenizer::TokenReference>, error: impl Into<std::borrow::Cow<'static, str>>) {
+                    self.report.add_errors(
+                        self.name,
+                        self.source,
+                        [$crate::Error::AstError($crate::ast::AstError::from_parts(token.into(), error))]
+                    );
+                }
+
+                /// Add a new ast warning to the error list.
+                #[allow(dead_code)]
+                fn warning(&mut self, token: impl Into<$crate::tokenizer::TokenReference>, error: impl Into<std::borrow::Cow<'static, str>>) {
+                    self.report.add_warnings(
+                        self.name,
+                        self.source,
+                        [$crate::Error::AstError($crate::ast::AstError::from_parts(token.into(), error))]
+                    );
+                }
+
+                $($(
+                    #[doc = "Set the optional information '" $opts_attr "' for the [" $name "] pass."]
+                    #[allow(clippy::wrong_self_convention)]
+                    pub fn $opts_attr(self, $opts_attr: $opts_ty) -> Self {
+                        Self { $opts_attr: Some($opts_attr), ..self }
+                    }
+                )+)?
+
+                #[doc = "Apply the [" $name "] pass and get the resulting [vvs_parser::ast::Ast] or the list of the errors."]
+                pub fn process(mut self) -> Result<($crate::ast::Ast, [< $name Result >]), ()> {
+                    let ast = self.program.take().unwrap();
+                    let ast = $crate::declare_pass!(@apply_on_ast $role (self, ast));
+                    match self.report.report() {
+                        true => Err(()),
+                        false => Ok((ast, [< $name Result >] {
+                            $($($res_attr: self.$res_attr),+)?
+                        })),
+                    }
+                }
+            }
+        }
+    };
+
+    (@apply_on_ast transform ($self: ident, $ast: expr)) => {{
+        use $crate::visitors::VisitorMut;
+        $self.visit_ast($ast)
+    }};
+
+    (@apply_on_ast visit ($self: ident, $ast: expr)) => {{
+        use $crate::visitors::Visitor;
+        $self.visit_ast(&$ast);
+        $ast
+    }};
+}
+
+/// Trait used to provide a way for users to create their own passes
+pub trait UserFrontendPass {
+    /// Get the name of the pass. For logging purposes.
+    fn name(&self) -> &'static str;
+
+    /// Get the description of the pass. For logging purposes.
+    fn description(&self) -> &'static str;
+
+    /// Do the work on a specific module. The order in which the modules are passed is not
+    /// guarented. It is better to not store state with interior mutability.
+    fn process(
+        &self,
+        program: crate::ast::Ast,
+        name: &str,
+        source: &str,
+    ) -> Result<crate::ast::Ast, crate::vivy::FrontendError>;
+}
diff --git a/src/Rust/vvs_parser/src/vivy/passes/opts_transform.rs b/src/Rust/vvs_parser/src/vivy/passes/opts_transform.rs
new file mode 100644
index 00000000..6c60caf8
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/passes/opts_transform.rs
@@ -0,0 +1,49 @@
+use crate::{ast::*, node::Node, tokenizer::*, ShortString};
+
+crate::declare_pass! {
+    /// The option optimization is here to substitute the options with the values chosen by the
+    /// user.
+    #[allow(dead_code)]
+    transform::OptsTransform: 'a {}
+
+    aux_infos { options: &'a OptionTable                 }
+    results   { unused:  Vec<(ShortString, ShortString)> }
+}
+
+impl crate::visitors::VisitorMut for OptsTransform<'_> {
+    fn visit_expression_end(&mut self, expression: Expression) -> Expression {
+        match expression {
+            Expression::Var(Var::Expression(var)) => self.process_var_expression(var),
+            expression => expression,
+        }
+    }
+}
+
+impl OptsTransform<'_> {
+    fn process_var_expression(&mut self, var: Box<VarExpression>) -> Expression {
+        let module = match var.prefix() {
+            Prefix::Name(TokenReference {
+                token: Token { token_type: TokenType::Identifier { identifier }, .. },
+                ..
+            }) if self.options.has_section(identifier) => identifier.clone(),
+            _ => return Expression::Var(Var::Expression(var)),
+        };
+
+        match var.suffixes().next() {
+            Some(Suffix::Index(Index::Dot {
+                name: TokenReference { token: Token { token_type: TokenType::Identifier { ref identifier }, .. }, .. },
+                ..
+            })) if var.suffixes().count() == 1 => self.options.get(&module, identifier).cloned().unwrap_or_else(|| {
+                self.error(var.tokens().next().unwrap(), format!("failed to find option `{module}.{identifier}`"));
+                Expression::Symbol(TokenReference::basic_symbol("nil"))
+            }),
+
+            Some(Suffix::Index(name)) => {
+                self.error(name.tokens().next().unwrap(), "expected a reference to an option, e.g. `module.option`");
+                Expression::Symbol(TokenReference::basic_symbol("nil"))
+            }
+
+            _ => Expression::Var(Var::Expression(var.clone())),
+        }
+    }
+}
diff --git a/src/Rust/vvs_parser/src/vivy/passes/stmt_checker.rs b/src/Rust/vvs_parser/src/vivy/passes/stmt_checker.rs
new file mode 100644
index 00000000..7dbb413a
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/passes/stmt_checker.rs
@@ -0,0 +1,259 @@
+use crate::{
+    ast::{Punctuated, TypeInfo, *},
+    node::Node,
+    tokenizer::{Token, TokenKind, TokenReference, TokenType},
+    visitors::Visit,
+    vivy::main_program::{MainProgram, MainProgramCallListItem, MainProgramStep},
+    ShortString,
+};
+
+crate::declare_pass! {
+    /// The statement checker is here to verify that statements are not used in incorrect positions.
+    visit::StmtChecker: 'a {
+        in_job: bool,
+    }
+
+    opt_infos { is_main: bool }
+    results   {
+        imported:  Vec<TokenReference>,
+        setd_opts: Vec<(ShortString, ShortString, Expression)>,
+        decl_opts: Vec<(ShortString, OptionDefaultValue)>,
+        main:      Option<MainProgram>,
+    }
+}
+
+impl crate::visitors::Visitor for StmtChecker<'_> {
+    fn visit_ast(&mut self, ast: &Ast) {
+        ast.nodes().stmts().for_each(|stmt| match stmt {
+            Stmt::Import(import) => self.check_import(import),
+            Stmt::Main(main) => self.check_main(main),
+            Stmt::Assignment(assignment) => self.check_option_set(assignment),
+            Stmt::OptionDecl(declaration) => self.check_option_decl(declaration),
+
+            stmt @ Stmt::FunctionDeclaration(_) | stmt @ Stmt::LocalFunction(_) => stmt.visit(self),
+            stmt @ Stmt::JobDeclaration(_) => {
+                self.in_job = true;
+                stmt.visit(self);
+                self.in_job = false;
+            }
+
+            Stmt::TypeDeclaration(_) => unimplemented!("custom types are tbd"),
+
+            stmt => self.error(stmt.tokens().next().unwrap(), "unexpected statement"),
+        });
+        if !ast.eof().is_kind(TokenKind::Eof) {
+            self.error(ast.eof(), "expected eof token here");
+        }
+        self.warn_on_reimport();
+    }
+
+    fn visit_yield(&mut self, yields: &Yield) {
+        if !self.in_job {
+            self.error(yields.token(), "the yield statement can only be used from inside a job")
+        }
+    }
+
+    fn visit_import(&mut self, node: &Import) {
+        self.error(node.import_token(), "the 'import' statement is only valid in top-level position")
+    }
+
+    fn visit_option_decl(&mut self, node: &OptionDecl) {
+        self.error(node.option_token(), "the 'option' statement is only valid in top-level position")
+    }
+
+    fn visit_write(&mut self, node: &Write) {
+        self.error(node.write_token(), "the 'write' statement is only valid in the main statement")
+    }
+
+    fn visit_main(&mut self, node: &Main) {
+        self.error(node.main_token(), "the 'main' statement is only valid in top-level position")
+    }
+}
+
+impl StmtChecker<'_> {
+    fn warn_on_reimport(&mut self) {
+        let mut vec: Vec<_> = self
+            .imported
+            .iter()
+            .map(|token| ShortString::new(token.token_type().as_str()))
+            .collect();
+        vec.sort();
+
+        enum State {
+            Empty,
+            Import(ShortString),
+            AlreadyWarned(ShortString),
+        }
+
+        let mut state = State::Empty;
+        for current in vec {
+            match state {
+                // Double import.
+                State::Import(last) if last == current => {
+                    state = State::AlreadyWarned(current);
+                    let token = self
+                        .imported
+                        .iter()
+                        .find(|import| import.token_type().as_str() == last.as_str())
+                        .unwrap()
+                        .clone();
+                    self.warning(token, "already imported");
+                }
+
+                // Multi-import, but already warned.
+                State::AlreadyWarned(ref last) if *last == current => {}
+
+                // Current changed.
+                State::AlreadyWarned(_) | State::Import(_) | State::Empty => state = State::Import(current),
+            }
+        }
+    }
+
+    fn check_option_decl(&mut self, declaration: &OptionDecl) {
+        declaration.declarations().for_each(|(n, ty, v)| match n.token_type() {
+            TokenType::Identifier { identifier } if self.decl_opts.iter().any(|(opt, _)| opt == identifier) => {
+                self.error(n, "redefinition of option");
+            }
+            TokenType::Identifier { identifier } => self.decl_opts.push((
+                identifier.clone(),
+                OptionDefaultValue { expression: v.clone(), type_info: ty.map(|ty| ty.type_info().clone()) },
+            )),
+            token => unreachable!("expected an identifier! {token:?}"),
+        })
+    }
+
+    fn check_import(&mut self, import: &Import) {
+        assert!(import.name().is_kind(TokenKind::StringLiteral), "import name token should be a string literal");
+        self.imported.push(import.name().clone());
+    }
+
+    fn check_option_set(&mut self, assignation: &Assignment) {
+        if !self.is_main.unwrap_or_default() {
+            return self.error(
+                assignation.tokens().next().expect("assignation"),
+                "options can be set only from the main script file",
+            );
+        }
+
+        let handle = |v: &Var| match v {
+            Var::Expression(expression) => {
+                let module = match expression.prefix() {
+                    Prefix::Name(TokenReference {
+                        token: Token { token_type: TokenType::Identifier { identifier }, .. },
+                        ..
+                    }) => identifier.clone(),
+                    prefix => {
+                        let token = prefix.tokens().next().unwrap();
+                        self.error(token, "invalid module name, expected an identifier");
+                        return None;
+                    }
+                };
+
+                let error_token = match expression.suffixes().next() {
+                    Some(Suffix::Index(Index::Dot {
+                        name:
+                            TokenReference { token: Token { token_type: TokenType::Identifier { identifier }, .. }, .. },
+                        ..
+                    })) if expression.suffixes().count() == 1 => return Some((module, identifier.clone())),
+                    Some(suffix) => suffix.tokens().next().unwrap().clone(),
+                    None => expression.tokens().next().unwrap().clone(),
+                };
+                self.error(error_token, "expected a reference to an option by its name, e.g. `module.option`");
+                None
+            }
+
+            Var::Name(name) => match name.token_type() {
+                TokenType::Identifier { identifier } => Some((ShortString::new(self.name), identifier.clone())),
+                _ => unreachable!(),
+            },
+        };
+
+        let options = Vec::from_iter(assignation.variables().iter().flat_map(handle))
+            .into_iter()
+            .zip(assignation.expressions().into_iter().cloned())
+            .map(|((module, name), val)| (module, name, val));
+        self.setd_opts.extend(options);
+    }
+
+    fn check_main(&mut self, main: &Main) {
+        if !self.is_main.unwrap_or_default() {
+            return self.error(main.main_token(), "the main statement must always be in the main script file");
+        } else if self.main.is_some() {
+            return self.error(main.main_token(), "multiple main found");
+        }
+
+        let mut declared_variables = vec![main.initial_variable().clone()];
+        let mut program_steps = Vec::with_capacity(main.assignements().len());
+        for step in main.assignements() {
+            let call_list = step.call_list_items().flat_map(|item| match item {
+                CallListItem::Variable(var) => declared_variables
+                    .contains(var)
+                    .then(|| MainProgramCallListItem::Variable(var.token_type().as_str().into()))
+                    .ok_or_else(|| self.error(var, "use of undeclared variable")),
+
+                CallListItem::SetParameter { parameter, expression, .. } => {
+                    let parameter = parameter.token_type().as_str();
+                    log::error!("check if the job has the parameter {parameter}");
+                    Ok(MainProgramCallListItem::Parameter(ShortString::new(parameter), expression.clone()))
+                }
+            });
+
+            if !declared_variables.contains(step.destination()) {
+                self.error(step.destination(), "redefined variable");
+                continue;
+            }
+
+            let (module, job) = step.called_job_identifiers();
+            log::error!("check if the module and the job are correct…");
+
+            program_steps.push(MainProgramStep::new(
+                step.destination().token_type().as_str().into(),
+                (module.clone(), job.clone()),
+                call_list,
+            ));
+            declared_variables.push(step.destination().clone());
+        }
+
+        let written_variables = main
+            .returns()
+            .map(|write| write.variables())
+            .into_iter()
+            .flat_map(Punctuated::iter);
+        let written_variables = written_variables.flat_map(|written| {
+            declared_variables
+                .contains(written)
+                .then(|| ShortString::new(written.token_type().as_str()))
+                .ok_or_else(|| self.error(written, "try to write a variable that was not declared"))
+        });
+
+        self.main = Some(
+            MainProgram::default()
+                .with_initial(ShortString::new(main.initial_variable().token_type().as_str()))
+                .with_steps(program_steps)
+                .with_returns(written_variables),
+        );
+    }
+}
+
+pub struct OptionDefaultValue {
+    expression: Expression,
+    type_info: Option<TypeInfo>,
+}
+
+impl From<OptionDefaultValue> for Expression {
+    fn from(value: OptionDefaultValue) -> Self {
+        value.expression
+    }
+}
+
+impl OptionDefaultValue {
+    /// Get the default value for the option.
+    pub fn expression(&self) -> &Expression {
+        &self.expression
+    }
+
+    /// Get the type info if specified
+    pub fn type_info(&self) -> Option<&TypeInfo> {
+        self.type_info.as_ref()
+    }
+}
diff --git a/src/Rust/vvs_parser/src/vivy/passes/type_checker.rs b/src/Rust/vvs_parser/src/vivy/passes/type_checker.rs
new file mode 100644
index 00000000..712253f5
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/passes/type_checker.rs
@@ -0,0 +1,551 @@
+use crate::{
+    ast::*,
+    node::Node,
+    tokenizer::*,
+    traits::DefaultRef,
+    vivy::{library::*, symbol_table::SymbolTable},
+};
+
+crate::declare_pass! {
+    /// The type checker is here to verify type corectness of the program and infer types, etc. To
+    /// check the types we will need to do custom things...
+    visit::TypeChecker: 'a {}
+
+    aux_infos {
+        library: &'a Library,
+        symbol_table: SymbolTable<'a, TypeInfo>,
+    }
+}
+
+impl crate::visitors::Visitor for TypeChecker<'_> {
+    fn visit_ast(&mut self, ast: &Ast) {
+        for error in Vec::from_iter(ast.nodes().stmts().flat_map(|stmt| match stmt {
+            Stmt::JobDeclaration(decl) => self.type_compute().callable(decl.body(), true).err(),
+            Stmt::FunctionDeclaration(decl) => self.type_compute().callable(decl.body(), false).err(),
+            Stmt::LocalFunction(decl) => self.type_compute().callable(decl.body(), false).err(),
+            Stmt::Assignment(assignments) => self.type_compute().assignments(assignments).map(|_| ()).err(),
+            Stmt::OptionDecl(_) | Stmt::Import(_) => None, // NOOP / Types already registered...
+            Stmt::TypeDeclaration(_) => unimplemented!("custom types are tbd"),
+            _ => unreachable!("already checked that they are not here"),
+        })) {
+            self.report
+                .add_errors(self.name, self.source, [crate::Error::AstError(*error)]);
+        }
+        if !ast.eof().is_kind(TokenKind::Eof) {
+            self.error(ast.eof(), "expected eof token here");
+        }
+    }
+}
+
+impl TypeChecker<'_> {
+    fn type_compute(&self) -> TypeCompute {
+        TypeCompute::new(self.library, self.symbol_table.sub_scope())
+    }
+}
+
+/// The thing that will actually compute types and returns errors in case of problems.
+struct TypeCompute<'a> {
+    library: &'a Library,
+    symbols: SymbolTable<'a, TypeInfo>,
+    in_loop: bool,
+    in_job: bool,
+    returns: &'a TypeInfo,
+}
+
+type TypeComputeError = Box<AstError>;
+type TypeComputeResult<'a> = Result<(TypeInfo, SymbolTable<'a, TypeInfo>), TypeComputeError>;
+
+macro_rules! box_error {
+    ($token: expr, $format: literal                   $(,)?) => { Box::new(AstError::from_parts($token.into(), format!($format            ))) };
+    ($token: expr, $format: literal, $($args: expr),+ $(,)?) => { Box::new(AstError::from_parts($token.into(), format!($format, $($args),+))) };
+}
+
+fn unsupported<T>(token: &TokenReference, whats: &str) -> Result<T, TypeComputeError> {
+    Err(box_error!(token, "{whats} are not supported for now"))
+}
+
+impl<'a> TypeCompute<'a> {
+    fn new(library: &'a Library, symbols: SymbolTable<'a, TypeInfo>) -> Self {
+        Self { library, symbols, returns: TypeInfo::default_ref(), in_loop: false, in_job: false }
+    }
+
+    fn sub(&'a self) -> Self {
+        Self { symbols: self.symbols.sub_scope(), ..*self }
+    }
+
+    fn set(mut self, symbol: &TokenReference, ty: TypeInfo) -> Result<Self, TypeComputeError> {
+        self.symbols.set(symbol.token_type().as_str(), ty).map_err(|var| {
+            box_error!(symbol, "{var} was already defined at the root level of the program and is thus a constant")
+        })?;
+        Ok(self)
+    }
+
+    fn in_loop(self) -> Self {
+        Self { in_loop: true, ..self }
+    }
+
+    fn assignments(self, assignments: &'a Assignment) -> TypeComputeResult<'a> {
+        let mut assignments = assignments.variables().iter().zip(assignments.expressions());
+        assignments.try_for_each(|(dest, expr)| self.sub().assignation(dest, expr))?;
+        Ok((TypeInfo::default(), self.symbols))
+    }
+
+    fn check_method_call(
+        self,
+        record: &TypeRecord,
+        method: &MethodCall,
+        caller: &TokenReference,
+        token: &TokenReference,
+    ) -> Result<TypeInfo, TypeComputeError> {
+        let method_name = method.name().token_type().as_str();
+        let (arguments, returns) = match record
+            .method(method_name)
+            .ok_or_else(|| box_error!(token, "undefined method '{caller}:{method_name}'"))?
+        {
+            TypeRecordMethod([this, args @ ..], ret, true) if this == record.type_info() => (args, ret),
+            TypeRecordMethod(args, ret, false) => (args, ret),
+            TypeRecordMethod([this, ..], _, true) => {
+                return Err(box_error!(token, "try to call '{this}:{method_name}' on expression of type '{caller}'"))
+            }
+            TypeRecordMethod(.., true) => unreachable!(),
+        };
+        self.check_func_args(arguments, returns, method.args(), token)
+    }
+
+    fn check_func_args(
+        self,
+        arguments: &[TypeInfo],
+        returns: &TypeInfo,
+        func_args: &FunctionArgs,
+        token: &TokenReference,
+    ) -> Result<TypeInfo, TypeComputeError> {
+        match func_args {
+            FunctionArgs::String(_) => match arguments.first() {
+                Some(type_info) if arguments.len() == 1 && type_info == TypeInfo::string() => Ok(returns.clone()),
+                Some(type_info) if arguments.len() == 1 => Err(box_error!(
+                    token,
+                    "try to pass a string argument to a function that a variable of type {type_info}"
+                )),
+                Some(_) => {
+                    Err(box_error!(token, "try to pass an argument to a function that takes {}", arguments.len()))
+                }
+                None => Err(box_error!(token, "try to pass an argument to a function that takes none",)),
+            },
+
+            FunctionArgs::TableConstructor(_) if arguments.len() != 1 => Err(box_error!(
+                token,
+                "try to pass a table as argument to a function that takes {} arguments",
+                arguments.len()
+            )),
+            FunctionArgs::TableConstructor(args) => {
+                debug_assert_eq!(arguments.len(), 1);
+                todo!("find a way to correctly parse expected types...");
+                // We can pass a table because we expect a table, or because we pass named
+                // arguments...
+            }
+
+            FunctionArgs::Parentheses { arguments: args, .. } => {
+                if args.len() != arguments.len() {
+                    let (arg_len, func_len) = (args.len(), arguments.len());
+                    return Err(box_error!(
+                        token,
+                        "try to pass {arg_len} arguments to a function that takes {func_len}"
+                    ));
+                }
+                let mut arguments = args.iter().enumerate().zip(arguments.iter());
+                match arguments.find_map(|((idx, arg), type_info)| {
+                    self.sub()
+                        .expression_as_type(type_info, arg)
+                        .is_err()
+                        .then(|| (idx, arg.tokens().next().unwrap(), type_info))
+                }) {
+                    Some((n, tok, ty)) => Err(box_error!(tok, "expected argument n°{n} to be of type {ty}")),
+                    None => Ok(returns.clone()),
+                }
+            }
+        }
+    }
+
+    fn expression(self, expression: &'a Expression) -> TypeComputeResult<'a> {
+        match expression {
+            Expression::Parentheses { expression, .. } => self.expression(expression),
+            Expression::FunctionCall(call) => self.suffixes(call.prefix(), call.suffixes()),
+
+            Expression::Number(_) => Ok((TypeInfo::number().clone(), self.symbols)),
+            Expression::String(_) => Ok((TypeInfo::string().clone(), self.symbols)),
+            Expression::TypeAssertion { .. } => Ok((TypeInfo::default(), self.symbols)),
+
+            Expression::Var(Var::Expression(var)) => self.suffixes(var.prefix(), var.suffixes()),
+            Expression::Var(Var::Name(token)) => {
+                let ty = self
+                    .symbols
+                    .get(token.token_type().as_str())
+                    .ok_or_else(|| box_error!(token, "undefined variable"))?;
+                Ok((ty.clone(), self.symbols))
+            }
+
+            Expression::Symbol(token) => match token.token_type() {
+                TokenType::Symbol { symbol: Symbol::Nil } => Ok((TypeInfo::default(), self.symbols)),
+                TokenType::Symbol { symbol: Symbol::False | Symbol::True } => {
+                    Ok((TypeInfo::number().clone(), self.symbols))
+                }
+                _ => unreachable!(),
+            },
+
+            Expression::UnaryOperator { unop, expression } => {
+                use {TypeInfo::*, UnOp::*};
+                let (ty, symbols) = self.expression(expression)?;
+                let is_container =
+                    matches!(ty, Array { .. } | Basic(_) | Optional { .. } | Table { .. } | Tuple { .. });
+                match unop {
+                    Minus(_) | Not(_) | Tilde(_) if ty == *TypeInfo::number() => Ok((ty, symbols)),
+                    Hash(_) if is_container => Ok((TypeInfo::number().clone(), symbols)),
+                    _ => {
+                        Err(box_error!(unop.token(), "can't apply this unary operator to an expression of type '{ty}'"))
+                    }
+                }
+            }
+
+            Expression::BinaryOperator { lhs, binop, rhs } => {
+                use BinOp::*;
+                let ty = self.sub().expression(lhs)?.0;
+                self.sub().expression_as_type(&ty, rhs)?;
+                match binop {
+                    TwoEqual(_) | TildeEqual(_) => Ok((TypeInfo::number().clone(), self.symbols)),
+                    TwoDots(_) if ty == *TypeInfo::string() => Ok((TypeInfo::number().clone(), self.symbols)),
+
+                    GreaterThan(_) | GreaterThanEqual(_) | LessThan(_) | LessThanEqual(_) | DoubleGreaterThan(_)
+                    | DoubleLesserThan(_) | Caret(_) | Pipe(_) | Ampersand(_) | Tilde(_) | Percent(_) | Star(_)
+                    | Slash(_) | DoubleSlash(_) | Minus(_) | Plus(_) | And(_) | Or(_)
+                        if ty == *TypeInfo::number() =>
+                    {
+                        Ok((ty, self.symbols))
+                    }
+
+                    _ => Err(box_error!(
+                        binop.token(),
+                        "can't apply this binary operator to an expression of type '{ty}'",
+                    )),
+                }
+            }
+
+            Expression::IfExpression(_) => todo!(),
+            Expression::TableConstructor(_) => todo!(),
+
+            Expression::Function(_) => unsupported(expression.tokens().next().unwrap(), "lambdas"),
+        }
+    }
+
+    fn suffixes(self, prefix: &'a Prefix, suffixes: impl Iterator<Item = &'a Suffix> + 'a) -> TypeComputeResult<'a> {
+        let prefix = match prefix {
+            Prefix::Expression(expression) => self.sub().expression(expression)?.0,
+            Prefix::Name(token) => self
+                .symbols
+                .get(token.token_type().as_str())
+                .cloned()
+                .ok_or_else(|| box_error!(token, "try to reference an undefined variable or function"))?,
+        };
+
+        let ty = suffixes.into_iter().try_fold(prefix, |prefix, suffix| match prefix {
+            TypeInfo::Callback { arguments, return_type, .. } => match suffix {
+                Suffix::Call(Call::AnonymousCall(call)) => {
+                    let arguments =
+                        Vec::from_iter(arguments.into_iter().map(|TypeArgument { type_info, .. }| type_info));
+                    self.sub()
+                        .check_func_args(&arguments, &return_type, call, suffix.tokens().next().unwrap())
+                }
+                suffix => unreachable!("{suffix:?}"),
+            },
+
+            TypeInfo::Array { type_info, .. } => match suffix {
+                Suffix::Index(Index::Dot { name, .. }) => match name.token_type().as_str() {
+                    "first" | "last" => Ok(*type_info),
+                    field => Err(box_error!(name, "unknown field '{field}' for array")),
+                },
+                Suffix::Index(Index::Brackets { expression, .. }) => self
+                    .sub()
+                    .expression_as_type(TypeInfo::number(), expression)
+                    .map(|_| *type_info),
+                _ => unreachable!(),
+            },
+
+            TypeInfo::Basic(type_name) => {
+                let suffix_token = suffix.tokens().next().unwrap();
+                let record = self
+                    .library
+                    .get(type_name.token_type().as_str())
+                    .ok_or_else(|| box_error!(suffix_token, "try to use undefined type '{type_name}'"))?;
+                match suffix {
+                    Suffix::Call(Call::MethodCall(method)) => {
+                        self.sub().check_method_call(record, method, &type_name, suffix_token)
+                    }
+                    Suffix::Index(Index::Dot { name, .. }) => {
+                        let TypeRecordField(_, field) = record
+                            .field(name.token_type().as_str())
+                            .ok_or_else(|| box_error!(suffix_token, "undefined field for type '{type_name}'"))?;
+                        Ok(field.clone())
+                    }
+                    Suffix::Index(Index::Brackets { expression, .. }) => todo!("{expression}"),
+                    suffix => unreachable!("{suffix}"),
+                }
+            }
+
+            TypeInfo::Tuple { types, .. } => {
+                let index = match suffix {
+                    Suffix::Index(Index::Dot { name: token, .. })
+                    | Suffix::Index(Index::Brackets { expression: Expression::Number(token), .. }) => token,
+                    _ => unreachable!(),
+                };
+                let handle = |str: &str| {
+                    str.parse::<usize>().map_err(|err| {
+                        box_error!(index, "index into a tuple must be a known integer at compilation time: {err}",)
+                    })
+                };
+                let ty = types.iter().nth(match index.token_type() {
+                    TokenType::Identifier { identifier } => match identifier.as_str() {
+                        "zero" | "first" => 0,
+                        "one" | "second" => 1,
+                        "two" => 2,
+                        idx => return Err(box_error!(index, "unknown tuple index: '{idx}'")),
+                    },
+                    TokenType::Number { text } => handle(text.as_str())?,
+                    idx @ TokenType::StringLiteral { .. } => handle(idx.as_str())?,
+                    _ => todo!(),
+                });
+                ty.cloned()
+                    .ok_or_else(|| box_error!(index, "out of range in tuple: ({types})"))
+            }
+
+            TypeInfo::Table { fields, .. } => {
+                let field = match suffix {
+                    Suffix::Index(Index::Brackets { expression: Expression::String(name), .. })
+                    | Suffix::Index(Index::Dot { name, .. }) => name.token_type().as_str(),
+                    _ => unreachable!(),
+                };
+                let field = fields.iter().find_map(|TypeField { key, value, .. }| {
+                    let TypeFieldKey::Name(key) = key else { unreachable!() };
+                    let key = key.token_type().as_str();
+                    (field == key).then_some(value)
+                });
+                field.cloned().ok_or_else(|| {
+                    box_error!(suffix.tokens().next().unwrap(), "failed to find field in {{ {fields} }}")
+                })
+            }
+
+            TypeInfo::Optional { base, .. } => match suffix {
+                Suffix::Call(Call::MethodCall(call)) => match call.args() {
+                    FunctionArgs::Parentheses { arguments, .. } if arguments.is_empty() => {
+                        match call.name().token_type().as_str() {
+                            "is_nil" | "is_value" => Ok(TypeInfo::number().clone()),
+                            "value" => Ok(*base),
+                            m => Err(box_error!(suffix.tokens().next().unwrap(), "unknown method '{base}::{m}'")),
+                        }
+                    }
+                    _ => Err(box_error!(
+                        suffix.tokens().next().unwrap(),
+                        "can't pass parguments to '{base}::{}'",
+                        call.name(),
+                    )),
+                },
+                _ => Err(box_error!(suffix.tokens().next().unwrap(), "incorrect usage of optional value")),
+            },
+
+            TypeInfo::Typeof { .. } => Ok(TypeInfo::string().clone()),
+        })?;
+
+        Ok((ty, self.symbols))
+    }
+
+    fn expression_as_type(self, as_ty: &TypeInfo, expression: &'a Expression) -> Result<(), TypeComputeError> {
+        let (ty, _) = self.sub().expression(expression)?;
+        (ty == *as_ty).then_some(()).ok_or_else(|| {
+            box_error!(expression.tokens().next().unwrap(), "the expression should be of type '{as_ty}', got: '{ty}'",)
+        })
+    }
+
+    fn local_assignment(mut self, assignment: &'a LocalAssignment) -> TypeComputeResult<'a> {
+        let variables = assignment.names().iter();
+        let variables = variables
+            .zip(assignment.type_specifiers().map(|ty| ty.map(TypeSpecifier::type_info)))
+            .zip(assignment.expressions());
+        let variables = variables.map(|((name, ty), val)| {
+            let ty = match ty {
+                None => self.sub().expression(val)?.0,
+                Some(ty) => {
+                    self.sub().expression_as_type(ty, val)?;
+                    ty.clone()
+                }
+            };
+            Ok::<_, TypeComputeError>((name.token_type().as_str().into(), ty))
+        });
+        let symbols = self
+            .symbols
+            .extend(variables.collect::<Result<Vec<_>, TypeComputeError>>()?)
+            .map_err(|variable| {
+                box_error!(assignment.local_token(), "can't declare {variable} because it shadows a global variable",)
+            })?
+            .take();
+        Ok((TypeInfo::default(), symbols))
+    }
+
+    fn compound_assignment(self, assignment: &'a CompoundAssignment) -> TypeComputeResult<'a> {
+        todo!()
+    }
+
+    fn yields(self, yields: &'a Yield) -> TypeComputeResult<'a> {
+        if !self.in_job {
+            Err(box_error!(yields.token(), "yielding values is only possible from jobs"))
+        } else {
+            todo!()
+        }
+    }
+
+    fn assignation(self, variable: &'a Var, expression: &'a Expression) -> Result<(), TypeComputeError> {
+        match variable {
+            Var::Expression(_) => todo!(),
+            Var::Name(variable) => match variable.token_type() {
+                TokenType::Identifier { identifier } if self.symbols.root().get(identifier).is_some() => {
+                    Err(box_error!(variable, "try to assign a global variable"))
+                }
+                TokenType::Identifier { identifier } => match self.symbols.get(identifier).cloned() {
+                    Some(ty) => self.expression_as_type(&ty, expression),
+                    None => Err(box_error!(variable, "try to assign an undefined variable")),
+                },
+                _ => unreachable!(),
+            },
+        }
+    }
+
+    fn stmt(self, stmt: &'a Stmt) -> TypeComputeResult<'a> {
+        match stmt {
+            Stmt::CompoundAssignment(assignments) => self.compound_assignment(assignments),
+            Stmt::LocalAssignment(assignment) => self.local_assignment(assignment),
+            Stmt::Assignment(assignments) => self.assignments(assignments),
+            Stmt::FunctionCall(call) => self.suffixes(call.prefix(), call.suffixes()),
+            Stmt::Yield(yields) => self.yields(yields),
+            Stmt::Do(block) => self.block(block.block()),
+
+            Stmt::If(if_stmt) => {
+                self.sub().expression_as_type(TypeInfo::number(), if_stmt.condition())?;
+                self.sub().block(if_stmt.block())?;
+                for elseif in if_stmt.else_if().into_iter().flatten() {
+                    self.sub().expression_as_type(TypeInfo::number(), elseif.condition())?;
+                    self.sub().block(elseif.block())?;
+                }
+                if let Some(block) = if_stmt.else_block() {
+                    self.sub().block(block)?;
+                }
+                Ok((TypeInfo::default(), self.symbols))
+            }
+
+            Stmt::Repeat(repeat_stmt) => {
+                let symbols = self.sub().block(repeat_stmt.block())?.1;
+                TypeCompute { symbols, ..self }
+                    .in_loop()
+                    .expression_as_type(TypeInfo::number(), repeat_stmt.until())?;
+                Ok((TypeInfo::default(), self.symbols))
+            }
+
+            Stmt::While(while_stmt) => {
+                self.sub()
+                    .expression_as_type(TypeInfo::number(), while_stmt.condition())?;
+                self.sub().in_loop().block(while_stmt.block())?;
+                Ok((TypeInfo::default(), self.symbols))
+            }
+
+            Stmt::NumericFor(for_stmt) => {
+                self.sub().expression_as_type(TypeInfo::number(), for_stmt.start())?;
+                self.sub().expression_as_type(TypeInfo::number(), for_stmt.end())?;
+                if let Some(step) = for_stmt.step() {
+                    self.sub().expression_as_type(TypeInfo::number(), step)?;
+                }
+                self.sub()
+                    .set(for_stmt.index_variable(), TypeInfo::number().clone())?
+                    .block(for_stmt.block())?;
+                Ok((TypeInfo::default(), self.symbols))
+            }
+
+            Stmt::GenericFor(_) => todo!(),
+
+            Stmt::JobDeclaration(decl) => {
+                Err(box_error!(decl.function_token(), "nested declaration of job is forbidden"))
+            }
+
+            Stmt::FunctionDeclaration(decl) => unsupported(decl.function_token(), "nested declaration of functions"),
+            Stmt::LocalFunction(decl) => unsupported(decl.function_token(), "nested declaration of functions"),
+            Stmt::TypeDeclaration(_) => unsupported(stmt.tokens().next().unwrap(), "custom types"),
+
+            Stmt::Import(_) | Stmt::Write(_) | Stmt::Main(_) | Stmt::OptionDecl(_) => {
+                unreachable!("should have been already checked / can't be inside function and job declarations")
+            }
+        }
+    }
+
+    fn last_stmt(self, stmt: &'a LastStmt) -> TypeComputeResult<'a> {
+        match stmt {
+            LastStmt::Break(token) | LastStmt::Continue(token) => match self.in_loop {
+                true => Ok((TypeInfo::default(), self.symbols)),
+                false => Err(box_error!(token, "invalid statement, not inside a loop")),
+            },
+
+            LastStmt::Return(returns) if returns.returns().len() >= 2 => {
+                unsupported(returns.token(), "tuples to return multiple things")
+            }
+            LastStmt::Return(returns) if returns.returns().len() == 1 => (self.returns != TypeInfo::default_ref())
+                .then(|| self.expression(returns.returns().iter().next().unwrap()))
+                .ok_or_else(|| {
+                    box_error!(returns.token(), "function or job returns something, but this return statement is empty")
+                })?,
+            LastStmt::Return(returns) if returns.returns().len() == 1 => (self.returns != TypeInfo::default_ref())
+                .then(|| (TypeInfo::default(), self.symbols))
+                .ok_or_else(|| {
+                    box_error!(
+                        returns.token(),
+                        "expected to return an expression of type {}, but returns nothing here",
+                        self.returns,
+                    )
+                }),
+            LastStmt::Return(_) => unreachable!(),
+        }
+    }
+
+    fn block(self, block: &'a Block) -> TypeComputeResult<'a> {
+        let symbols = block.stmts().try_fold(self.symbols.sub_scope(), |symbols, stmt| {
+            Ok::<_, TypeComputeError>(TypeCompute { symbols, ..self }.stmt(stmt)?.1)
+        })?;
+        Ok(match block.last_stmt() {
+            Some(stmt) => (TypeCompute { symbols, ..self }.last_stmt(stmt)?.0, self.symbols),
+            None => (TypeInfo::default(), self.symbols),
+        })
+    }
+
+    fn callable(mut self, callable: &'a FunctionBody, is_job: bool) -> TypeComputeResult<'a> {
+        self.in_job = is_job;
+        self.returns = callable
+            .return_type()
+            .map(|specifier| specifier.type_info())
+            .unwrap_or(TypeInfo::default_ref());
+
+        if let Some((idx, parameter)) = callable
+            .parameters()
+            .iter()
+            .zip(callable.type_specifiers().map(|ty| ty.map(|ty| ty.type_info())))
+            .enumerate()
+            .find_map(|(idx, (parameter, specifier))| match specifier {
+                Some(ty) => self
+                    .symbols
+                    .set(parameter.token_type().as_str(), ty.clone())
+                    .is_err()
+                    .then_some((idx + 1, parameter)),
+                None => Some((idx + 1, parameter)),
+            })
+        {
+            return Err(box_error!(
+                parameter.tokens().next().unwrap(),
+                "parameter n°{idx} named '{parameter}' has no type specifier or is an ellipse '...' or shadows a global variable",
+            ));
+        }
+
+        self.block(callable.block())
+    }
+}
diff --git a/src/Rust/vvs_parser/src/vivy/passes/type_collector.rs b/src/Rust/vvs_parser/src/vivy/passes/type_collector.rs
new file mode 100644
index 00000000..e24536a6
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/passes/type_collector.rs
@@ -0,0 +1,11 @@
+use crate::vivy::library::*;
+
+crate::declare_pass! {
+    /// Collector of custom type, to register them in the library.
+    #[allow(dead_code)]
+    visit::TypeCollector: 'a {}
+
+    aux_infos { library: &'a mut Library }
+}
+
+impl crate::visitors::Visitor for TypeCollector<'_> {}
diff --git a/src/Rust/vvs_parser/src/vivy/search_path.rs b/src/Rust/vvs_parser/src/vivy/search_path.rs
new file mode 100644
index 00000000..fd24ed86
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/search_path.rs
@@ -0,0 +1,51 @@
+//! Used to search for other files when using the `import` statement in Vivy Script.
+
+use std::{borrow::Cow, fs, path::PathBuf};
+
+/// Search path, can pass the name of a module and will try to return the associated code.
+#[derive(Default)]
+pub struct SearchPath {
+    folders: Vec<PathBuf>,
+}
+
+/// The extension for vivy script files.
+pub const VIVY_SCRIPT_EXTENSION: &str = "vvs";
+
+impl SearchPath {
+    /// Create a new search path.
+    pub const fn new() -> Self {
+        Self { folders: Vec::new() }
+    }
+
+    /// Resolve the search path to get the desired code.
+    pub fn resolve(&self, import: &str) -> Option<Cow<'static, str>> {
+        self.folders.iter().find_map(|folder| {
+            let mut path = folder.join(import);
+            path.set_extension(VIVY_SCRIPT_EXTENSION);
+            let code = fs::read_to_string(path).ok()?;
+            Some(Cow::Owned(code))
+        })
+    }
+
+    /// Add a folder to the search list.
+    pub fn push(&mut self, folder: PathBuf) {
+        self.folders.push(folder)
+    }
+}
+
+impl Extend<PathBuf> for SearchPath {
+    /// Add multiple folders to the search list.
+    fn extend<T: IntoIterator<Item = PathBuf>>(&mut self, iter: T) {
+        self.folders.extend(iter)
+    }
+}
+
+impl FromIterator<PathBuf> for SearchPath {
+    /// Create a search list from a list of folders.
+    fn from_iter<T: IntoIterator<Item = PathBuf>>(iter: T) -> Self {
+        Self { folders: iter.into_iter().collect() }
+    }
+}
+
+/// The default search path, by default we only search the pre-packaged files.
+pub(crate) static DEFAULT_SEARCH_PATH: SearchPath = SearchPath::new();
diff --git a/src/Rust/vvs_parser/src/vivy/symbol_table.rs b/src/Rust/vvs_parser/src/vivy/symbol_table.rs
new file mode 100644
index 00000000..156e6036
--- /dev/null
+++ b/src/Rust/vvs_parser/src/vivy/symbol_table.rs
@@ -0,0 +1,103 @@
+use crate::{traits::DefaultRef, ShortString};
+use hashbrown::HashMap;
+use std::ops;
+
+/// The symbol table stores the available symbols with theyr type or whatever.
+pub struct SymbolTable<'a, T> {
+    /// A possible parent for this scope. The invariant is: either [SymbolTable::parent] or
+    /// [SymbolTable::imported] can be non-empty/null.
+    parent: Option<&'a SymbolTable<'a, T>>,
+
+    /// Imported scopes. The invariant is: either [SymbolTable::parent] or [SymbolTable::imported]
+    /// can be non-empty/null.
+    imported: Vec<&'a SymbolTable<'a, T>>,
+
+    /// List of symbols from this scope.
+    symbols: HashMap<ShortString, T>,
+}
+
+impl<T> Default for SymbolTable<'_, T> {
+    fn default() -> Self {
+        Self { parent: None, symbols: HashMap::new(), imported: vec![] }
+    }
+}
+
+impl<'a, T> SymbolTable<'a, T> {
+    /// Create a new sub-scoped symbol table.
+    pub fn sub_scope(&'a self) -> Self {
+        Self { parent: Some(self), symbols: Default::default(), imported: vec![] }
+    }
+
+    /// Add a new variable to the current scope. We override symbols (non-UB shadowing of
+    /// variables). Note that we can't shadow or set variables from the root scope as it denotes
+    /// the global state. In case of error we return the name of the problematic variable.
+    pub fn set(&mut self, symbol: impl Into<ShortString> + AsRef<str>, value: T) -> Result<&mut Self, ShortString> {
+        if self.root().get(symbol.as_ref()).is_none() {
+            self.symbols.insert(symbol.into(), value);
+            Ok(self)
+        } else {
+            Err(symbol.into())
+        }
+    }
+
+    /// Add variables from an iterator. Same rules as [Self::set].
+    pub fn extend(&mut self, iter: impl IntoIterator<Item = (ShortString, T)>) -> Result<&mut Self, ShortString> {
+        iter.into_iter()
+            .try_fold(self, |this, (symbol, value)| this.set(symbol, value))
+    }
+
+    /// Imports other scopes into this one. Note that if this scope is not the root one, then we
+    /// will panic...
+    pub fn import(&mut self, iter: impl IntoIterator<Item = &'a SymbolTable<'a, T>>) -> &mut Self {
+        debug_assert!(self.parent.is_none(), "can't have a parent and import another scope");
+        self.imported.extend(iter);
+        self
+    }
+
+    /// Get the root scope.
+    pub fn root(&self) -> &Self {
+        let mut root = self;
+        while let Some(parent) = root.parent {
+            root = parent;
+        }
+        root
+    }
+
+    /// Get a variable/callback/function from this scope or any parent scope.
+    pub fn get(&self, symbol: impl AsRef<str>) -> Option<&T> {
+        self.symbols
+            .get(symbol.as_ref())
+            .or_else(|| self.parent?.get(symbol.as_ref()))
+            .or_else(|| self.imported.iter().find_map(|scope| scope.get(symbol.as_ref())))
+    }
+
+    /// Consume the mutable reference to give back the owned table.
+    pub(crate) fn take(&mut self) -> Self {
+        std::mem::take(self)
+    }
+}
+
+impl<T> FromIterator<(ShortString, T)> for SymbolTable<'_, T> {
+    fn from_iter<I: IntoIterator<Item = (ShortString, T)>>(iter: I) -> Self {
+        let mut table = Self::default();
+        let _ = table.extend(iter);
+        table
+    }
+}
+
+impl<Idx: AsRef<str>, T: DefaultRef + 'static> ops::Index<Idx> for SymbolTable<'_, T> {
+    type Output = T;
+
+    /// Same as [SymbolTable::get] but we returns a reference to a default value if the variable was not found.
+    fn index(&self, index: Idx) -> &Self::Output {
+        self.get(index).unwrap_or_else(|| T::default_ref())
+    }
+}
+
+impl<'a> SymbolTable<'a, crate::ast::TypeInfo> {
+    /// Create a new type symbol table, e.g. a [SymbolTable] where the values are
+    /// [crate::ast::TypeInfo]. This can be usefull for type checking passes.
+    pub fn new(ast: &crate::ast::Ast, options: Option<&crate::ast::OptionTable>) -> Self {
+        todo!()
+    }
+}
diff --git a/src/Rust/vvs_parser/vivy-script.vim b/src/Rust/vvs_parser/vivy-script.vim
new file mode 100644
index 00000000..f5ccddb8
--- /dev/null
+++ b/src/Rust/vvs_parser/vivy-script.vim
@@ -0,0 +1,37 @@
+if exists('b:current_syntax') | finish |  endif
+let b:current_syntax = 'vivy script'
+
+syn keyword VVKeywords          option import set repeat main end do then typeof yield
+syn keyword VVKeywords          for while if else return local in elseif elif until
+syn keyword VVOperators         or xor not and mod
+syn keyword VVBoolean           true false
+syn keyword VVSelf              self
+
+syn keyword VVDeclCallable      function job nextgroup=VVSDeclCallableName
+syn match   VVDeclCallableName  '[a-zA-Z_][a-zA-Z_0-9]*\ze('
+syn match   VVType              ':\ *\zs[a-zA-Z_][a-zA-Z_0-9]*\(<[a-zA-Z_][a-zA-Z_0-9]*>\)\?'
+
+syn region  VVString1           start=/"/ skip=/\\"/ end=/"/
+syn region  VVString2           start=/'/ skip=/\\'/ end=/'/
+syn region  VVString3           start=/\[\[/ end=/\]\]/
+syn match   VVNumber            /-\?\<\d\+\.\d*\(e[+-]\d\+\)\?\>/
+syn match   VVNumber            /-\?\<\d\+\>/
+
+syn match   VVComment1          "--\(-\)\?.*$"
+syn region  VVComment2          start="--\(-\)\?\[\[*" end="\]\]"
+
+syn match   VVVariable          '[A-Z_][A-Z_0-9]*'
+
+hi def link VVDeclCallable      Keyword
+hi def link VVDeclCallableName  Function
+hi def link VVKeywords          Keyword
+hi def link VVOperators         Keyword
+hi def link VVSelf              Constant
+hi def link VVType              Type
+hi def link VVComment1          Comment
+hi def link VVComment2          Comment
+hi def link VVNumber            Float
+hi def link VVBoolean           Boolean
+hi def link VVString1           String
+hi def link VVString2           String
+hi def link VVString3           String
diff --git a/src/Rust/vvs_parser_derive/Cargo.toml b/src/Rust/vvs_parser_derive/Cargo.toml
new file mode 100644
index 00000000..f25fee11
--- /dev/null
+++ b/src/Rust/vvs_parser_derive/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name        = "vvs_parser_derive"
+license     = "MPL-2.0"
+description = "Internally used for the vvs_parser project. Do not use."
+
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+
+[lib]
+proc-macro = true
+
+[dependencies]
+indexmap.workspace    = true
+proc-macro2.workspace = true
+quote.workspace       = true
+
+syn = { version = "1", features = ["extra-traits"] }
diff --git a/src/Rust/vvs_parser_derive/LICENSE.md b/src/Rust/vvs_parser_derive/LICENSE.md
new file mode 100644
index 00000000..2b8bbd45
--- /dev/null
+++ b/src/Rust/vvs_parser_derive/LICENSE.md
@@ -0,0 +1,347 @@
+Mozilla Public License Version 2.0
+==================================
+
+### 1. Definitions
+
+**1.1. “Contributor”**
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+**1.2. “Contributor Version”**
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+**1.3. “Contribution”**
+    means Covered Software of a particular Contributor.
+
+**1.4. “Covered Software”**
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+**1.5. “Incompatible With Secondary Licenses”**
+    means
+
+* **(a)** that the initial Contributor has attached the notice described
+    in Exhibit B to the Covered Software; or
+* **(b)** that the Covered Software was made available under the terms of
+    version 1.1 or earlier of the License, but not also under the
+    terms of a Secondary License.
+
+**1.6. “Executable Form”**
+    means any form of the work other than Source Code Form.
+
+**1.7. “Larger Work”**
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+**1.8. “License”**
+    means this document.
+
+**1.9. “Licensable”**
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+**1.10. “Modifications”**
+    means any of the following:
+
+* **(a)** any file in Source Code Form that results from an addition to,
+    deletion from, or modification of the contents of Covered
+    Software; or
+* **(b)** any new file in Source Code Form that contains any Covered
+    Software.
+
+**1.11. “Patent Claims” of a Contributor**
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+**1.12. “Secondary License”**
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+**1.13. “Source Code Form”**
+    means the form of the work preferred for making modifications.
+
+**1.14. “You” (or “Your”)**
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, “You” includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, “control” means **(a)** the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or **(b)** ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+### 2. License Grants and Conditions
+
+#### 2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+* **(a)** under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+* **(b)** under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+#### 2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+#### 2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+* **(a)** for any code that a Contributor has removed from Covered Software;
+    or
+* **(b)** for infringements caused by: **(i)** Your and any other third party's
+    modifications of Covered Software, or **(ii)** the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+* **(c)** under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+#### 2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+#### 2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+#### 2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+#### 2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+### 3. Responsibilities
+
+#### 3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+#### 3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+* **(a)** such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+* **(b)** You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+#### 3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+#### 3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+#### 3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+### 4. Inability to Comply Due to Statute or Regulation
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: **(a)** comply with
+the terms of this License to the maximum extent possible; and **(b)**
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+### 5. Termination
+
+**5.1.** The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated **(a)** provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and **(b)** on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+**5.2.** If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+**5.3.** In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+### 6. Disclaimer of Warranty
+
+> Covered Software is provided under this License on an “as is”
+> basis, without warranty of any kind, either expressed, implied, or
+> statutory, including, without limitation, warranties that the
+> Covered Software is free of defects, merchantable, fit for a
+> particular purpose or non-infringing. The entire risk as to the
+> quality and performance of the Covered Software is with You.
+> Should any Covered Software prove defective in any respect, You
+> (not any Contributor) assume the cost of any necessary servicing,
+> repair, or correction. This disclaimer of warranty constitutes an
+> essential part of this License. No use of any Covered Software is
+> authorized under this License except under this disclaimer.
+
+### 7. Limitation of Liability
+
+> Under no circumstances and under no legal theory, whether tort
+> (including negligence), contract, or otherwise, shall any
+> Contributor, or anyone who distributes Covered Software as
+> permitted above, be liable to You for any direct, indirect,
+> special, incidental, or consequential damages of any character
+> including, without limitation, damages for lost profits, loss of
+> goodwill, work stoppage, computer failure or malfunction, or any
+> and all other commercial damages or losses, even if such party
+> shall have been informed of the possibility of such damages. This
+> limitation of liability shall not apply to liability for death or
+> personal injury resulting from such party's negligence to the
+> extent applicable law prohibits such limitation. Some
+> jurisdictions do not allow the exclusion or limitation of
+> incidental or consequential damages, so this exclusion and
+> limitation may not apply to You.
+
+### 8. Litigation
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+### 9. Miscellaneous
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+### 10. Versions of the License
+
+#### 10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+#### 10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+#### 10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+#### 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+## Exhibit A - Source Code Form License Notice
+
+    This Source Code Form is subject to the terms of the Mozilla Public
+    License, v. 2.0. If a copy of the MPL was not distributed with this
+    file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+## Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+    This Source Code Form is "Incompatible With Secondary Licenses", as
+    defined by the Mozilla Public License, v. 2.0.
diff --git a/src/Rust/vvs_parser_derive/src/derive.rs b/src/Rust/vvs_parser_derive/src/derive.rs
new file mode 100644
index 00000000..4d6c5cf9
--- /dev/null
+++ b/src/Rust/vvs_parser_derive/src/derive.rs
@@ -0,0 +1,139 @@
+use proc_macro2::TokenStream;
+use quote::{format_ident, quote};
+use syn::{parse_macro_input, DeriveInput};
+
+pub trait DeriveGenerator: EnumGenerator + StructGenerator {
+    fn complete(input: &syn::DeriveInput, tokens: TokenStream) -> TokenStream;
+
+    fn derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
+        let input = parse_macro_input!(input as DeriveInput);
+
+        let expanded = match &input.data {
+            syn::Data::Enum(data) => <Self as EnumGenerator>::generate(&input.ident, data),
+            syn::Data::Struct(data) => <Self as StructGenerator>::generate(&input.ident, data),
+            _ => unimplemented!(),
+        };
+
+        Self::complete(&input, expanded).into()
+    }
+}
+
+pub trait EnumGenerator {
+    fn generate(input: &syn::Ident, enumm: &syn::DataEnum) -> TokenStream;
+}
+
+pub trait StructGenerator {
+    fn generate(input: &syn::Ident, strukt: &syn::DataStruct) -> TokenStream;
+}
+
+pub trait MatchEnumGenerator {
+    const DEREF: bool = false;
+    const SELF: &'static str = "self";
+
+    fn complete(input: TokenStream) -> TokenStream {
+        input
+    }
+
+    fn case_named(_input: &syn::Ident, _variant: &syn::Ident, _fields: &syn::FieldsNamed) -> TokenStream {
+        quote! {}
+    }
+
+    fn case_unnamed(_input: &syn::Ident, _variant: &syn::Ident, _fields: &syn::FieldsUnnamed) -> TokenStream {
+        quote! {}
+    }
+
+    fn case_unit(_input: &syn::Ident, _variant: &syn::Ident) -> TokenStream {
+        quote! {}
+    }
+}
+
+impl<T: MatchEnumGenerator> EnumGenerator for T {
+    fn generate(input_ident: &syn::Ident, enumm: &syn::DataEnum) -> TokenStream {
+        let mut cases = Vec::with_capacity(enumm.variants.len());
+
+        for variant in &enumm.variants {
+            let variant_ident = &variant.ident;
+
+            match &variant.fields {
+                syn::Fields::Named(fields) => {
+                    cases.push(T::case_named(input_ident, variant_ident, fields));
+                }
+
+                syn::Fields::Unnamed(fields) => {
+                    cases.push(T::case_unnamed(input_ident, variant_ident, fields));
+                }
+
+                syn::Fields::Unit => cases.push(T::case_unit(input_ident, variant_ident)),
+            }
+        }
+
+        let self_ident = format_ident!("{}", T::SELF);
+        let deref = if T::DEREF { Some(quote! { * }) } else { None };
+
+        T::complete(quote! {
+            match #deref #self_ident {
+                #(#cases)*
+            }
+        })
+    }
+}
+
+pub trait Hint
+where
+    Self: Sized,
+{
+    fn key_value(_key: String, _value: String) -> Option<Self> {
+        None
+    }
+
+    fn unit(_name: String) -> Option<Self> {
+        None
+    }
+}
+
+pub fn search_hint<T: Hint>(name: &str, attrs: &[syn::Attribute]) -> Option<T> {
+    macro_rules! path_ident {
+        ($path:expr) => {
+            match $path.get_ident() {
+                Some(ident) => ident,
+                None => continue,
+            }
+        };
+    }
+
+    for attr in attrs {
+        let meta = match attr.parse_meta() {
+            Ok(meta) => meta,
+            Err(_) => continue,
+        };
+
+        if path_ident!(meta.path()) != name {
+            continue;
+        };
+
+        if let syn::Meta::List(list) = meta {
+            for nested in list.nested {
+                match nested {
+                    syn::NestedMeta::Meta(syn::Meta::Path(path)) => {
+                        return T::unit(path_ident!(path).to_string());
+                    }
+
+                    syn::NestedMeta::Meta(syn::Meta::NameValue(name_value)) => {
+                        return T::key_value(
+                            path_ident!(name_value.path).to_string(),
+                            match name_value.lit {
+                                syn::Lit::Str(lit_str) => lit_str.value(),
+
+                                other => unimplemented!("nested meta value: {:#?}", other),
+                            },
+                        );
+                    }
+
+                    other => unimplemented!("unknown attribute: {:#?}", other),
+                }
+            }
+        }
+    }
+
+    None
+}
diff --git a/src/Rust/vvs_parser_derive/src/lib.rs b/src/Rust/vvs_parser_derive/src/lib.rs
new file mode 100644
index 00000000..d62ebbc2
--- /dev/null
+++ b/src/Rust/vvs_parser_derive/src/lib.rs
@@ -0,0 +1,21 @@
+#![recursion_limit = "128"]
+
+extern crate proc_macro;
+
+mod derive;
+mod node;
+mod visit;
+
+use derive::DeriveGenerator;
+
+use proc_macro::TokenStream;
+
+#[proc_macro_derive(Visit, attributes(visit))]
+pub fn derive_visit(input: TokenStream) -> TokenStream {
+    visit::VisitGenerator::derive(input)
+}
+
+#[proc_macro_derive(Node, attributes(node))]
+pub fn derive_node(input: TokenStream) -> TokenStream {
+    node::NodeGenerator::derive(input)
+}
diff --git a/src/Rust/vvs_parser_derive/src/node.rs b/src/Rust/vvs_parser_derive/src/node.rs
new file mode 100644
index 00000000..5efb9439
--- /dev/null
+++ b/src/Rust/vvs_parser_derive/src/node.rs
@@ -0,0 +1,429 @@
+use crate::derive::*;
+
+use proc_macro2::TokenStream;
+use quote::{format_ident, quote};
+
+fn token_getter(ty: &syn::Type, ident: &syn::Ident, mut prefix: Option<TokenStream>, deref: bool) -> TokenStream {
+    if let syn::Type::Path(path) = ty {
+        let token_ref = path.path.segments.first().expect("no first segment?");
+
+        // Clippy suggests *cow.ident, which doesn't work
+        #[allow(clippy::cmp_owned)]
+        if token_ref.ident.to_string() == "TokenReference" {
+            return quote! {
+                crate::node::TokenItem::TokenReference(&#prefix #ident)
+            };
+        }
+    }
+
+    if deref {
+        prefix = Some(quote! { * });
+    }
+
+    quote! {
+        crate::node::TokenItem::MoreTokens(&#prefix #ident)
+    }
+}
+
+#[derive(PartialEq)]
+enum NodeHint {
+    FullRange,
+}
+
+impl Hint for NodeHint {
+    fn unit(name: String) -> Option<Self> {
+        if name == "full_range" {
+            Some(NodeHint::FullRange)
+        } else {
+            None
+        }
+    }
+}
+
+pub struct NodeGenerator;
+
+impl DeriveGenerator for NodeGenerator {
+    fn complete(input: &syn::DeriveInput, tokens: TokenStream) -> TokenStream {
+        let input_ident = &input.ident;
+        let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
+
+        let macro_name = format_ident!("NodeGenerator{}", input_ident);
+
+        let pattern = quote! {{
+            range => $range:expr,
+            similar => $similar:expr,
+            tokens => $tokens:expr,
+        }};
+
+        quote! {
+            macro_rules! #macro_name {
+                ("range", #pattern) => {
+                    $range
+                };
+
+                ("similar", #pattern) => {
+                    $similar
+                };
+
+                ("tokens", #pattern) => {
+                    $tokens
+                }
+            }
+
+            impl #impl_generics crate::node::Node #impl_generics for #input_ident #ty_generics #where_clause {
+                fn start_position(&self) -> Option<crate::tokenizer::Position> {
+                    Some(#macro_name!("range", { #tokens })?.0)
+                }
+
+                fn end_position(&self) -> Option<crate::tokenizer::Position> {
+                    Some(#macro_name!("range", { #tokens })?.1)
+                }
+
+                fn similar(&self, other: &Self) -> bool {
+                    #macro_name!("similar", { #tokens })
+                }
+
+                fn tokens<'a>(&'a self) -> crate::node::Tokens<'a> {
+                    #macro_name!("tokens", { #tokens })
+                }
+            }
+
+            impl #impl_generics crate::private::Sealed for #input_ident #ty_generics #where_clause {}
+        }
+    }
+}
+
+impl StructGenerator for NodeGenerator {
+    fn generate(ident: &syn::Ident, strukt: &syn::DataStruct) -> TokenStream {
+        let range = StructRangeGenerator::generate(ident, strukt);
+        let similar = StructSimilarGenerator::generate(ident, strukt);
+        let tokens = StructTokensGenerator::generate(ident, strukt);
+
+        quote! {
+            range => { #range },
+            similar => { #similar },
+            tokens => { #tokens },
+        }
+    }
+}
+
+pub struct StructRangeGenerator;
+
+impl StructGenerator for StructRangeGenerator {
+    fn generate(_: &syn::Ident, strukt: &syn::DataStruct) -> TokenStream {
+        let fields = strukt
+            .fields
+            .iter()
+            .map(|field| field.ident.as_ref().unwrap())
+            .collect::<Vec<_>>();
+
+        let full_range = strukt
+            .fields
+            .iter()
+            .find(|field| search_hint("node", &field.attrs) == Some(NodeHint::FullRange));
+
+        if let Some(full_range) = full_range {
+            let ident = full_range.ident.as_ref().unwrap();
+            quote! {
+                self.#ident.range()
+            }
+        } else {
+            let (mut start_position, mut end_position) =
+                (Vec::with_capacity(fields.len()), Vec::with_capacity(fields.len()));
+
+            for field in &fields {
+                start_position.push(quote! {
+                    .or_else(|| {
+                        self.#field.start_position()
+                    })
+                });
+            }
+
+            for field in fields.iter().rev() {
+                end_position.push(quote! {
+                    .or_else(|| {
+                        self.#field.end_position()
+                    })
+                });
+            }
+
+            quote! {
+                Some((None #(#start_position)*?, None #(#end_position)*?))
+            }
+        }
+    }
+}
+
+pub struct StructSimilarGenerator;
+
+impl StructGenerator for StructSimilarGenerator {
+    fn generate(_: &syn::Ident, strukt: &syn::DataStruct) -> TokenStream {
+        let fields = strukt
+            .fields
+            .iter()
+            .map(|field| field.ident.as_ref().unwrap())
+            .collect::<Vec<_>>();
+
+        quote! {
+            #(
+                self.#fields.similar(&other.#fields) &&
+            )* true
+        }
+    }
+}
+
+pub struct StructTokensGenerator;
+
+impl StructGenerator for StructTokensGenerator {
+    fn generate(_: &syn::Ident, strukt: &syn::DataStruct) -> TokenStream {
+        let mut getters = Vec::with_capacity(strukt.fields.len());
+
+        for field in &strukt.fields {
+            getters.push(token_getter(
+                &field.ty,
+                field.ident.as_ref().unwrap(),
+                Some(quote! {
+                    self.
+                }),
+                false,
+            ));
+        }
+
+        quote! {
+            crate::node::Tokens {
+                items: vec![#(
+                    #getters,
+                )*],
+            }
+        }
+    }
+}
+
+impl EnumGenerator for NodeGenerator {
+    fn generate(ident: &syn::Ident, enumm: &syn::DataEnum) -> TokenStream {
+        let range = EnumRangeGenerator::generate(ident, enumm);
+        let similar = EnumSimilarGenerator::generate(ident, enumm);
+        let tokens = EnumTokensGenerator::generate(ident, enumm);
+
+        quote! {
+            range => {
+                #[allow(unused)]
+                #range
+            },
+
+            similar => { #similar },
+            tokens => { #tokens },
+        }
+    }
+}
+
+pub struct EnumRangeGenerator;
+
+impl MatchEnumGenerator for EnumRangeGenerator {
+    fn case_named(input: &syn::Ident, variant: &syn::Ident, named: &syn::FieldsNamed) -> TokenStream {
+        let fields = named
+            .named
+            .iter()
+            .map(|field| field.ident.as_ref().unwrap())
+            .collect::<Vec<_>>();
+
+        let full_range = named
+            .named
+            .iter()
+            .find(|field| search_hint("node", &field.attrs) == Some(NodeHint::FullRange));
+
+        let body = if let Some(full_range) = full_range {
+            let ident = full_range.ident.as_ref().unwrap();
+            quote! {
+                #ident.range()
+            }
+        } else {
+            let (mut start_position, mut end_position) =
+                (Vec::with_capacity(fields.len()), Vec::with_capacity(fields.len()));
+
+            for field in &fields {
+                start_position.push(quote! {
+                    .or_else(|| {
+                        #field.start_position()
+                    })
+                });
+            }
+
+            for field in fields.iter().rev() {
+                end_position.push(quote! {
+                    .or_else(|| {
+                        #field.end_position()
+                    })
+                });
+            }
+
+            quote! {
+                Some((None #(#start_position)*?, None #(#end_position)*?))
+            }
+        };
+
+        quote! {
+            #input::#variant {
+                #(#fields,)*
+            } => {
+                #body
+            }
+        }
+    }
+
+    fn case_unnamed(input: &syn::Ident, variant: &syn::Ident, fields: &syn::FieldsUnnamed) -> TokenStream {
+        let fields = &fields.unnamed;
+
+        if fields.len() == 1 {
+            quote! {
+                #input::#variant(inner) => {
+                    Some((inner.start_position()?, inner.end_position()?))
+                }
+            }
+        } else {
+            let fields_count = fields.len() - 1;
+            let field_match: Vec<_> = fields
+                .iter()
+                .enumerate()
+                .map(|(index, _)| {
+                    syn::Ident::new(
+                        match index {
+                            0 => "first",
+                            _x if _x == fields_count => "last",
+                            _ => "_",
+                        },
+                        variant.span(),
+                    )
+                })
+                .collect();
+
+            quote! {
+                #input::#variant(
+                    #(#field_match,)*
+                ) => {
+                    Some((first.start_position()?, last.end_position()?))
+                }
+            }
+        }
+    }
+}
+
+pub struct EnumSimilarGenerator;
+
+impl MatchEnumGenerator for EnumSimilarGenerator {
+    fn case_named(input: &syn::Ident, variant: &syn::Ident, named: &syn::FieldsNamed) -> TokenStream {
+        let fields = named
+            .named
+            .iter()
+            .map(|field| field.ident.as_ref().unwrap())
+            .collect::<Vec<_>>();
+
+        let other_fields: Vec<_> = fields.iter().map(|ident| format_ident!("other_{}", ident)).collect();
+
+        quote! {
+            #input::#variant {
+                #(#fields,)*
+            } => {
+                if let #input::#variant {
+                    #(
+                        #fields: #other_fields,
+                    )*
+                } = &other {
+                    #(
+                        #fields.similar(#other_fields) &&
+                    )* true
+                } else {
+                    false
+                }
+            }
+        }
+    }
+
+    fn case_unnamed(input: &syn::Ident, variant: &syn::Ident, fields: &syn::FieldsUnnamed) -> TokenStream {
+        let fields: Vec<_> = fields
+            .unnamed
+            .iter()
+            .enumerate()
+            .map(|(index, _)| format_ident!("__self_{}", index))
+            .collect();
+
+        let other_fields: Vec<_> = fields.iter().map(|ident| format_ident!("other_{}", ident)).collect();
+
+        quote! {
+            #input::#variant(
+                #(#fields,)*
+            ) => {
+                if let #input::#variant(#(#other_fields,)*) = &other {
+                    #(
+                        #fields.similar(#other_fields) &&
+                    )* true
+                } else {
+                    false
+                }
+            }
+        }
+    }
+
+    fn case_unit(input: &syn::Ident, variant: &syn::Ident) -> TokenStream {
+        quote! {
+            #input::#variant => other == #input::#variant
+        }
+    }
+}
+
+pub struct EnumTokensGenerator;
+
+impl MatchEnumGenerator for EnumTokensGenerator {
+    const DEREF: bool = true;
+
+    fn case_named(input: &syn::Ident, variant: &syn::Ident, named: &syn::FieldsNamed) -> TokenStream {
+        let named = &named.named;
+
+        let mut fields = Vec::with_capacity(named.len());
+        let mut getters = Vec::with_capacity(named.len());
+
+        for field in named {
+            fields.push(field.ident.as_ref().unwrap());
+            getters.push(token_getter(&field.ty, field.ident.as_ref().unwrap(), None, true));
+        }
+
+        quote! {
+            #input::#variant {
+                #(ref #fields,)*
+            } => {
+                crate::node::Tokens {
+                    items: vec![#(
+                        #getters,
+                    )*],
+                }
+            }
+        }
+    }
+
+    fn case_unnamed(input: &syn::Ident, variant: &syn::Ident, fields: &syn::FieldsUnnamed) -> TokenStream {
+        let names: Vec<_> = fields
+            .unnamed
+            .iter()
+            .enumerate()
+            .map(|(index, _)| format_ident!("__self_{}", index))
+            .collect();
+
+        let mut getters = Vec::with_capacity(fields.unnamed.len());
+
+        for (field, name) in fields.unnamed.iter().zip(&names) {
+            getters.push(token_getter(&field.ty, name, None, true));
+        }
+
+        quote! {
+            #input::#variant(
+                #(ref #names,)*
+             ) => {
+                crate::node::Tokens {
+                    items: vec![#(
+                        #getters,
+                    )*],
+                }
+            }
+        }
+    }
+}
diff --git a/src/Rust/vvs_parser_derive/src/visit.rs b/src/Rust/vvs_parser_derive/src/visit.rs
new file mode 100644
index 00000000..2eb585ca
--- /dev/null
+++ b/src/Rust/vvs_parser_derive/src/visit.rs
@@ -0,0 +1,264 @@
+use crate::derive::*;
+use proc_macro2::TokenStream;
+use quote::{format_ident, quote};
+use std::collections::HashMap;
+
+// Not 100% accurate, but it is to full-moon's codebase
+fn snake_case(pascal_case: &str) -> String {
+    let mut chars = pascal_case.chars();
+    let mut result = chars.next().unwrap().to_ascii_lowercase().to_string();
+
+    for character in chars {
+        if character.is_ascii_uppercase() {
+            result.push('_');
+            result.push(character.to_ascii_lowercase());
+        } else {
+            result.push(character);
+        }
+    }
+
+    result
+}
+
+#[derive(Debug, PartialEq)]
+enum VisitHint {
+    Contains(String),
+    Skip,
+    SkipVisitSelf,
+    VisitAs(String),
+}
+
+impl Hint for VisitHint {
+    fn key_value(key: String, value: String) -> Option<Self> {
+        if key == "visit_as" {
+            Some(VisitHint::VisitAs(value))
+        } else if key == "contains" {
+            Some(VisitHint::Contains(value))
+        } else {
+            None
+        }
+    }
+
+    fn unit(name: String) -> Option<Self> {
+        match name.as_str() {
+            "skip" => Some(VisitHint::Skip),
+            "skip_visit_self" => Some(VisitHint::SkipVisitSelf),
+            _ => None,
+        }
+    }
+}
+
+pub struct VisitGenerator;
+
+impl VisitGenerator {
+    fn visit_fields(data_fields: &syn::Fields, prefix: TokenStream) -> TokenStream {
+        let mut fields = Vec::new();
+        let mut contains = HashMap::new();
+
+        for field in data_fields
+            .iter()
+            .filter(|field| search_hint("visit", &field.attrs) != Some(VisitHint::Skip))
+        {
+            let ident = field.ident.as_ref().unwrap();
+            let token_stream = quote! { #prefix #ident };
+
+            if let Some(VisitHint::Contains(contains_node)) = search_hint("visit", &field.attrs) {
+                contains.insert(contains_node, ident);
+            } else if let Some(contains_me) = contains.remove(&ident.to_string()) {
+                fields.push(quote! {
+                    #prefix #contains_me.tokens.0
+                });
+
+                fields.push(token_stream);
+
+                fields.push(quote! {
+                    #prefix #contains_me.tokens.1
+                });
+            } else {
+                fields.push(token_stream);
+            }
+        }
+
+        assert!(contains.is_empty(), "#[visit(contains = \"...\")] used in wrong order: {contains:?}",);
+
+        quote! {
+            #(visit!(#fields, visitor);)*
+        }
+    }
+}
+
+impl DeriveGenerator for VisitGenerator {
+    fn complete(input: &syn::DeriveInput, tokens: TokenStream) -> TokenStream {
+        let input_ident = &input.ident;
+        let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
+
+        let (visit_self, visit_self_end) = match search_hint("visit", &input.attrs) {
+            Some(VisitHint::SkipVisitSelf) => (quote! {}, quote! {}),
+            Some(VisitHint::VisitAs(visit_as)) => {
+                let visit_as_end = syn::Ident::new(&format!("visit_{visit_as}_end"), input_ident.span());
+                let visit_as = syn::Ident::new(&format!("visit_{visit_as}"), input_ident.span());
+
+                (
+                    quote! {
+                        visit_self!(#visit_as);
+                    },
+                    quote! {
+                        visit_self!(#visit_as_end);
+                    },
+                )
+            }
+            _ => {
+                // name of self in snake_case
+                let ssself =
+                    syn::Ident::new(&format!("visit_{}", snake_case(&input_ident.to_string())), input_ident.span());
+
+                let ssself_end =
+                    syn::Ident::new(&format!("visit_{}_end", snake_case(&input_ident.to_string())), input_ident.span());
+
+                (
+                    quote! {
+                        visit_self!(#ssself);
+                    },
+                    quote! {
+                        visit_self!(#ssself_end);
+                    },
+                )
+            }
+        };
+
+        quote! {
+            #[allow(unused_macros)]
+            impl #impl_generics crate::visitors::Visit for #input_ident #ty_generics #where_clause {
+                fn visit<V: crate::visitors::Visitor>(&self, visitor: &mut V) {
+                    macro_rules! visit {
+                        ($visit_what: expr, $visitor: expr) => {
+                            $visit_what.visit($visitor);
+                        }
+                    }
+
+                    macro_rules! visit_self {
+                        ($name: ident) => {
+                            visitor.$name(self);
+                        }
+                    }
+
+                    macro_rules! set_self {
+                        ($value: expr) => {
+                            $value;
+                        }
+                    }
+
+                    macro_rules! if_visit {
+                        ({ $($used: expr)* } else { $($unused: expr)* }) => {
+                            {
+                                $($used;)*
+                            }
+                        }
+                    }
+
+                    #visit_self
+                    #tokens
+                    #visit_self_end
+                }
+            }
+
+            #[allow(unused_macros)]
+            impl #impl_generics crate::visitors::VisitMut for #input_ident #ty_generics #where_clause {
+                fn visit_mut<V: crate::visitors::VisitorMut>(mut self, visitor: &mut V) -> Self {
+                    macro_rules! visit {
+                        ($visit_what: expr, $visitor: expr) => {
+                            $visit_what = $visit_what.visit_mut($visitor);
+                        }
+                    }
+
+                    macro_rules! visit_self {
+                        ($name: ident) => {
+                            self = visitor.$name(self);
+                        }
+                    }
+
+                    macro_rules! set_self {
+                        ($value: expr) => {
+                            self = $value;
+                        }
+                    }
+
+                    macro_rules! if_visit {
+                        ({ $($unused: expr)* } else { $($used: expr)* }) => {
+                            $($used)*
+                        }
+                    }
+
+                    #visit_self
+                    #tokens
+                    #visit_self_end
+                    self
+                }
+            }
+        }
+    }
+}
+
+impl StructGenerator for VisitGenerator {
+    fn generate(_: &syn::Ident, strukt: &syn::DataStruct) -> TokenStream {
+        Self::visit_fields(&strukt.fields, quote! {self.})
+    }
+}
+
+impl MatchEnumGenerator for VisitGenerator {
+    fn complete(input: TokenStream) -> TokenStream {
+        quote! {
+            set_self!(#input);
+        }
+    }
+
+    fn case_named(input: &syn::Ident, variant: &syn::Ident, named: &syn::FieldsNamed) -> TokenStream {
+        let fields: Vec<_> = named.named.iter().map(|field| field.ident.as_ref().unwrap()).collect();
+
+        quote! {
+            #input::#variant {
+                #(#fields,)*
+            } => {
+                if_visit!({
+                    #(
+                        #fields.visit(visitor)
+                    )*
+                } else {
+                    #input::#variant {
+                        #(
+                            #fields: #fields.visit_mut(visitor),
+                        )*
+                    }
+                })
+            }
+        }
+    }
+
+    fn case_unnamed(input: &syn::Ident, variant: &syn::Ident, fields: &syn::FieldsUnnamed) -> TokenStream {
+        let fields: Vec<_> = fields
+            .unnamed
+            .iter()
+            .enumerate()
+            .map(|(index, _)| format_ident!("__self_{}", index))
+            .collect();
+        let fields = &fields;
+
+        quote! {
+            #input::#variant(
+                #(#fields,)*
+            ) => {
+                if_visit!({
+                    #(
+                        #fields.visit(visitor)
+                    )*
+                } else {
+                    #input::#variant(
+                        #(
+                            #fields.visit_mut(visitor),
+                        )*
+                    )
+                })
+            }
+        }
+    }
+}
diff --git a/src/Rust/vvs_procmacro/Cargo.toml b/src/Rust/vvs_procmacro/Cargo.toml
index 3e99f27c..a2e00d0e 100644
--- a/src/Rust/vvs_procmacro/Cargo.toml
+++ b/src/Rust/vvs_procmacro/Cargo.toml
@@ -1,15 +1,17 @@
 [package]
-name = "vvs_procmacro"
+name              = "vvs_procmacro"
+description       = "The procmacro utility crate for VVS"
 version.workspace = true
 authors.workspace = true
 edition.workspace = true
 license.workspace = true
-description = "The procmacro utility crate for VVS"
 
 [lib]
 proc-macro = true
 
 [dependencies]
-syn = { version = "2.0", features = ["full"] }
-quote = "1.0"
-proc-macro2 = "1.0"
+quote.workspace       = true
+proc-macro2.workspace = true
+anyhow.workspace      = true
+
+syn = { version = "2", features = ["full"] }
diff --git a/src/Rust/vvs_procmacro/src/enums.rs b/src/Rust/vvs_procmacro/src/enums.rs
new file mode 100644
index 00000000..54d115ed
--- /dev/null
+++ b/src/Rust/vvs_procmacro/src/enums.rs
@@ -0,0 +1,62 @@
+//! Implement what is needed to make life easier with C-like enums in Rust.
+
+use proc_macro2::*;
+use quote::*;
+
+pub(crate) fn impl_derive_enum_variant_count(syn_item: syn::DeriveInput) -> TokenStream {
+    let (len, name) = match syn_item.data {
+        syn::Data::Enum(enum_item) => (
+            enum_item.variants.len(),
+            Ident::new(&format!("{}_LENGTH", syn_item.ident.to_string().to_uppercase()), syn_item.ident.span()),
+        ),
+        _ => panic!("EnumVariantCount only works on Enums"),
+    };
+    quote! { pub const #name : usize = #len; }
+}
+
+pub(crate) fn impl_derive_enum_variant_iter(syn_item: syn::DeriveInput) -> TokenStream {
+    let (enum_name, name, content) = match syn_item.data {
+        syn::Data::Enum(enum_item) => {
+            let variants = enum_item
+                .variants
+                .into_iter()
+                .map(|variant| format!("{}::{}", syn_item.ident, variant.ident));
+            let variants = variants.collect::<Vec<_>>().join(", ");
+            (
+                syn_item.ident.clone(),
+                Ident::new(&format!("{}_VALUES", syn_item.ident.to_string().to_uppercase()), syn_item.ident.span()),
+                syn::parse_str::<syn::Expr>(&format!("&[ {variants} ]"))
+                    .expect("failed generation of enum's variant list"),
+            )
+        }
+        _ => panic!("EnumVariantIter only works on Enums"),
+    };
+    quote! { pub const #name : &[#enum_name] = #content; }
+}
+
+pub(crate) fn impl_derive_enum_variant_from_str(syn_item: syn::DeriveInput) -> TokenStream {
+    let enum_item = match syn_item.data {
+        syn::Data::Enum(enum_item) => enum_item,
+        _ => panic!("EnumVariantFromStr only works on Enums"),
+    };
+    let name = syn_item.ident;
+    let match_branches = enum_item
+        .variants
+        .into_iter()
+        .map(|variant| format!("{:?} => Ok({name}::{}),", variant.ident.to_string().to_lowercase(), variant.ident))
+        .chain(Some("_ => Err(format!(\"unknown field '{{s}}'\")),".to_string()))
+        .collect::<Vec<_>>()
+        .join("");
+    let match_branches =
+        syn::parse_str::<syn::Expr>(&format!("match s.trim().to_lowercase().as_str() {{ {match_branches} }}"))
+            .expect("failed generation of enum's FromStr implementation");
+    quote! {
+        impl std::str::FromStr for #name {
+            type Err = std::string::String;
+            fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
+                #match_branches
+            }
+
+        }
+    }
+}
diff --git a/src/Rust/vvs_procmacro/src/lib.rs b/src/Rust/vvs_procmacro/src/lib.rs
index 64bbd40d..3085206b 100644
--- a/src/Rust/vvs_procmacro/src/lib.rs
+++ b/src/Rust/vvs_procmacro/src/lib.rs
@@ -1,85 +1,63 @@
-#![forbid(unsafe_code)]
+mod enums;
+mod vvrt;
 
 use proc_macro::TokenStream;
-use proc_macro2::*;
-use quote::*;
-use syn::{parse_macro_input, DeriveInput};
+use quote::quote;
+use syn::parse_macro_input;
 
 #[proc_macro_derive(EnumVariantCount)]
 pub fn derive_enum_variant_count(input: TokenStream) -> TokenStream {
-    let syn_item = parse_macro_input!(input as DeriveInput);
-    let (len, name) = match syn_item.data {
-        syn::Data::Enum(enum_item) => (
-            enum_item.variants.len(),
-            Ident::new(
-                &format!("{}_LENGTH", syn_item.ident.to_string().to_uppercase()),
-                syn_item.ident.span(),
-            ),
-        ),
-        _ => panic!("EnumVariantCount only works on Enums"),
-    };
-    quote! { pub const #name : usize = #len; }.into()
+    let input = parse_macro_input!(input as syn::DeriveInput);
+    enums::impl_derive_enum_variant_count(input).into()
 }
 
 #[proc_macro_derive(EnumVariantIter)]
 pub fn derive_enum_variant_iter(input: TokenStream) -> TokenStream {
-    let syn_item = parse_macro_input!(input as DeriveInput);
-    let (enum_name, name, content) = match syn_item.data {
-        syn::Data::Enum(enum_item) => (
-            syn_item.ident.clone(),
-            Ident::new(
-                &format!("{}_VALUES", syn_item.ident.to_string().to_uppercase()),
-                syn_item.ident.span(),
-            ),
-            syn::parse_str::<syn::Expr>(&format!(
-                "&[ {} ]",
-                enum_item
-                    .variants
-                    .into_iter()
-                    .map(|variant| format!("{}::{}", syn_item.ident, variant.ident))
-                    .collect::<Vec<_>>()
-                    .join(", "),
-            ))
-            .expect("failed generation of enum's variant list"),
-        ),
-        _ => panic!("EnumVariantIter only works on Enums"),
-    };
-    quote! { pub const #name : &[#enum_name] = #content; }.into()
+    let input = parse_macro_input!(input as syn::DeriveInput);
+    enums::impl_derive_enum_variant_iter(input).into()
 }
 
 #[proc_macro_derive(EnumVariantFromStr)]
 pub fn derive_enum_variant_from_str(input: TokenStream) -> TokenStream {
-    let syn_item = parse_macro_input!(input as DeriveInput);
-    let enum_item = match syn_item.data {
-        syn::Data::Enum(enum_item) => enum_item,
-        _ => panic!("EnumVariantFromStr only works on Enums"),
-    };
-    let name = syn_item.ident;
-    let match_branches = enum_item
-        .variants
-        .into_iter()
-        .map(|variant| {
-            format!(
-                "{:?} => Ok({name}::{}),",
-                variant.ident.to_string().to_lowercase(),
-                variant.ident
-            )
-        })
-        .chain(Some("_ => Err(format!(\"unknown field '{{s}}'\")),".to_string()))
-        .collect::<Vec<_>>()
-        .join("");
-    let match_branches = syn::parse_str::<syn::Expr>(&format!(
-        "match s.trim().to_lowercase().as_str() {{ {match_branches} }}"
-    ))
-    .expect("failed generation of enum's FromStr implementation");
-    quote! {
-        impl std::str::FromStr for #name {
-            type Err = std::string::String;
-            fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
-                #match_branches
-            }
+    let input = parse_macro_input!(input as syn::DeriveInput);
+    enums::impl_derive_enum_variant_from_str(input).into()
+}
+
+/// Processes everything to create the export rule for LLVM. We will rename the functions
+/// accordingly.
+///
+/// You need to have the `ManageFunctions` and `Properties` in scope to use this macro.
+///
+/// Re-export what is inside the module for `super`. With the name passed as argument we export the
+/// function `{name}_llvm_properties` that will returns the properties for LLVM.
+#[proc_macro_attribute]
+pub fn vvrt_bridge(arg: TokenStream, input: TokenStream) -> TokenStream {
+    let name = parse_macro_input!(arg as syn::Ident);
+    let module = parse_macro_input!(input as syn::ItemMod);
+
+    let (module, funcs) = vvrt::impl_vvrt_bridge(name.to_string(), module).unwrap();
+    let module_name = &module.ident;
 
-        }
+    let has_clone = funcs.iter().any(|(_, role, ..)| {
+        role.as_ref()
+            .map(|role| matches!(role, vvrt::Role::Clone))
+            .unwrap_or_default()
+    });
+    let has_drop = funcs.iter().any(|(_, role, ..)| {
+        role.as_ref()
+            .map(|role| matches!(role, vvrt::Role::Drop))
+            .unwrap_or_default()
+    });
+    if has_clone ^ has_drop {
+        panic!("you can't have a drop implementation without the clone one, or the other way around")
+    }
+
+    let funcs = vvrt::gen_method_infos(name, funcs).unwrap();
+
+    quote! {
+        #module
+        pub(super) use self::#module_name::*;
+        #funcs
     }
     .into()
 }
diff --git a/src/Rust/vvs_procmacro/src/vvrt/gen.rs b/src/Rust/vvs_procmacro/src/vvrt/gen.rs
new file mode 100644
index 00000000..6ad18aa2
--- /dev/null
+++ b/src/Rust/vvs_procmacro/src/vvrt/gen.rs
@@ -0,0 +1,134 @@
+use crate::vvrt::{MethodInfo, Role, Type};
+use anyhow::bail;
+use proc_macro2::TokenStream;
+use quote::quote;
+
+fn gen_type_call(ty: &Type, arg: &syn::Ident) -> TokenStream {
+    match ty {
+        Type::None => quote! { LLVMVoidTypeInContext(#arg) },
+        Type::Integer => quote! { LLVMInt32TypeInContext(#arg) },
+        Type::Floating => quote! { LLVMFloatTypeInContext(#arg) },
+        Type::Boolean => quote! { LLVMInt1TypeInContext(#arg) },
+        Type::StrPtr => quote! { LLVMPointerTypeInContext(#arg, 0) },
+        Type::VVRT(vvrt) => {
+            let vvrt = syn::Ident::new(vvrt, arg.span());
+            quote! { #vvrt::llvm_type(#arg) }
+        }
+    }
+}
+
+fn get_asttype(ty: &Type) -> TokenStream {
+    match ty {
+        Type::None => quote! { ASTType::Nil },
+        Type::Integer => quote! { ASTType::Integer },
+        Type::Floating => quote! { ASTType::Floating },
+        Type::Boolean => quote! { ASTType::Boolean },
+        Type::StrPtr => quote! { ASTType::String },
+        Type::VVRT("VVRTString") => quote! { ASTType::String },
+        Type::VVRT("VVRTTable") => quote! { ASTType::AnyTable },
+        Type::VVRT("VVRTSeq") => quote! { ASTType::AnySequence },
+        Type::VVRT("VVRTAny") => quote! { ASTType::Any },
+        Type::VVRT("VVRTVariant") => quote! { ASTType::Variant },
+        Type::VVRT("VVRTType") => quote! { ASTType::Integer },
+        Type::VVRT("VVRTLine") => quote! { ASTType::Line },
+        Type::VVRT("VVRTSyllabe") => quote! { ASTType::Syllabe },
+        ty => unreachable!("unknown type {ty:?}"),
+    }
+}
+
+pub(crate) fn gen_method_infos(name: syn::Ident, infos: Vec<MethodInfo>) -> anyhow::Result<TokenStream> {
+    macro_rules! get_manage {
+        ($role: ident) => {
+            infos
+                .iter()
+                .find_map(|(name, role, ..)| matches!(role, Some(Role::$role)).then_some(name.as_str()))
+        };
+    }
+
+    macro_rules! opt_string {
+        ($expr: expr) => {
+            match $expr {
+                None => quote! { None },
+                Some(str) => quote! { Some(#str) },
+            }
+        };
+    }
+
+    macro_rules! quote_vec {
+        ($inner: expr) => {
+            match $inner {
+                Some(inner) => quote! { vec![#inner] },
+                None => quote! { vec![] },
+            }
+        };
+    }
+
+    let arg = syn::Ident::new("c", name.span());
+
+    let manage_len = opt_string!(get_manage!(Len));
+    let manage_eq = opt_string!(get_manage!(Eq));
+
+    let manage = match (get_manage!(Drop), get_manage!(Clone)) {
+        (None, None) => quote! { None },
+        (Some(drop), Some(clone)) => quote! {
+            Some(ManageFunctions {
+                clone: #clone,
+                drop: #drop,
+            })
+        },
+        _ => bail!("clone and drop functions must be present at the same time, or none of them"),
+    };
+
+    let methods = infos.into_iter().map(|(name, _, args, returns)| {
+        let llvm_returns = gen_type_call(&returns, &arg);
+        let llvm_args_len: u32 = args.len().try_into().expect("too many arguments");
+        let llvm_args = quote_vec!(args
+            .iter()
+            .map(|ty| gen_type_call(ty, &arg))
+            .reduce(|acc, item| quote! { #acc, #item }));
+
+        let ast_returns = get_asttype(&returns);
+        let ast_args = quote_vec!(args
+            .into_iter()
+            .map(|ty| get_asttype(&ty))
+            .reduce(|acc, item| quote! { #acc, #item }));
+
+        let func = syn::Ident::new(&name, arg.span());
+
+        quote! {{
+            let func: unsafe extern "C" fn() = unsafe { std::mem::transmute(#func as *const ()) };
+            let mut llvm_args = #llvm_args; // We compute the vector here for safety.
+            let ast_type = ASTType::Function(#ast_args, Box::new(#ast_returns)); // Also needs the ast type.
+            let functy = vvs_llvm::LLVMFunctionType(
+                #llvm_returns,                          // Should be Ok there.
+                llvm_args.as_mut_ptr(), #llvm_args_len, // We pre-computed the length here.
+                0                                       // No variadic functions there.
+            );
+            (#name, (func, functy, ast_type))
+        }}
+    });
+    let methods = quote_vec!(methods.reduce(|acc, item| quote! { #acc, #item }));
+
+    Ok(quote! {
+        impl LLVMExported for #name {
+            unsafe fn llvm_type(c: LLVMContextRef) -> LLVMTypeRef {
+                #[allow(dead_code)]
+                static SIZE_IS_VALID: () = {
+                    assert!(std::mem::size_of::<#name>() == 8);
+                    assert!(std::mem::align_of::<#name>() == 8);
+                };
+                LLVMPointerTypeInContext(c, 0)
+            }
+
+            unsafe fn llvm_properties(c: LLVMContextRef) -> Properties {
+                use vvs_lang::ast::ASTType;
+                Properties {
+                    manage: #manage,
+                    equality: #manage_eq,
+                    len: #manage_len,
+                    methods: hashbrown::HashMap::from_iter(#methods),
+                }
+            }
+        }
+    })
+}
diff --git a/src/Rust/vvs_procmacro/src/vvrt/mod.rs b/src/Rust/vvs_procmacro/src/vvrt/mod.rs
new file mode 100644
index 00000000..d4b671d0
--- /dev/null
+++ b/src/Rust/vvs_procmacro/src/vvrt/mod.rs
@@ -0,0 +1,75 @@
+//! Utility macros used in the Vivy Script Runtime.
+
+mod gen;
+mod structs;
+
+pub(crate) use self::{gen::*, structs::*};
+
+use anyhow::anyhow;
+use proc_macro2::{Ident, TokenStream, TokenTree};
+use quote::quote;
+use quote::ToTokens;
+use syn::{
+    token::{Pub, Unsafe},
+    Generics, Visibility,
+};
+
+fn handle_function(name: &str, func: &mut syn::ItemFn) -> anyhow::Result<MethodInfo> {
+    func.vis = Visibility::Public(Pub::default());
+    func.sig.asyncness = None;
+    func.sig.unsafety = Some(Unsafe::default());
+    func.sig.constness = None;
+    func.sig.variadic = None;
+    func.sig.generics = Generics::default();
+
+    let func_name = func.sig.ident.to_string().to_lowercase();
+    let role = Role::try_from(func_name.as_str()).ok();
+    let func_name = format!("{name}_{}", func_name);
+    func.sig.ident = Ident::new(&func_name, func.sig.ident.span());
+
+    let args = func.sig.inputs.iter().map(|inputs| {
+        Type::try_from(
+            syn::parse2::<syn::Type>(
+                inputs
+                    .to_token_stream()
+                    .into_iter()
+                    .skip_while(|tok| !matches!(tok, TokenTree::Punct(p) if p.as_char() == ':'))
+                    .skip(1)
+                    .collect::<TokenStream>(),
+            )
+            .unwrap(),
+        )
+    });
+    let args = args.collect::<Result<Vec<_>, _>>()?;
+
+    // Skip the arrow
+    let returns = if func.sig.output.to_token_stream().into_iter().count().eq(&0) {
+        Type::None
+    } else {
+        let returns = func.sig.output.to_token_stream().into_iter().skip(2);
+        Type::try_from(syn::parse2::<syn::Type>(returns.collect())?)?
+    };
+
+    Ok((func_name, role, args, returns))
+}
+
+pub(crate) fn impl_vvrt_bridge(
+    name: String,
+    mut module: syn::ItemMod,
+) -> anyhow::Result<(syn::ItemMod, Vec<MethodInfo>)> {
+    if let Some((_, items)) = module.content.as_mut() {
+        let funcs = items.iter_mut().map(|item| match item {
+            syn::Item::Fn(item) => handle_function(&name, item).map(Some),
+            _ => Ok(None),
+        });
+        let funcs = funcs
+            .collect::<Result<Vec<_>, _>>()?
+            .into_iter()
+            .flatten()
+            .collect::<Vec<_>>();
+        items.push(syn::parse2(quote! { use super::*; })?);
+        Ok((module, funcs))
+    } else {
+        Err(anyhow!("expected a module"))
+    }
+}
diff --git a/src/Rust/vvs_procmacro/src/vvrt/structs.rs b/src/Rust/vvs_procmacro/src/vvrt/structs.rs
new file mode 100644
index 00000000..3ca09db6
--- /dev/null
+++ b/src/Rust/vvs_procmacro/src/vvrt/structs.rs
@@ -0,0 +1,69 @@
+use anyhow::anyhow;
+use quote::ToTokens;
+
+pub(crate) type MethodInfo = (String, Option<Role>, Vec<Type>, Type);
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub(crate) enum Role {
+    Clone,
+    Eq,
+    Drop,
+    Len,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+#[allow(clippy::upper_case_acronyms)]
+pub(crate) enum Type {
+    /// Void, None, Null, etc.
+    None,
+
+    /// Special type for the `*const u8` type. We only have const pointers here. This is used to
+    /// create strings from static slices...
+    StrPtr,
+
+    /// Integers, we use 32 bit integers.
+    Integer,
+
+    /// Floating numbers, we use 32 bit floats.
+    Floating,
+
+    /// Boolean.
+    Boolean,
+
+    /// A builtin VVRT type (Vivy Script Runtime)
+    VVRT(&'static str),
+}
+
+impl TryFrom<&str> for Role {
+    type Error = anyhow::Error;
+    fn try_from(value: &str) -> Result<Self, Self::Error> {
+        match value.to_lowercase().as_ref() {
+            "clone" => Ok(Self::Clone),
+            "eq" => Ok(Self::Eq),
+            "drop" => Ok(Self::Drop),
+            "len" => Ok(Self::Len),
+            str => Err(anyhow!("unknown role `{str}`")),
+        }
+    }
+}
+
+impl TryFrom<syn::Type> for Type {
+    type Error = anyhow::Error;
+    fn try_from(value: syn::Type) -> Result<Self, Self::Error> {
+        match value {
+            syn::Type::Path(path) => match &path.path.require_ident()?.to_string()[..] {
+                str if str.starts_with("VVRT") => Ok(Type::VVRT(String::leak(str.to_string()))),
+                "i32" => Ok(Type::Integer),
+                "f32" => Ok(Type::Floating),
+                "bool" => Ok(Type::Boolean),
+                "()" => Ok(Type::None),
+                str => Err(anyhow!("unknown type `{str}`")),
+            },
+            syn::Type::Ptr(inner) => match *inner.elem {
+                syn::Type::Path(ty) if ty.path.require_ident()? == "u8" => Ok(Type::StrPtr),
+                ty => Err(anyhow!("expected u8 to form string pointer, got: {}", ty.into_token_stream().to_string())),
+            },
+            ty => Err(anyhow!("type can't be casted into base_type: {}", ty.into_token_stream().to_string())),
+        }
+    }
+}
diff --git a/src/Rust/vvs_runtime/Cargo.toml b/src/Rust/vvs_runtime/Cargo.toml
new file mode 100644
index 00000000..fe6bd029
--- /dev/null
+++ b/src/Rust/vvs_runtime/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name              = "vvs_runtime"
+description       = "The runtime for Vivy Script"
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+
+[dependencies]
+log.workspace        = true
+anyhow.workspace     = true
+serde.workspace      = true
+serde_json.workspace = true
+
+vvs_runtime_types.workspace = true
+vvs_utils.workspace         = true
+vvs_llvm.workspace          = true
+
+[build-dependencies]
+anyhow.workspace = true
+vvs_llvm = { workspace = true, features = ["link"] }
diff --git a/src/Rust/vvs_runtime/build.rs b/src/Rust/vvs_runtime/build.rs
new file mode 100644
index 00000000..a0148072
--- /dev/null
+++ b/src/Rust/vvs_runtime/build.rs
@@ -0,0 +1,3 @@
+fn main() -> anyhow::Result<()> {
+    vvs_llvm::build::llvm_link()
+}
diff --git a/src/Rust/vvs_runtime/src/jit.rs b/src/Rust/vvs_runtime/src/jit.rs
new file mode 100644
index 00000000..953bc4ae
--- /dev/null
+++ b/src/Rust/vvs_runtime/src/jit.rs
@@ -0,0 +1,157 @@
+use crate::workers::Workers;
+use anyhow::{bail, Context};
+use std::{
+    ffi::{c_int, c_void, CStr, CString},
+    ptr,
+    sync::{
+        atomic::{AtomicU64, Ordering},
+        Arc,
+    },
+};
+use vvs_llvm::*;
+use vvs_runtime_types::VVRTSymbol;
+
+#[allow(dead_code)]
+pub struct JIT {
+    jit: *mut LLVMOrcOpaqueLLJIT,
+    es: *mut LLVMOrcOpaqueExecutionSession,
+
+    tsctx: *mut LLVMOrcOpaqueThreadSafeContext,
+
+    irtl: *mut LLVMOrcOpaqueIRTransformLayer,
+    objl: *mut LLVMOrcOpaqueObjectLayer,
+    dylib: *mut LLVMOrcOpaqueJITDylib,
+
+    workers: Workers,
+}
+
+macro_rules! llvm_expect {
+    (unsafe $err: expr, $msg: literal $(, $arg: expr)* $(,)?) => {{
+        unsafe { llvm_expect!($err, $msg $(, $arg)*) }
+    }};
+
+    ($err: expr, $msg: literal $(, $arg: expr)* $(,)?) => {{
+        let err = $err;
+        if !err.is_null() {
+            let msg = std::ffi::CStr::from_ptr(LLVMGetErrorMessage(err))
+                .to_string_lossy()
+                .to_string();
+            LLVMConsumeError(err);
+            bail!("{}: {}", format_args!($msg, $(, $arg)*), msg)
+        }
+    }};
+}
+
+/// This function should be visible because it starts with `VVRT`
+#[allow(non_snake_case)]
+pub extern "C" fn VVRTHelloWorld() {
+    println!("Hello World from LLVM JIT");
+}
+
+/// This function should not be visible because it doesn't start with `VVRT`
+pub extern "C" fn hello_world() {
+    println!("wtf !?");
+}
+
+extern "C" fn orc_sym_filter(_: *mut c_void, sym: LLVMOrcSymbolStringPoolEntryRef) -> c_int {
+    eprintln!("toto");
+    let Ok(sym) = unsafe { CStr::from_ptr(LLVMOrcSymbolStringPoolEntryStr(sym)) }.to_str() else {
+        log::error!("got a symbol which name was not valid utf8 from orc");
+        return 0;
+    };
+    sym.starts_with("VVRT") as c_int
+}
+
+impl JIT {
+    /// Create a new JIT thingy to execute Vivy Script code.
+    pub fn new() -> anyhow::Result<JIT> {
+        if let Err(err) = vvs_llvm::initialize_llvm() {
+            log::error!("{err}");
+        }
+
+        unsafe {
+            // Create the jit.
+            let mut jit = ptr::null_mut();
+            let mut tmb = ptr::null_mut();
+            llvm_expect!(LLVMOrcJITTargetMachineBuilderDetectHost(&mut tmb), "failed to create orc jit builder");
+
+            let jit_builder = LLVMOrcCreateLLJITBuilder();
+            LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(jit_builder, tmb);
+            llvm_expect!(LLVMOrcCreateLLJIT(&mut jit, jit_builder), "failed to create the orc jit");
+
+            log::debug!("got data layout: {}", CStr::from_ptr(LLVMOrcLLJITGetDataLayoutStr(jit)).to_string_lossy());
+
+            // Create things, in this order.
+            let es = LLVMOrcLLJITGetExecutionSession(jit);
+            let objl = LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(es);
+            let irtl = LLVMOrcLLJITGetIRTransformLayer(jit);
+            let dylib = LLVMOrcExecutionSessionCreateBareJITDylib(es, b"<main>\0".as_ptr() as *const _);
+
+            // Allow to search for symbols in the current process, only if they start with `VVRT`.
+            let mut dg = std::ptr::null_mut();
+            llvm_expect!(
+                LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
+                    &mut dg,
+                    LLVMOrcLLJITGetGlobalPrefix(jit),
+                    Some(orc_sym_filter),
+                    std::ptr::null_mut()
+                ),
+                "failed to create an orc dylib search generator for the current process"
+            );
+            LLVMOrcJITDylibAddGenerator(dylib, dg);
+
+            // Ok. Create workers and return the struct.
+            let tsctx = LLVMOrcCreateNewThreadSafeContext();
+            let workers = Workers::new(|flag: Arc<AtomicU64>| loop {
+                match flag.load(Ordering::SeqCst) {
+                    0 => std::thread::yield_now(),
+                    u64::MAX => return Ok(()),
+                    x => bail!("won't handle work package n°{x}"),
+                }
+            })?;
+            Ok(JIT { jit, es, dylib, tsctx, irtl, objl, workers })
+        }
+    }
+
+    /// Get the context out of the JIT thingy. Used to create a LLVM module to be used latter by
+    /// the JIT.
+    pub fn ctx(&self) -> LLVMContextRef {
+        unsafe { LLVMOrcThreadSafeContextGetContext(self.tsctx) }
+    }
+
+    /// Add a new module to the JIT engine.
+    ///
+    /// # Safety
+    /// The passed module ([LLVMModuleRef]) must not be a null pointer and must be a valid LLVM
+    /// module with valid code for the runtime. This module should be created by the [vvs_codegen]
+    /// crate or you can have problems executing it...
+    pub unsafe fn add_module(&self, module: LLVMModuleRef) -> anyhow::Result<()> {
+        let tsm = LLVMOrcCreateNewThreadSafeModule(module, self.tsctx);
+        let rc = LLVMOrcLLJITAddLLVMIRModule(self.jit, self.dylib, tsm);
+        llvm_expect!(rc, "failed to add the module into the jit");
+        Ok(())
+    }
+
+    /// LookUp a symbol defined in the JIT.
+    pub fn lookup<'a>(&self, name: &'a str) -> anyhow::Result<VVRTSymbol<'a>> {
+        let mut addr = Default::default();
+        let symbol = VVRTSymbol::try_from(name)?;
+        let str = CString::new(name).with_context(|| "CString::new failed")?;
+        llvm_expect!(unsafe
+            LLVMOrcLLJITLookup(self.jit, &mut addr, str.as_ptr()),
+            "failed to lookup symbol `{name}`"
+        );
+        Ok(symbol.with_addr(addr))
+    }
+}
+
+impl Drop for JIT {
+    fn drop(&mut self) {
+        self.workers.pre_drop();
+        unsafe {
+            LLVMOrcDisposeThreadSafeContext(self.tsctx);
+            LLVMOrcDisposeLLJIT(self.jit);
+            LLVMOrcDisposeObjectLayer(self.objl);
+        }
+    }
+}
diff --git a/src/Rust/vvs_runtime/src/lib.rs b/src/Rust/vvs_runtime/src/lib.rs
new file mode 100644
index 00000000..4eb83d6c
--- /dev/null
+++ b/src/Rust/vvs_runtime/src/lib.rs
@@ -0,0 +1,6 @@
+mod jit;
+mod workers;
+
+// Re-exports
+pub use crate::jit::*;
+pub use vvs_runtime_types::types;
diff --git a/src/Rust/vvs_runtime/src/workers.rs b/src/Rust/vvs_runtime/src/workers.rs
new file mode 100644
index 00000000..9c69cad1
--- /dev/null
+++ b/src/Rust/vvs_runtime/src/workers.rs
@@ -0,0 +1,106 @@
+//! A simple implementation of worker threads, unix only for now. HWloc seems to have difficulties
+//! on MacOS, so this should be Ok for Linux and BSDs...
+
+use anyhow::{bail, Context, Result};
+use std::{
+    cell::Cell,
+    sync::{
+        atomic::{AtomicU64, Ordering},
+        Arc,
+    },
+    thread::JoinHandle,
+};
+
+thread_local! {
+    pub static WORKER_THREAD_IDX: Cell<u16> = const { Cell::new(u16::MAX) };
+}
+
+/// Contains worker threads, we bind one per physical core. We can distribute work to those threads
+/// and wait for the distributed work to be done.
+pub(crate) struct Workers {
+    handles: Vec<(JoinHandle<()>, Arc<AtomicU64>)>,
+}
+
+fn join_handles<T>(handles: impl Iterator<Item = JoinHandle<T>>) {
+    for handle in handles {
+        if let Err(err) = handle.join() {
+            let idx = WORKER_THREAD_IDX.get();
+            log::error!("failed to join thread n°{idx} with error: {err:?}")
+        }
+    }
+}
+
+fn cancel_threads(handles: impl Iterator<Item = Arc<AtomicU64>>) {
+    for atomic in handles {
+        atomic.store(u64::MAX, Ordering::SeqCst);
+    }
+}
+
+impl Workers {
+    /// Create new worker threads. We use a closure passed by the user. When work is asked for the
+    /// workers the passed integer is set to a non-zero constant (you can't assume it's value),
+    /// when the thread has finish it's work the atomic must be set to 0.
+    ///
+    /// If we want to cancel the thread, the passed atomic will be set to `U64_MAX`.
+    pub fn new(user_func: impl Fn(Arc<AtomicU64>) -> Result<()> + Send + Clone + 'static) -> Result<Self> {
+        let thread_count = std::thread::available_parallelism()
+            .map(std::num::NonZeroUsize::get)
+            .unwrap_or(1);
+        (0..thread_count)
+            .map(|idx| Self::launch_thread(user_func.clone(), idx))
+            .try_fold(vec![], |mut acc, item| match item {
+                Err(err) => Err((acc, err)),
+                Ok(item) => {
+                    acc.push(item);
+                    Ok(acc)
+                }
+            })
+            .map(|handles| Self { handles })
+            .map_err(|(handles, err)| {
+                cancel_threads(handles.iter().map(|(_, rc)| rc.clone()));
+                join_handles(handles.into_iter().map(|(hdl, _)| hdl));
+                err
+            })
+    }
+
+    /// Launch a thread with a user function on a core of the topology.
+    fn launch_thread(
+        user_func: impl Fn(Arc<AtomicU64>) -> Result<()> + Send + 'static,
+        idx: usize,
+    ) -> Result<(JoinHandle<()>, Arc<AtomicU64>)> {
+        let flag = Arc::new(AtomicU64::new(0));
+        let ret_flag = flag.clone();
+
+        let idx_i16: u16 = idx.try_into().with_context(|| "try to launch to many threads")?;
+        if idx_i16 == u16::MAX {
+            bail!("try to launch to many threads");
+        }
+
+        let handle = std::thread::Builder::new()
+            .name(format!("VVRT-Worker-{idx}"))
+            .spawn(move || {
+                WORKER_THREAD_IDX.set(idx_i16);
+                log::debug!("start thread n°{idx}");
+                if let Err(err) = user_func(flag.clone()) {
+                    log::error!("thread n°{idx} exits with error: {err}");
+                }
+                flag.store(0, Ordering::SeqCst);
+                log::debug!("exit thread n°{idx}");
+            })?;
+
+        Ok((handle, ret_flag))
+    }
+
+    /// Pre-drop all the threads and cancel the work to do.
+    pub fn pre_drop(&mut self) {
+        let handles = std::mem::take(&mut self.handles);
+        cancel_threads(handles.iter().map(|(_, rc)| rc.clone()));
+        join_handles(handles.into_iter().map(|(hdl, _)| hdl));
+    }
+}
+
+impl Drop for Workers {
+    fn drop(&mut self) {
+        self.pre_drop();
+    }
+}
diff --git a/src/Rust/vvs_runtime_types/Cargo.toml b/src/Rust/vvs_runtime_types/Cargo.toml
new file mode 100644
index 00000000..1e1ab1a6
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/Cargo.toml
@@ -0,0 +1,26 @@
+[package]
+name              = "vvs_runtime_types"
+description       = "The types for the runtime for Vivy Script"
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+
+[dependencies]
+log.workspace        = true
+serde.workspace      = true
+serde_json.workspace = true
+anyhow.workspace     = true
+hashbrown.workspace  = true
+
+unicode-segmentation.workspace = true
+
+vvs_procmacro.workspace = true
+vvs_utils.workspace     = true
+vvs_lang.workspace      = true
+vvs_llvm.workspace      = true
+vvs_ass.workspace       = true
+
+[build-dependencies]
+anyhow.workspace = true
+vvs_llvm = { workspace = true, features = ["link"] }
diff --git a/src/Rust/vvs_runtime_types/build.rs b/src/Rust/vvs_runtime_types/build.rs
new file mode 100644
index 00000000..a0148072
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/build.rs
@@ -0,0 +1,3 @@
+fn main() -> anyhow::Result<()> {
+    vvs_llvm::build::llvm_link()
+}
diff --git a/src/Rust/vvs_runtime_types/src/lib.rs b/src/Rust/vvs_runtime_types/src/lib.rs
new file mode 100644
index 00000000..b5950e8b
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/lib.rs
@@ -0,0 +1,13 @@
+//! Here we have the types that will be used by the runtime, with their description so that the
+//! codegen can correctly use them.
+
+mod mangle;
+mod pointer;
+
+pub mod types;
+pub mod vvll;
+
+pub use self::{mangle::*, pointer::*};
+
+#[cfg(any(test, doctest))]
+mod tests;
diff --git a/src/Rust/vvs_runtime_types/src/mangle.rs b/src/Rust/vvs_runtime_types/src/mangle.rs
new file mode 100644
index 00000000..2945a334
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/mangle.rs
@@ -0,0 +1,163 @@
+use anyhow::{anyhow, bail};
+use std::{ffi::CString, str::FromStr};
+use vvs_lang::ast::ASTType;
+use vvs_llvm::*;
+
+/// Materialize which type of symbol we have.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum VVRTSymbolType {
+    Constant,
+    Function,
+    Option,
+    Method,
+}
+
+/// Describes a symbol. Can specify an ORCv2 execution address.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub struct VVRTSymbol<'a> {
+    pub sym: VVRTSymbolType,
+    pub module: &'a str,
+    pub name: &'a str,
+    addr: Option<LLVMOrcExecutorAddress>,
+}
+
+impl VVRTSymbolType {
+    /// Get the string representation of the symbol type.
+    pub fn as_str(&self) -> &'static str {
+        match self {
+            VVRTSymbolType::Constant => "Constant",
+            VVRTSymbolType::Function => "Function",
+            VVRTSymbolType::Option => "Option",
+            VVRTSymbolType::Method => "Method",
+        }
+    }
+}
+
+impl FromStr for VVRTSymbolType {
+    type Err = anyhow::Error;
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        match s.trim() {
+            "Constant" => Ok(VVRTSymbolType::Constant),
+            "Function" => Ok(VVRTSymbolType::Function),
+            "Option" => Ok(VVRTSymbolType::Option),
+            "Method" => Ok(VVRTSymbolType::Method),
+            s => Err(anyhow!("unknown symbol type `{s}`")),
+        }
+    }
+}
+
+impl std::fmt::Display for VVRTSymbolType {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.write_str(self.as_str())
+    }
+}
+
+impl AsRef<str> for VVRTSymbolType {
+    fn as_ref(&self) -> &str {
+        self.as_str()
+    }
+}
+
+impl<'a> VVRTSymbol<'a> {
+    /// Create a new symbol.
+    pub fn new(ty: VVRTSymbolType, module: &'a str, name: &'a str) -> anyhow::Result<Self> {
+        if let Some(idx) = module.find(|c: char| !c.is_alphanumeric()) {
+            bail!("invalid character found in module name at position `{idx}`: {module}")
+        }
+        if let Some(idx) = name.find(|c: char| c.is_whitespace() || c == '\0') {
+            bail!("invalid character found in name at position `{idx}`: {name}")
+        }
+        Ok(Self { sym: ty, module, name, addr: None })
+    }
+
+    pub fn method(ty: &ASTType, name: &'a str) -> anyhow::Result<Self> {
+        let module = match ty {
+            ASTType::Any => "Any",
+            ASTType::Line => "Line",
+            ASTType::String => "String",
+            ASTType::Syllabe => "Syllabe",
+            ty if ty.is_variant() => "Variant",
+            ty if ty.is_table() => "Table",
+            ty if ty.is_sequence() => "Sequence",
+            ty => bail!("can't have methods for type `{ty}`"),
+        };
+        Ok(VVRTSymbol { sym: VVRTSymbolType::Method, module, name, addr: None })
+    }
+
+    /// Builder-like syntax to take a symbol and associate it to an execution address gotten from
+    /// the JIT engine. We ignore any previous address.
+    pub fn with_addr(mut self, addr: LLVMOrcExecutorAddress) -> Self {
+        self.addr = Some(addr);
+        self
+    }
+
+    /// Mangle the symbol to get the name of it for the JIT engine or to find the symbol in the
+    /// LLVM module. This is a heavy operation.
+    ///
+    /// If the symbol was not valid we panic. If the symbol was correctly constructed/parsed this
+    /// should not happen.
+    pub fn mangle(&self) -> CString {
+        CString::new(self.to_string()).expect("invalid symbol")
+    }
+}
+
+impl<'a> std::fmt::Display for VVRTSymbol<'a> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let Self { sym, module, name, .. } = self;
+        match sym {
+            // Some shenanigans for builtin symbols...
+            VVRTSymbolType::Method => {
+                let mut module = unicode_segmentation::UnicodeSegmentation::graphemes(*module, true);
+                let first = module.next().map(|str| str.to_uppercase()).unwrap_or_default();
+                let tail = module.as_str();
+                write!(f, "VV{first}{tail}_{}", name.to_lowercase())
+            }
+
+            // A simple rule for symbols generated from users' code.
+            _ => write!(f, "_VV{sym}_{module}_{name}"),
+        }
+    }
+}
+
+impl<'a> TryFrom<&'a str> for VVRTSymbol<'a> {
+    type Error = anyhow::Error;
+    fn try_from(value: &'a str) -> Result<Self, Self::Error> {
+        const CORRECT_SYMBOLS: &str = "`_VV{{sym}}_{{module}}_{{name}}` or `VV{{builtin_type}}_{{name}}`";
+
+        let trimmed_value = value.trim();
+        if let Some(pos) = trimmed_value.find('\0') {
+            bail!("invalid symbol name `{trimmed_value}`, found null byte at {pos}")
+        }
+
+        let Some((sym, value)) = (match trimmed_value.strip_prefix("_VV") {
+            Some(trimmed_value) => trimmed_value.split_once('_'),
+            None => match trimmed_value.strip_prefix("VV") {
+                Some(trimmed_value) => Some((VVRTSymbolType::Method.as_str(), trimmed_value)),
+                None => bail!("invalid symbol name `{trimmed_value}`, didn't start with `_VV` or `VV`"),
+            },
+        }) else {
+            bail!("invalid symbol name `{trimmed_value}`, should be {CORRECT_SYMBOLS}")
+        };
+
+        let Some((module, name)) = value.split_once('_') else {
+            bail!("invalid symbol name `{trimmed_value}`, should be {CORRECT_SYMBOLS}")
+        };
+
+        Self::new(sym.parse()?, module, name)
+    }
+}
+
+#[test]
+fn test_vvrt_symbol() {
+    use vvs_utils::*;
+
+    assert_eq!(
+        assert_ok!(VVRTSymbol::try_from("_VVConstant_retime_start")),
+        VVRTSymbol { sym: VVRTSymbolType::Constant, module: "retime", name: "start", addr: None }
+    );
+
+    assert_eq!(
+        "_VVFunction_tag_syl_modulo".to_string(),
+        VVRTSymbol { sym: VVRTSymbolType::Function, module: "tag", name: "syl_modulo", addr: None }.to_string()
+    );
+}
diff --git a/src/Rust/vvs_runtime_types/src/pointer.rs b/src/Rust/vvs_runtime_types/src/pointer.rs
new file mode 100644
index 00000000..68f689cc
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/pointer.rs
@@ -0,0 +1,140 @@
+use std::{
+    cmp::Ordering,
+    hash::{Hash, Hasher},
+    marker::PhantomData,
+    mem::{align_of, size_of},
+    ptr::NonNull,
+};
+
+/// A tagged pointer: a space-efficient representation of a pointer that smuggles an integer tag
+/// into it.
+///
+/// `BITS` specifies how many bits are used for the tag. The alignment of `T` must be large enough
+/// to store this many bits.
+///
+/// # Safety
+/// The passed pointers, at construction time and each time you modify this struct, should all be
+/// properly aligned, or your code may panic. The passed pointer must also be dereferenceable.
+#[repr(transparent)]
+pub struct TaggedPtr<T, const BITS: u8>(NonNull<u8>, PhantomData<NonNull<T>>);
+
+impl<T, const BITS: u8> TaggedPtr<T, BITS> {
+    const ASSERT: () = {
+        assert!(size_of::<usize>() == size_of::<u64>(), "we only work with 64 bits architectures");
+        assert!(align_of::<T>().is_power_of_two(), "expected alignment of `T` to be a power of 2");
+        assert!(
+            match size_of::<T>() {
+                0 => true,
+                n => n >= align_of::<T>(),
+            },
+            "expected size of non-ZST `T` to be at least alignment"
+        );
+        assert!(size_of::<T>() % align_of::<T>() == 0, "expected size of `T` to be multiple of alignment");
+        assert!(1_usize.checked_shl(BITS as u32).is_some(), "`1 << BITS` doesn't fit in a `usize`");
+        assert!(align_of::<T>().trailing_zeros() >= BITS as u32, "alignment of `T` must be at least `1 << BITS`");
+    };
+
+    const ALIGNMENT: usize = 1_usize.wrapping_shl(BITS as u32);
+    const MASK: usize = Self::ALIGNMENT - 1;
+
+    /// Creates a new tagged pointer. Only the lower `BITS` bits of `tag` are stored.
+    ///
+    /// If build in debug, a check is performed at compile time to ensure that the alignment of `T`
+    /// is sufficient to smuggle the tag.
+    #[allow(path_statements, clippy::no_effect)]
+    #[inline]
+    pub fn new(ptr: NonNull<T>, tag: usize) -> Self {
+        Self::ASSERT; // Static assert!
+        let ptr = ptr.as_ptr().cast::<u8>();
+
+        let offset = ptr.align_offset(Self::ALIGNMENT);
+        debug_assert!(offset != usize::MAX, "align offset failed");
+        debug_assert!(offset & Self::MASK == 0, "`ptr` is not aligned enough");
+
+        let ptr = ptr.wrapping_add(tag & Self::MASK);
+        Self(unsafe { NonNull::new_unchecked(ptr) }, PhantomData)
+    }
+
+    /// Gets the pointer and tag stored by the tagged pointer.
+    #[inline]
+    pub fn get(self) -> (NonNull<T>, usize) {
+        let ptr = self.0.as_ptr();
+        let tag = Self::ALIGNMENT.wrapping_sub(ptr.align_offset(Self::ALIGNMENT)) & Self::MASK;
+        let ptr = ptr.wrapping_sub(tag).cast::<T>();
+
+        // SAFETY: ptr + 1 - 1 == ptr
+        (unsafe { NonNull::new_unchecked(ptr) }, tag)
+    }
+
+    /// Get the address of the pointed thing as an integer. Here for moar reasons we only work with
+    /// 64 bit architectures, thus the `usize == u64`.
+    #[inline]
+    pub fn addr(self) -> u64 {
+        self.ptr().as_ptr() as u64
+    }
+
+    /// Gets the pointer stored by the tagged pointer, without the tag.
+    #[inline]
+    pub fn ptr(self) -> NonNull<T> {
+        self.get().0
+    }
+
+    /// Gets the tag stored by the tagged pointer.
+    #[inline]
+    pub fn tag(self) -> usize {
+        self.get().1
+    }
+
+    /// Sets the pointer without modifying the tag.
+    #[inline]
+    pub fn set_ptr(&mut self, ptr: NonNull<T>) {
+        *self = Self::new(ptr, self.tag());
+    }
+
+    /// Sets the tag without modifying the pointer.
+    #[inline]
+    pub fn set_tag(&mut self, tag: usize) {
+        *self = Self::new(self.ptr(), tag);
+    }
+}
+
+impl<T, const BITS: u8> Copy for TaggedPtr<T, BITS> {}
+impl<T, const BITS: u8> Clone for TaggedPtr<T, BITS> {
+    fn clone(&self) -> Self {
+        *self
+    }
+}
+
+impl<T, const BITS: u8> Eq for TaggedPtr<T, BITS> {}
+impl<T, const BITS: u8> PartialEq for TaggedPtr<T, BITS> {
+    fn eq(&self, other: &Self) -> bool {
+        self.0 == other.0
+    }
+}
+
+impl<T, const BITS: u8> PartialOrd for TaggedPtr<T, BITS> {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+impl<T, const BITS: u8> Ord for TaggedPtr<T, BITS> {
+    fn cmp(&self, other: &Self) -> Ordering {
+        self.0.cmp(&other.0)
+    }
+}
+
+impl<T, const BITS: u8> Hash for TaggedPtr<T, BITS> {
+    fn hash<H: Hasher>(&self, state: &mut H) {
+        self.0.hash(state);
+    }
+}
+
+impl<T, const BITS: u8> std::fmt::Debug for TaggedPtr<T, BITS> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let (ptr, tag) = self.get();
+        f.debug_struct("TaggedPtr")
+            .field("ptr", &ptr)
+            .field("tag", &tag)
+            .finish()
+    }
+}
diff --git a/src/Rust/vvs_runtime_types/src/tests.rs b/src/Rust/vvs_runtime_types/src/tests.rs
new file mode 100644
index 00000000..ab13f125
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/tests.rs
@@ -0,0 +1,136 @@
+use hashbrown::HashMap;
+
+use crate::{
+    types::{VVRTAny, VVRTType},
+    TaggedPtr,
+};
+use core::{mem::size_of, ptr::NonNull};
+use std::mem::align_of;
+
+#[test]
+fn test_ptr_size() {
+    assert_eq!(size_of::<usize>(), size_of::<u64>());
+    assert_eq!(size_of::<*const u64>(), size_of::<u64>());
+}
+
+#[test]
+fn test_ptr_align() {
+    assert_eq!(size_of::<NonNull<u64>>(), 8);
+    assert_eq!(align_of::<NonNull<u64>>(), 8);
+    assert_eq!(align_of::<NonNull<HashMap<Box<str>, VVRTAny>>>(), 8);
+    assert_eq!(align_of::<NonNull<Vec<VVRTAny>>>(), 8);
+}
+
+#[test]
+fn test_type_sizes() {
+    use std::mem::size_of;
+    assert_eq!(size_of::<VVRTAny>(), 8);
+    assert_eq!(size_of::<VVRTType>(), 1);
+}
+
+#[repr(align(2))]
+#[derive(Debug, Eq, PartialEq)]
+struct Align2(pub u16);
+
+#[repr(align(4))]
+#[derive(Debug, Eq, PartialEq)]
+struct Align4(pub u32);
+
+#[repr(align(8))]
+#[derive(Debug, Eq, PartialEq)]
+struct Align8(pub u64);
+
+#[test]
+#[allow(clippy::let_unit_value)]
+fn check_ptr_basic() {
+    for i in 0..64 {
+        let x = i as u8 * 3;
+        let tp = TaggedPtr::<_, 0>::new((&x).into(), i);
+        assert_eq!(tp.get(), ((&x).into(), 0));
+        assert_eq!(*unsafe { tp.ptr().as_ref() }, x);
+
+        let x = Align2(i as u16 * 5);
+        let tp = TaggedPtr::<_, 1>::new((&x).into(), i);
+        assert_eq!(tp.get(), ((&x).into(), i & 0b1));
+        assert_eq!(*unsafe { tp.ptr().as_ref() }, x);
+
+        let mut x = Align4(i as u32 * 7);
+        let ptr = NonNull::from(&mut x);
+        let tp = TaggedPtr::<_, 2>::new(ptr, i);
+        assert_eq!(tp.get(), (ptr, i & 0b11));
+        unsafe { tp.ptr().as_mut() }.0 += 1;
+        assert_eq!(x.0, i as u32 * 7 + 1);
+
+        let x = Align8(i as u64 * 11);
+        let tp = TaggedPtr::<_, 3>::new((&x).into(), i);
+        assert_eq!(tp.get(), ((&x).into(), i & 0b111));
+        assert_eq!(*unsafe { tp.ptr().as_ref() }, x);
+    }
+}
+
+#[test]
+#[allow(clippy::let_unit_value)]
+fn check_ptr_overaligned() {
+    for i in 0..64 {
+        let x = Align2(i as u16 * 3);
+        let tp = TaggedPtr::<_, 0>::new((&x).into(), i);
+        assert_eq!(tp.get(), ((&x).into(), 0));
+        assert_eq!(*unsafe { tp.ptr().as_ref() }, x);
+
+        let x = Align4(i as u32 * 5);
+        let tp = TaggedPtr::<_, 1>::new((&x).into(), i);
+        assert_eq!(tp.get(), ((&x).into(), i & 0b1));
+        assert_eq!(*unsafe { tp.ptr().as_ref() }, x);
+
+        let x = Align8(i as u64 * 7);
+        let tp = TaggedPtr::<_, 2>::new((&x).into(), i);
+        assert_eq!(tp.get(), ((&x).into(), i & 0b11));
+        assert_eq!(*unsafe { tp.ptr().as_ref() }, x);
+    }
+}
+
+#[test]
+#[allow(clippy::let_unit_value)]
+fn check_ptr_zst() {
+    for i in 0..8 {
+        let x = ();
+        let tp = TaggedPtr::<_, 0>::new((&x).into(), i);
+        assert_eq!(tp.get(), ((&x).into(), 0));
+    }
+}
+
+#[test]
+fn check_ptr_size() {
+    assert_eq!(size_of::<TaggedPtr<u64, 3>>(), size_of::<core::ptr::NonNull<u64>>());
+    assert_eq!(size_of::<TaggedPtr<u64, 3>>(), size_of::<Option<TaggedPtr<u64, 3>>>());
+}
+
+#[test]
+fn check_ptr_not_entirely_dereferenceable() {
+    #[repr(align(8))]
+    #[allow(dead_code)]
+    struct Type(u64, u64, u64);
+
+    let a = Type(1, 2, 3);
+    let mut tp = TaggedPtr::<_, 2>::new((&a).into(), 0b10);
+    assert_eq!(tp.get(), ((&a).into(), 0b10));
+
+    let mut b = Align4(0);
+    let ptr = NonNull::from(&mut b).cast();
+    tp.set_ptr(ptr);
+    assert_eq!(tp.ptr(), ptr);
+    tp.set_tag(0b11);
+    assert_eq!(tp.tag(), 0b11);
+    unsafe { tp.ptr().cast::<Align4>().as_mut() }.0 = 1234;
+    assert_eq!(b.0, 1234);
+}
+
+#[test]
+#[should_panic]
+fn runtime_ptr_not_aligned_enough() {
+    let ptr: *mut Align2 = &mut Align2(0);
+    let ptr = unsafe { (ptr as *mut u8).add(1) };
+    let ptr = ptr as *mut Align2;
+    let ptr = unsafe { NonNull::new_unchecked(ptr) };
+    TaggedPtr::<_, 1>::new(ptr, 0);
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/any.rs b/src/Rust/vvs_runtime_types/src/types/any.rs
new file mode 100644
index 00000000..1771dc8c
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/any.rs
@@ -0,0 +1,318 @@
+//! Contains definitions for the [VVRTAny] runtime object and its associated methods.
+
+/// Implement [TryFrom<VVRTAny>] and [TryFrom<&VVRTAny>] for a given object that can be contained
+/// inside [VVRTAny].
+macro_rules! impl_try_from_any {
+    ($vvrtty: ident => $struct: ident) => {
+        impl TryFrom<crate::types::VVRTAny> for $struct {
+            #[inline]
+            fn try_from(value: crate::types::VVRTAny) -> Result<Self, Self::Error> {
+                unsafe { VVRTAny_is_ty(value, VVRTType::$vvrtty) }
+                    .then_some(Self(value.ptr()))
+                    .ok_or(value.ty())
+            }
+            type Error = crate::types::VVRTType;
+        }
+
+        impl TryFrom<&crate::types::VVRTAny> for $struct {
+            #[inline]
+            fn try_from(value: &crate::types::VVRTAny) -> Result<Self, Self::Error> {
+                (*value).try_into()
+            }
+            type Error = crate::types::VVRTType;
+        }
+    };
+}
+pub(super) use impl_try_from_any;
+
+use crate::{types::*, TaggedPtr};
+use std::{
+    mem::{align_of, transmute},
+    ptr::NonNull,
+};
+
+/// We represent the *any* Vivy Script type by an enum. We try to fit this bad boi into 8 bytes
+/// with a tagged pointer. With 3 bits for the tag we have values from 0 to 7, is enaugh to store
+/// the [VVRTType]. We store the [VVRTType::Nil] as [None] so we can gain one slot.
+///
+/// Nil is all zero, which is Ok even if we have a non-null thingy (at least I hope).
+#[derive(Debug, Clone, Copy)]
+#[repr(transparent)]
+pub struct VVRTAny(Option<TaggedPtr<u64, 3>>);
+
+impl VVRTAny {
+    /// Get the real type of the object inside the `any` container.
+    #[inline]
+    pub fn ty(&self) -> VVRTType {
+        self.map_or_default(|this| unsafe { transmute(this.tag() as u8 + 1) })
+    }
+
+    /// Map on the inner tagged pointer, or return the specified default.
+    #[inline]
+    pub fn map_or<U, F: FnOnce(TaggedPtr<u64, 3>) -> U>(self, default: U, f: F) -> U {
+        self.0.map_or(default, f)
+    }
+
+    /// Map on the inner tagger pointer, or return the default value for the returned type.
+    #[inline]
+    pub fn map_or_default<U: Default, F: FnOnce(TaggedPtr<u64, 3>) -> U>(self, f: F) -> U {
+        self.0.map_or(U::default(), f)
+    }
+
+    /// Get the pointer out of the tagged pointer, or a dangling pointer in the case where we store
+    /// a value of type [VVRTType::Nil].
+    #[inline]
+    pub(crate) fn ptr<T: Sized>(&self) -> NonNull<T> {
+        debug_assert_eq!(align_of::<T>(), 8);
+        self.map_or(NonNull::dangling(), |this| unsafe {
+            NonNull::new_unchecked(this.ptr().as_ptr() as *mut T)
+        })
+    }
+
+    /// Build the [VVRTAny] from a pointer assumed to be not null and the type of such pointer.
+    #[inline]
+    unsafe fn from_parts(ptr: *mut u64, ty: VVRTType) -> Self {
+        Self((ty != VVRTType::Nil).then(|| TaggedPtr::new(NonNull::new_unchecked(ptr), ty as usize - 1)))
+    }
+
+    /// Tells whever the contained type is a floating number or not.
+    #[inline]
+    pub fn number_is_f32(&self) -> bool {
+        (self.ty() == VVRTType::Number) && VVRTNumber::from(*self).is_f32()
+    }
+
+    /// Tells whever the contained type is an integer number or not.
+    #[inline]
+    pub fn number_is_i32(&self) -> bool {
+        (self.ty() == VVRTType::Number) && VVRTNumber::from(*self).is_i32()
+    }
+}
+
+impl Default for VVRTAny {
+    /// By default, [VVRTAny] contains an object of type [VVRTType::Nil].
+    #[inline]
+    fn default() -> Self {
+        Self(None)
+    }
+}
+
+impl From<VVRTAny> for VVRTNumber {
+    fn from(value: VVRTAny) -> Self {
+        value.map_or_default(|ptr| VVRTNumber::from_number_be_bytes(ptr.addr().to_be_bytes()))
+    }
+}
+
+impl From<VVRTNumber> for VVRTAny {
+    fn from(value: VVRTNumber) -> Self {
+        unsafe { Self::from_parts(value.as_ptr(), VVRTType::Number) }
+    }
+}
+
+impl From<VVRTAny> for bool {
+    #[inline]
+    fn from(this: VVRTAny) -> Self {
+        Into::<i32>::into(this) != 0
+    }
+}
+
+impl From<VVRTAny> for i32 {
+    #[inline]
+    fn from(this: VVRTAny) -> Self {
+        VVRTNumber::from(this).into()
+    }
+}
+
+impl From<VVRTAny> for f32 {
+    #[inline]
+    fn from(this: VVRTAny) -> Self {
+        VVRTNumber::from(this).into()
+    }
+}
+
+impl From<VVRTVariant> for VVRTAny {
+    #[inline]
+    fn from(ptr: VVRTVariant) -> Self {
+        unsafe { Self::from_parts(ptr.as_ptr(), VVRTType::Variant) }
+    }
+}
+
+impl From<VVRTString> for VVRTAny {
+    #[inline]
+    fn from(ptr: VVRTString) -> Self {
+        unsafe { Self::from_parts(ptr.as_ptr(), VVRTType::String) }
+    }
+}
+
+impl From<VVRTTable> for VVRTAny {
+    #[inline]
+    fn from(ptr: VVRTTable) -> Self {
+        unsafe { Self::from_parts(ptr.as_ptr(), VVRTType::Table) }
+    }
+}
+
+impl From<VVRTSeq> for VVRTAny {
+    #[inline]
+    fn from(ptr: VVRTSeq) -> Self {
+        unsafe { Self::from_parts(ptr.as_ptr(), VVRTType::Seq) }
+    }
+}
+
+impl From<VVRTLine> for VVRTAny {
+    #[inline]
+    fn from(ptr: VVRTLine) -> Self {
+        unsafe { Self::from_parts(ptr.as_ptr(), VVRTType::ASSLine) }
+    }
+}
+
+impl From<VVRTSyllabe> for VVRTAny {
+    #[inline]
+    fn from(ptr: VVRTSyllabe) -> Self {
+        unsafe { Self::from_parts(ptr.as_ptr(), VVRTType::ASSSyllabe) }
+    }
+}
+
+impl From<i32> for VVRTAny {
+    #[inline]
+    fn from(value: i32) -> Self {
+        unsafe { Self::from_parts(VVRTNumber::from(value).as_ptr(), VVRTType::Number) }
+    }
+}
+
+impl From<bool> for VVRTAny {
+    #[inline]
+    fn from(value: bool) -> Self {
+        (value as i32).into()
+    }
+}
+
+impl From<f32> for VVRTAny {
+    #[inline]
+    fn from(value: f32) -> Self {
+        unsafe { Self::from_parts(VVRTNumber::from(value).as_ptr(), VVRTType::Number) }
+    }
+}
+
+impl Eq for VVRTAny {}
+impl PartialEq for VVRTAny {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        unsafe {
+            macro_rules! into {
+                ($what: expr) => {
+                    self.try_into().unwrap_unchecked()
+                };
+            }
+            match self.ty() {
+                ty if ty != other.ty() => false,
+                VVRTType::Nil => true,
+                VVRTType::Number => self.0.unwrap_unchecked().addr() == other.0.unwrap_unchecked().addr(),
+                VVRTType::ASSSyllabe => VVRTSyllabe_eq(into!(self), into!(other)),
+                VVRTType::ASSLine => VVRTLine_eq(into!(self), into!(other)),
+                VVRTType::Variant => VVRTVariant_eq(into!(self), into!(other)),
+                VVRTType::String => VVRTString_eq(into!(self), into!(other)),
+                VVRTType::Table => VVRTTable_eq(into!(self), into!(other)),
+                VVRTType::Seq => VVRTSeq_eq(into!(self), into!(other)),
+            }
+        }
+    }
+}
+
+/// Module used to define functions to be exported for the JIT.
+#[allow(clippy::missing_safety_doc)]
+#[vvs_procmacro::vvrt_bridge(VVRTAny)]
+mod ffi {
+    #[no_mangle]
+    pub unsafe extern "C" fn nil() -> VVRTAny {
+        Default::default()
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn ty(any: VVRTAny) -> VVRTType {
+        any.ty()
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn is_ty(any: VVRTAny, ty: VVRTType) -> bool {
+        any.ty() == ty
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn is_nil(any: VVRTAny) -> bool {
+        any.0.is_none()
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn deep_clone(any: VVRTAny) -> VVRTAny {
+        match any.ty() {
+            // Shallow copy
+            VVRTType::Nil | VVRTType::Number => any,
+            VVRTType::String => VVRTString_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::Variant => VVRTVariant_clone(any.try_into().unwrap_unchecked()).into(),
+
+            // Deep copy
+            VVRTType::Seq => VVRTSeq_deep_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::Table => VVRTTable_deep_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::ASSLine => VVRTLine_deep_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::ASSSyllabe => VVRTSyllabe_deep_clone(any.try_into().unwrap_unchecked()).into(),
+        }
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn clone(any: VVRTAny) -> VVRTAny {
+        match any.ty() {
+            VVRTType::Nil | VVRTType::Number => any,
+            VVRTType::Seq => VVRTSeq_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::Table => VVRTTable_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::String => VVRTString_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::Variant => VVRTVariant_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::ASSLine => VVRTLine_clone(any.try_into().unwrap_unchecked()).into(),
+            VVRTType::ASSSyllabe => VVRTSyllabe_clone(any.try_into().unwrap_unchecked()).into(),
+        }
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn drop(any: VVRTAny) {
+        match any.ty() {
+            VVRTType::Nil | VVRTType::Number => {}
+            VVRTType::Seq => VVRTSeq_drop(any.try_into().unwrap_unchecked()),
+            VVRTType::Table => VVRTTable_drop(any.try_into().unwrap_unchecked()),
+            VVRTType::String => VVRTString_drop(any.try_into().unwrap_unchecked()),
+            VVRTType::Variant => VVRTVariant_drop(any.try_into().unwrap_unchecked()),
+            VVRTType::ASSLine => VVRTLine_drop(any.try_into().unwrap_unchecked()),
+            VVRTType::ASSSyllabe => VVRTSyllabe_drop(any.try_into().unwrap_unchecked()),
+        }
+    }
+
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn eq(this: VVRTAny, other: VVRTAny) -> bool { this == other }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ne(this: VVRTAny, other: VVRTAny) -> bool { this != other }
+
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_boolean (o: bool)        -> VVRTAny { o.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_integer (o: i32)         -> VVRTAny { o.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_floating(o: f32)         -> VVRTAny { o.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_string  (o: VVRTString)  -> VVRTAny { o.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_table   (o: VVRTTable)   -> VVRTAny { o.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_seq     (o: VVRTSeq)     -> VVRTAny { o.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_variant (o: VVRTVariant) -> VVRTAny { o.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_line    (o: VVRTLine)    -> VVRTAny { o.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn from_syllabe (o: VVRTSyllabe) -> VVRTAny { o.into() }
+
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_boolean (any: VVRTAny) -> bool        { any.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_integer (any: VVRTAny) -> i32         { any.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_floating(any: VVRTAny) -> f32         { any.into() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_string  (any: VVRTAny) -> VVRTString  { any.try_into().unwrap_unchecked() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_table   (any: VVRTAny) -> VVRTTable   { any.try_into().unwrap_unchecked() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_seq     (any: VVRTAny) -> VVRTSeq     { any.try_into().unwrap_unchecked() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_variant (any: VVRTAny) -> VVRTVariant { any.try_into().unwrap_unchecked() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_line    (any: VVRTAny) -> VVRTLine    { any.try_into().unwrap_unchecked() }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn as_syllabe (any: VVRTAny) -> VVRTSyllabe { any.try_into().unwrap_unchecked() }
+
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_boolean (any: VVRTAny) -> bool        { VVRTAny_as_boolean(any) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_integer (any: VVRTAny) -> i32         { VVRTAny_as_integer(any) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_floating(any: VVRTAny) -> f32         { VVRTAny_as_floating(any) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_string  (any: VVRTAny) -> VVRTString  { any.try_into().unwrap_or(VVRTString ::dangling()) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_table   (any: VVRTAny) -> VVRTTable   { any.try_into().unwrap_or(VVRTTable  ::dangling()) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_seq     (any: VVRTAny) -> VVRTSeq     { any.try_into().unwrap_or(VVRTSeq    ::dangling()) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_variant (any: VVRTAny) -> VVRTVariant { any.try_into().unwrap_or(VVRTVariant::dangling()) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_line    (any: VVRTAny) -> VVRTLine    { any.try_into().unwrap_or(VVRTLine   ::dangling()) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn maybe_as_syllabe (any: VVRTAny) -> VVRTSyllabe { any.try_into().unwrap_or(VVRTSyllabe::dangling()) }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/line.rs b/src/Rust/vvs_runtime_types/src/types/line.rs
new file mode 100644
index 00000000..79dfd2bd
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/line.rs
@@ -0,0 +1,90 @@
+use crate::types::*;
+use std::{ptr::NonNull, rc::Rc};
+use vvs_ass::ASSLine;
+
+/// Represent a line, in an ffi-safe way. We represent if the line was create by using an Rc or was
+/// built from a reference.
+#[derive(Debug, Clone, Copy)]
+#[repr(C)]
+pub struct VVRTLine(NonNull<ASSLine<VVRTTable>>);
+crate::types::any::impl_try_from_any! { ASSLine => VVRTLine }
+
+impl VVRTLine {
+    #[inline]
+    pub fn dangling() -> Self {
+        Self(NonNull::dangling())
+    }
+
+    #[inline]
+    pub fn as_ptr(self) -> *mut u64 {
+        self.0.as_ptr() as *mut _
+    }
+
+    #[inline]
+    pub fn is_rc(&self) -> bool {
+        !self.as_ref().aux.rt_infos().is_ass_borrowed
+    }
+}
+
+impl From<ASSLine<VVRTTable>> for VVRTLine {
+    fn from(mut value: ASSLine<VVRTTable>) -> Self {
+        value.aux.rt_infos_mut().is_ass_borrowed = false;
+        let ptr = Rc::into_raw(Rc::new(value)) as *mut _;
+        VVRTLine(unsafe { NonNull::new_unchecked(ptr) })
+    }
+}
+
+impl AsRef<ASSLine<VVRTTable>> for VVRTLine {
+    fn as_ref(&self) -> &ASSLine<VVRTTable> {
+        unsafe { self.0.as_ref() }
+    }
+}
+
+impl AsMut<ASSLine<VVRTTable>> for VVRTLine {
+    fn as_mut(&mut self) -> &mut ASSLine<VVRTTable> {
+        unsafe { self.0.as_mut() }
+    }
+}
+
+impl Eq for VVRTLine {}
+impl PartialEq for VVRTLine {
+    fn eq(&self, other: &Self) -> bool {
+        self.as_ref().eq(other.as_ref())
+    }
+}
+
+/// Module used to defined functions to be exported to the JIT.
+#[allow(clippy::missing_safety_doc)]
+#[vvs_procmacro::vvrt_bridge(VVRTLine)]
+mod ffi {
+    #[no_mangle]
+    pub unsafe extern "C" fn deep_clone(this: VVRTLine) -> VVRTLine {
+        this.as_ref().clone().into()
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn clone(this @ VVRTLine(ptr): VVRTLine) -> VVRTLine {
+        match this.is_rc() {
+            false => VVRTLine_deep_clone(this),
+            true => {
+                Rc::increment_strong_count(ptr.as_ptr());
+                this
+            }
+        }
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn drop(this @ VVRTLine(ptr): VVRTLine) {
+        if this.is_rc() {
+            Rc::decrement_strong_count(ptr.as_ptr())
+        }
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn len(this: VVRTLine) -> i32 {
+        this.as_ref().content.len().clamp(0, i32::MAX as usize) as i32
+    }
+
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn eq(this: VVRTLine, other: VVRTLine) -> bool { PartialEq::eq(&this, &other) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ne(this: VVRTLine, other: VVRTLine) -> bool { PartialEq::ne(&this, &other) }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/mod.rs b/src/Rust/vvs_runtime_types/src/types/mod.rs
new file mode 100644
index 00000000..1e8972a6
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/mod.rs
@@ -0,0 +1,178 @@
+//! Here we have the base types for the runtime.
+
+/// Get the list of all the builtin types.
+macro_rules! builtin_types {
+    ($macro: ident) => {
+        $macro!(any, sequence, string, table, variant, line, syllabe);
+    };
+}
+
+/// Declare the modules associated with the builtin types.
+macro_rules! decl_modules {
+    ($mod: ident $(,)?) => {
+        mod $mod;
+    };
+    ($mod: ident, $($mods: ident),+ $(,)?) => {
+        decl_modules!($mod);
+        decl_modules!($($mods),+);
+    };
+}
+builtin_types!(decl_modules);
+
+mod number;
+
+use self::{any::*, line::*, number::*, sequence::*, string::*, syllabe::*, table::*, variant::*};
+use crate::vvll::*;
+use std::sync::OnceLock;
+use vvs_llvm::*;
+
+#[cfg(test)]
+mod test;
+
+pub use self::{
+    any::VVRTAny, line::VVRTLine, sequence::VVRTSeq, string::VVRTString, syllabe::VVRTSyllabe, table::VVRTTable,
+    variant::VVRTVariant,
+};
+
+/// Get the builtin types
+pub fn builtin_types() -> &'static [&'static str] {
+    #[allow(dead_code)]
+    static NUMBERS_ARE_COHERENT: () = {
+        assert!(
+            std::mem::size_of::<f32>() == std::mem::size_of::<i32>(),
+            "we need for the layout of the numbers to be the same to do our shenanigans"
+        );
+        assert!(
+            std::mem::align_of::<f32>() == std::mem::align_of::<i32>(),
+            "we need for the layout of the numbers to be the same to do our shenanigans"
+        );
+    };
+
+    static TYPES: OnceLock<Vec<&'static str>> = OnceLock::new();
+    TYPES
+        .get_or_init(|| {
+            let mut ret = vec![];
+            macro_rules! decl_hashmap {
+                ($mod: ident $(,)?) => {{
+                    ret.push(stringify!($mod));
+                }};
+                ($mod: ident, $($mods: ident),+ $(,)?) => {{
+                    decl_hashmap!($mod);
+                    decl_hashmap!($($mods),+);
+                }};
+            }
+            builtin_types!(decl_hashmap);
+            ret
+        })
+        .as_slice()
+}
+
+/// Represent every types.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+#[repr(u8)]
+pub enum VVRTType {
+    /// Null, we ensure that [Option<VVRTAny>::None] is 0.
+    Nil = 0,
+
+    /// Numbers are floats or integers
+    Number = 1,
+
+    /// An immutable string
+    String = 2,
+
+    /// Table, a container indexed by string.
+    Table = 3,
+
+    /// A sequence, a container indexed by integer, items are pushed or poped.
+    Seq = 4,
+
+    /// A variant.
+    Variant = 5,
+
+    /// An ASS Line
+    ASSLine = 6,
+
+    /// An ASS Syllabe
+    ASSSyllabe = 7,
+}
+
+impl Default for VVRTType {
+    fn default() -> Self {
+        #[allow(dead_code)]
+        const SMUGGLE_TYPE: () = match VVRTType::Nil {
+            t @ VVRTType::Nil
+            | t @ VVRTType::String
+            | t @ VVRTType::Number
+            | t @ VVRTType::Table
+            | t @ VVRTType::Seq
+            | t @ VVRTType::ASSLine
+            | t @ VVRTType::ASSSyllabe
+            | t @ VVRTType::Variant => assert!(t as usize <= 8),
+        };
+        #[rustfmt::skip] #[allow(dead_code)]
+        const TYPE_ABI: () = {
+            // Non-managed
+            assert!((VVRTType::Number     as usize - 1) == 0b000);
+
+            // Managed
+            assert!((VVRTType::String     as usize - 1) == 0b001);
+            assert!((VVRTType::Table      as usize - 1) == 0b010);
+            assert!((VVRTType::Seq        as usize - 1) == 0b011);
+            assert!((VVRTType::Variant    as usize - 1) == 0b100);
+            assert!((VVRTType::ASSLine    as usize - 1) == 0b101);
+            assert!((VVRTType::ASSSyllabe as usize - 1) == 0b110);
+
+            // We want to use 0b111 for user types in the future...
+        };
+        VVRTType::Nil
+    }
+}
+
+impl VVRTType {
+    /// Get the type as a constant to be used in LLVM codegen.
+    ///
+    /// # Safety
+    /// The [LLVMContextRef] must be valid.
+    #[inline]
+    pub unsafe fn as_llvm_const(&self, c: LLVMContextRef) -> LLVMValueRef {
+        LLVMConstInt(LLVMInt8TypeInContext(c), *self as u64, 0)
+    }
+}
+
+impl LLVMExported for VVRTType {
+    unsafe fn llvm_type(c: LLVMContextRef) -> LLVMTypeRef {
+        #[allow(dead_code)]
+        const TYPE_IS_VALID: () = {
+            assert!(std::mem::size_of::<VVRTType>() == 1);
+            assert!(std::mem::align_of::<VVRTType>() == 1);
+        };
+        LLVMInt8TypeInContext(c)
+    }
+
+    unsafe fn llvm_properties(_: LLVMContextRef) -> Properties {
+        Default::default()
+    }
+}
+
+impl AsRef<str> for VVRTType {
+    #[inline]
+    fn as_ref(&self) -> &str {
+        match self {
+            VVRTType::Nil => "nil",
+            VVRTType::String => "string",
+            VVRTType::Number => "number",
+            VVRTType::Table => "table",
+            VVRTType::Seq => "seq",
+            VVRTType::Variant => "variant",
+            VVRTType::ASSLine => "line",
+            VVRTType::ASSSyllabe => "line",
+        }
+    }
+}
+
+impl std::fmt::Display for VVRTType {
+    #[inline]
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.write_str(self.as_ref())
+    }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/number.rs b/src/Rust/vvs_runtime_types/src/types/number.rs
new file mode 100644
index 00000000..dead33be
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/number.rs
@@ -0,0 +1,116 @@
+//! Contains utility to manipulate numbers from the runtime.
+
+use vvs_utils::either;
+
+/// Wrapper type for numbers that is intended to be used only for the [crate::types::VVRTAny]
+/// and [crate::types::VVRTVariant] structs.
+#[derive(Clone, Copy)]
+#[repr(transparent)]
+pub struct VVRTNumber(u64);
+
+impl VVRTNumber {
+    const FLT_TAG: u8 = 1;
+    const INT_TAG: u8 = !Self::FLT_TAG;
+
+    /// Cast the number as a pointer. We ensure by construction that this pointer is never null.
+    /// You may never deref this pointer!
+    #[inline]
+    pub fn as_ptr(&self) -> *mut u64 {
+        self.0 as *mut _
+    }
+
+    /// In debug mode, assert that the passed bytes are a valid number representation. In case of
+    /// success re-return those bytes.
+    ///
+    /// In release build this function is a NoOp.
+    #[inline]
+    fn assert_is_number(bytes: [u8; 8]) -> [u8; 8] {
+        let [.., flag, z1, z2, z3] = bytes;
+        debug_assert!(z1 == z2 && z2 == z3 && z3 == 0, "invalid number");
+        debug_assert!(flag == Self::INT_TAG || flag == Self::FLT_TAG, "invalid tag");
+        bytes
+    }
+
+    /// Get the byte representation of the number we store.
+    fn as_bytes(&self) -> (u8, [u8; 4]) {
+        let [b1, b2, b3, b4, flag, _, _, _] = Self::assert_is_number(self.0.to_be_bytes());
+        (flag, [b1, b2, b3, b4])
+    }
+
+    /// Create [VVRTAny] from bytes assumed to be a valid number representation.
+    #[inline]
+    pub fn from_number_be_bytes(bytes: [u8; 8]) -> Self {
+        Self(u64::from_be_bytes(Self::assert_is_number(bytes)))
+    }
+
+    /// Tells whever the contained type is a floating number or not.
+    #[inline]
+    pub fn is_f32(&self) -> bool {
+        self.as_bytes().0 == Self::FLT_TAG
+    }
+
+    /// Tells whever the contained type is an integer number or not.
+    #[inline]
+    pub fn is_i32(&self) -> bool {
+        !self.is_f32()
+    }
+}
+
+impl Default for VVRTNumber {
+    fn default() -> Self {
+        0_i32.into()
+    }
+}
+
+impl From<VVRTNumber> for i32 {
+    fn from(value: VVRTNumber) -> Self {
+        let (flag, bytes) = value.as_bytes();
+        either!(flag == VVRTNumber::INT_TAG
+            => i32::from_be_bytes(bytes)
+            ;  f32::from_be_bytes(bytes) as i32
+        )
+    }
+}
+
+impl From<VVRTNumber> for f32 {
+    fn from(value: VVRTNumber) -> Self {
+        let (flag, bytes) = value.as_bytes();
+        either!(flag == VVRTNumber::INT_TAG
+            => i32::from_be_bytes(bytes) as f32
+            ;  f32::from_be_bytes(bytes)
+        )
+    }
+}
+
+impl From<i32> for VVRTNumber {
+    fn from(value: i32) -> Self {
+        let [b1, b2, b3, b4] = value.to_be_bytes();
+        VVRTNumber::from_number_be_bytes([b1, b2, b3, b4, VVRTNumber::INT_TAG, 0, 0, 0])
+    }
+}
+
+impl From<f32> for VVRTNumber {
+    fn from(value: f32) -> Self {
+        let [b1, b2, b3, b4] = value.to_be_bytes();
+        VVRTNumber::from_number_be_bytes([b1, b2, b3, b4, VVRTNumber::FLT_TAG, 0, 0, 0])
+    }
+}
+
+impl std::fmt::Debug for VVRTNumber {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let (flag, bytes) = self.as_bytes();
+        f.debug_struct("VVRTNumber")
+            .field("flag", &flag)
+            .field("bytes", &bytes)
+            .finish()
+    }
+}
+
+impl std::fmt::Display for VVRTNumber {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self.is_f32() {
+            true => write!(f, "{}", Into::<f32>::into(*self)),
+            false => write!(f, "{}", Into::<i32>::into(*self)),
+        }
+    }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/sequence.rs b/src/Rust/vvs_runtime_types/src/types/sequence.rs
new file mode 100644
index 00000000..3d315014
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/sequence.rs
@@ -0,0 +1,107 @@
+use crate::types::*;
+use std::{ptr::NonNull, rc::Rc};
+
+#[derive(Debug, Clone, Copy)]
+#[repr(transparent)]
+pub struct VVRTSeq(NonNull<Vec<VVRTAny>>);
+crate::types::any::impl_try_from_any! { Seq => VVRTSeq }
+
+impl VVRTSeq {
+    #[inline]
+    pub fn dangling() -> Self {
+        Self(NonNull::dangling())
+    }
+
+    #[inline]
+    pub fn as_ptr(self) -> *mut u64 {
+        self.0.as_ptr() as *mut _
+    }
+
+    #[inline]
+    fn as_slice(&self) -> &[VVRTAny] {
+        unsafe { self.0.as_ref() }.as_slice()
+    }
+
+    #[inline]
+    fn from_vec(content: Vec<VVRTAny>) -> Self {
+        unsafe { Self(NonNull::new_unchecked(Rc::into_raw(Rc::new(content)) as *mut _)) }
+    }
+}
+
+impl Default for VVRTSeq {
+    #[inline]
+    fn default() -> Self {
+        Self::from_vec(Default::default())
+    }
+}
+
+impl Eq for VVRTSeq {}
+impl PartialEq for VVRTSeq {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        self.as_slice() == other.as_slice()
+    }
+}
+
+/// Module used to defined functions to be exported to the JIT.
+#[allow(clippy::missing_safety_doc)]
+#[vvs_procmacro::vvrt_bridge(VVRTSeq)]
+mod ffi {
+    #[no_mangle]
+    pub unsafe extern "C" fn new() -> VVRTSeq {
+        Default::default()
+    }
+
+    /// Here we decrement the count of each child because we owned them. We don't support cyclic
+    /// references...
+    #[no_mangle]
+    pub unsafe extern "C" fn drop(this @ VVRTSeq(ptr): VVRTSeq) {
+        this.as_slice().iter().for_each(|child| VVRTAny_drop(*child));
+        Rc::decrement_strong_count(ptr.as_ptr());
+    }
+
+    /// Here we increment the count of each child because we owned them. We don't support cyclic
+    /// references...
+    #[no_mangle]
+    pub unsafe extern "C" fn clone(this @ VVRTSeq(ptr): VVRTSeq) -> VVRTSeq {
+        this.as_slice().iter().for_each(|child| {
+            let _ = VVRTAny_clone(*child);
+        });
+        Rc::increment_strong_count(ptr.as_ptr());
+        VVRTSeq(ptr)
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn deep_clone(VVRTSeq(ptr): VVRTSeq) -> VVRTSeq {
+        let mut content = Vec::with_capacity(ptr.as_ref().len());
+        ptr.as_ref().iter().for_each(|e| content.push(VVRTAny_deep_clone(*e)));
+        VVRTSeq::from_vec(content)
+    }
+
+    /// Get an item from the sequence, clone it.
+    #[no_mangle]
+    pub unsafe extern "C" fn get(this: VVRTSeq, idx: i32) -> VVRTAny {
+        this.as_slice()
+            .get(idx.clamp(0, i32::MAX) as usize)
+            .map(|item| VVRTAny_clone(*item))
+            .unwrap_or_default()
+    }
+
+    /// Push an item into the sequence, we take ownership of the item.
+    #[no_mangle]
+    pub unsafe extern "C" fn push(VVRTSeq(mut this): VVRTSeq, item: VVRTAny) {
+        debug_assert!(
+            !matches!(item.ty(), VVRTType::Table | VVRTType::Seq),
+            "can't store container in containers"
+        );
+        this.as_mut().push(item);
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn len(seq: VVRTSeq) -> i32 {
+        seq.as_slice().len().try_into().expect("sequence to big")
+    }
+
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn eq(this: VVRTSeq, other: VVRTSeq) -> bool { PartialEq::eq(&this, &other) }
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn ne(this: VVRTSeq, other: VVRTSeq) -> bool { PartialEq::ne(&this, &other) }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/string.rs b/src/Rust/vvs_runtime_types/src/types/string.rs
new file mode 100644
index 00000000..e6525f71
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/string.rs
@@ -0,0 +1,122 @@
+use crate::types::*;
+use std::{hash::Hash, ptr::NonNull, rc::Rc};
+
+/// We represent a string, in an FFI-Safe way because slices are not FFI-Safe...
+#[derive(Debug, Clone, Copy)]
+#[repr(transparent)]
+pub struct VVRTString(NonNull<Vec<u8>>);
+crate::types::any::impl_try_from_any! { String => VVRTString }
+
+impl VVRTString {
+    #[inline]
+    pub fn dangling() -> Self {
+        Self(NonNull::dangling())
+    }
+
+    #[inline]
+    pub fn as_ptr(self) -> *mut u64 {
+        self.0.as_ptr() as *mut _
+    }
+
+    #[inline]
+    pub fn as_str(&self) -> &str {
+        unsafe { std::str::from_utf8_unchecked(self.as_bytes()) }
+    }
+
+    #[inline]
+    pub fn as_bytes(&self) -> &[u8] {
+        unsafe { self.0.as_ref().as_slice() }
+    }
+
+    #[inline]
+    pub fn from_bytes(bytes: &[u8]) -> Self {
+        Self::from_vec(bytes.to_vec())
+    }
+
+    #[inline]
+    pub fn from_vec(bytes: Vec<u8>) -> Self {
+        unsafe { VVRTString(NonNull::new_unchecked(Rc::into_raw(Rc::new(bytes)) as *mut _)) }
+    }
+}
+
+impl Default for VVRTString {
+    fn default() -> Self {
+        Self::from_vec(Default::default())
+    }
+}
+
+impl AsRef<str> for VVRTString {
+    #[inline]
+    fn as_ref(&self) -> &str {
+        self.as_str()
+    }
+}
+
+impl Eq for VVRTString {}
+impl PartialEq for VVRTString {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        self.as_str() == other.as_str()
+    }
+}
+
+impl Hash for VVRTString {
+    #[inline]
+    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+        self.as_str().hash(state);
+    }
+}
+
+impl PartialOrd for VVRTString {
+    #[inline]
+    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
+        PartialOrd::partial_cmp(self.as_str(), other.as_str())
+    }
+}
+
+/// Module used to defined functions to be exported to the JIT.
+#[allow(clippy::missing_safety_doc)]
+#[vvs_procmacro::vvrt_bridge(VVRTString)]
+mod ffi {
+    #[no_mangle]
+    unsafe extern "C" fn new_from_raw(ptr: *const u8, len: i32) -> VVRTString {
+        let len: usize = len.try_into().expect("string too big");
+        VVRTString::from_bytes(std::slice::from_raw_parts(ptr, len))
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn cat(left: VVRTString, right: VVRTString) -> VVRTString {
+        let mut res = left.as_bytes().to_vec();
+        res.extend_from_slice(right.as_bytes());
+        VVRTString::from_vec(res)
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn deep_clone(this: VVRTString) -> VVRTString {
+        VVRTString_clone(this)
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn clone(VVRTString(ptr): VVRTString) -> VVRTString {
+        Rc::increment_strong_count(ptr.as_ptr());
+        VVRTString(ptr)
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn drop(VVRTString(ptr): VVRTString) {
+        Rc::decrement_strong_count(ptr.as_ptr())
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn len(str: VVRTString) -> i32 {
+        str.as_str().len().try_into().expect("string too long")
+    }
+
+    use std::cmp::Ordering::*;
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn eq(a: VVRTString, b: VVRTString) -> bool { PartialEq::eq(&a, &b) }
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn ne(a: VVRTString, b: VVRTString) -> bool { PartialEq::ne(&a, &b) }
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn lt(a: VVRTString, b: VVRTString) -> bool { matches!(a.partial_cmp(&b), Some(Less           )) }
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn gt(a: VVRTString, b: VVRTString) -> bool { matches!(a.partial_cmp(&b), Some(Greater        )) }
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn le(a: VVRTString, b: VVRTString) -> bool { matches!(a.partial_cmp(&b), Some(Less    | Equal)) }
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn ge(a: VVRTString, b: VVRTString) -> bool { matches!(a.partial_cmp(&b), Some(Greater | Equal)) }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/syllabe.rs b/src/Rust/vvs_runtime_types/src/types/syllabe.rs
new file mode 100644
index 00000000..4fedf774
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/syllabe.rs
@@ -0,0 +1,91 @@
+use crate::types::*;
+use std::{ptr::NonNull, rc::Rc};
+use vvs_ass::ASSSyllabe;
+
+/// Represent a syllabe, in an ffi-safe way. We represent if the syllabe was create by using an Rc
+/// or was built from a reference.
+#[derive(Debug, Clone, Copy)]
+#[repr(C)]
+pub struct VVRTSyllabe(NonNull<ASSSyllabe<VVRTTable>>);
+crate::types::any::impl_try_from_any! { ASSSyllabe => VVRTSyllabe }
+
+impl VVRTSyllabe {
+    #[inline]
+    pub fn dangling() -> Self {
+        Self(NonNull::dangling())
+    }
+
+    #[inline]
+    pub fn as_ptr(self) -> *mut u64 {
+        self.0.as_ptr() as *mut _
+    }
+
+    #[inline]
+    pub fn is_rc(&self) -> bool {
+        !self.as_ref().aux.rt_infos().is_ass_borrowed
+    }
+}
+
+impl From<ASSSyllabe<VVRTTable>> for VVRTSyllabe {
+    fn from(mut value: ASSSyllabe<VVRTTable>) -> Self {
+        value.aux.rt_infos_mut().is_ass_borrowed = false;
+        let ptr = Rc::into_raw(Rc::new(value)) as *mut _;
+        VVRTSyllabe(unsafe { NonNull::new_unchecked(ptr) })
+    }
+}
+
+impl AsRef<ASSSyllabe<VVRTTable>> for VVRTSyllabe {
+    fn as_ref(&self) -> &ASSSyllabe<VVRTTable> {
+        unsafe { self.0.as_ref() }
+    }
+}
+
+impl AsMut<ASSSyllabe<VVRTTable>> for VVRTSyllabe {
+    fn as_mut(&mut self) -> &mut ASSSyllabe<VVRTTable> {
+        unsafe { self.0.as_mut() }
+    }
+}
+
+
+impl Eq for VVRTSyllabe {}
+impl PartialEq for VVRTSyllabe {
+    fn eq(&self, other: &Self) -> bool {
+        self.as_ref().eq(other.as_ref())
+    }
+}
+
+/// Module used to defined functions to be exported to the JIT.
+#[allow(clippy::missing_safety_doc)]
+#[vvs_procmacro::vvrt_bridge(VVRTSyllabe)]
+mod ffi {
+    #[no_mangle]
+    pub unsafe extern "C" fn deep_clone(this: VVRTSyllabe) -> VVRTSyllabe {
+        this.as_ref().clone().into()
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn clone(this @ VVRTSyllabe(ptr): VVRTSyllabe) -> VVRTSyllabe {
+        match this.is_rc() {
+            false => VVRTSyllabe_deep_clone(this),
+            true => {
+                Rc::increment_strong_count(ptr.as_ptr());
+                this
+            }
+        }
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn drop(this @ VVRTSyllabe(ptr): VVRTSyllabe) {
+        if this.is_rc() {
+            Rc::decrement_strong_count(ptr.as_ptr())
+        }
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn len(this: VVRTSyllabe) -> i32 {
+        this.as_ref().content.len().clamp(0, i32::MAX as usize) as i32
+    }
+
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn eq(this: VVRTSyllabe, other: VVRTSyllabe) -> bool { PartialEq::eq(&this, &other) }
+    #[rustfmt::skip] #[no_mangle] pub unsafe extern "C" fn ne(this: VVRTSyllabe, other: VVRTSyllabe) -> bool { PartialEq::ne(&this, &other) }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/table.rs b/src/Rust/vvs_runtime_types/src/types/table.rs
new file mode 100644
index 00000000..fa89182e
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/table.rs
@@ -0,0 +1,171 @@
+use crate::types::*;
+use hashbrown::HashMap;
+use std::{ptr::NonNull, rc::Rc};
+
+/// Aux struct used to store infos about runtime types that imbark a VVRTTable and where we don't
+/// have enaugh space in the trailing zeros of the pointer to store them...
+#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
+pub struct VVRTInfos {
+    pub is_ass_borrowed: bool,
+}
+
+/// A table, really just a hashmap.
+///
+/// NOTE: Needs to be clone to be able to be used in the ASS things...
+///
+/// In a table we also embark an AUX structure to store runtime informations about ass types that
+/// owns this table, or any other thing that may be necessary latter down the line... When
+/// comparing tables we don't compare the [VVRTInfos] struct.
+#[derive(Debug, Clone, Copy)]
+#[repr(transparent)]
+pub struct VVRTTable(NonNull<(HashMap<VVRTString, VVRTAny>, VVRTInfos)>);
+crate::types::any::impl_try_from_any! { Table => VVRTTable }
+
+impl VVRTTable {
+    #[inline]
+    pub fn dangling() -> Self {
+        Self(NonNull::dangling())
+    }
+
+    #[inline]
+    pub fn as_ptr(self) -> *mut u64 {
+        self.0.as_ptr() as *mut _
+    }
+
+    #[inline]
+    pub fn iter(&self) -> hashbrown::hash_map::Iter<VVRTString, VVRTAny> {
+        unsafe { self.0.as_ref() }.0.iter()
+    }
+
+    #[inline]
+    pub fn iter_mut(&mut self) -> hashbrown::hash_map::IterMut<VVRTString, VVRTAny> {
+        unsafe { self.0.as_mut() }.0.iter_mut()
+    }
+
+    #[inline]
+    pub fn rt_infos(&self) -> &VVRTInfos {
+        &unsafe { self.0.as_ref() }.1
+    }
+
+    #[inline]
+    pub fn rt_infos_mut(&mut self) -> &mut VVRTInfos {
+        &mut unsafe { self.0.as_mut() }.1
+    }
+}
+
+impl AsMut<HashMap<VVRTString, VVRTAny>> for VVRTTable {
+    fn as_mut(&mut self) -> &mut HashMap<VVRTString, VVRTAny> {
+        &mut unsafe { self.0.as_mut() }.0
+    }
+}
+
+impl AsRef<HashMap<VVRTString, VVRTAny>> for VVRTTable {
+    fn as_ref(&self) -> &HashMap<VVRTString, VVRTAny> {
+        &unsafe { self.0.as_ref() }.0
+    }
+}
+
+impl vvs_ass::AuxTable for VVRTTable {
+    #[inline]
+    fn deep_clone(&self) -> Self {
+        unsafe { VVRTTable_deep_clone(*self) }
+    }
+}
+
+impl Default for VVRTTable {
+    #[inline]
+    fn default() -> Self {
+        HashMap::<VVRTString, VVRTAny>::default().into()
+    }
+}
+
+impl From<HashMap<VVRTString, VVRTAny>> for VVRTTable {
+    #[inline]
+    fn from(value: HashMap<VVRTString, VVRTAny>) -> Self {
+        Self(unsafe { NonNull::new_unchecked(Rc::into_raw(Rc::new(value)) as *mut _) })
+    }
+}
+
+impl Eq for VVRTTable {}
+impl PartialEq for VVRTTable {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        self.as_ref().eq(other.as_ref())
+    }
+}
+
+/// Module used to define functions to be exported for the JIT.
+#[allow(clippy::missing_safety_doc)]
+#[vvs_procmacro::vvrt_bridge(VVRTTable)]
+mod ffi {
+    #[no_mangle]
+    pub unsafe extern "C" fn new() -> VVRTTable {
+        Default::default()
+    }
+
+    /// Deeply clone the table.
+    #[no_mangle]
+    pub unsafe extern "C" fn deep_clone(this: VVRTTable) -> VVRTTable {
+        this.as_ref()
+            .iter()
+            .map(|(k, v)| (VVRTString_clone(*k), VVRTAny_deep_clone(*v)))
+            .collect::<HashMap<_, _>>()
+            .into()
+    }
+
+    /// Increment the count of each child because we own them. This function is not-reentrent and
+    /// we don't support cyclic references...
+    #[no_mangle]
+    pub unsafe extern "C" fn clone(this @ VVRTTable(ptr): VVRTTable) -> VVRTTable {
+        this.iter().for_each(|(key, value)| {
+            let _ = VVRTString_clone(*key);
+            let _ = VVRTAny_clone(*value);
+        });
+        Rc::increment_strong_count(ptr.as_ptr());
+        VVRTTable(ptr)
+    }
+
+    // Decrement the count of each child because we own them. We don't support cyclic references...
+    #[no_mangle]
+    pub unsafe extern "C" fn drop(this @ VVRTTable(ptr): VVRTTable) {
+        this.iter().for_each(|(key, value)| {
+            VVRTString_drop(*key);
+            VVRTAny_drop(*value);
+        });
+        Rc::decrement_strong_count(ptr.as_ptr())
+    }
+
+    /// Insert something into the table. Any old present value will be dropped. The key and value
+    /// are consumed by this function.
+    #[no_mangle]
+    pub unsafe extern "C" fn insert(mut table: VVRTTable, key: VVRTString, value: VVRTAny) {
+        debug_assert!(
+            !matches!(value.ty(), VVRTType::Table | VVRTType::Seq),
+            "can't store container in containers"
+        );
+        if let Some(old) = table.as_mut().insert(key, value) {
+            VVRTAny_drop(old)
+        }
+    }
+
+    /// Insert something into the table. Any old present value will be dropped. The value is
+    /// consumed by this function. The key string will be used to create a new string.
+    #[no_mangle]
+    pub unsafe extern "C" fn insert_from_raw_key(table: VVRTTable, key: *const u8, len: i32, value: VVRTAny) {
+        let key = VVRTString_new_from_raw(key, len);
+        VVRTTable_insert(table, key, value);
+    }
+
+    /// Get the content of of the table. The thing is cloned when getted from the table.
+    #[no_mangle]
+    pub unsafe extern "C" fn get(table: VVRTTable, key: VVRTString) -> VVRTAny {
+        table
+            .as_ref()
+            .get(&key)
+            .map(|item| VVRTAny_clone(*item))
+            .unwrap_or_default()
+    }
+
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn eq(this: VVRTTable, other: VVRTTable) -> bool { PartialEq::eq(&this, &other) }
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn ne(this: VVRTTable, other: VVRTTable) -> bool { PartialEq::ne(&this, &other) }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/test.rs b/src/Rust/vvs_runtime_types/src/types/test.rs
new file mode 100644
index 00000000..f10738bf
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/test.rs
@@ -0,0 +1,30 @@
+use super::*;
+use std::mem::size_of;
+
+#[test]
+fn nil_and_options() {
+    let nil = unsafe { VVRTAny_nil() };
+    assert_eq!(nil.ty(), VVRTType::Nil, "invalid type");
+    assert_eq!(size_of::<VVRTType>(), size_of::<Option<VVRTType>>());
+}
+
+#[test]
+fn any_integer() {
+    unsafe {
+        let zero = Into::<VVRTAny>::into(0i32);
+        assert!(VVRTAny_is_ty(zero, VVRTType::Number));
+        assert!(!zero.number_is_f32());
+        assert!(zero.number_is_i32());
+        assert_eq!(VVRTAny_as_integer(zero), 0);
+        assert_eq!(VVRTAny_as_floating(zero), 0.0);
+
+        let zero = Into::<VVRTAny>::into(0f32);
+        assert!(VVRTAny_is_ty(zero, VVRTType::Number));
+        assert!(zero.number_is_f32());
+        assert!(!zero.number_is_i32());
+        assert_eq!(VVRTAny_as_integer(zero), 0);
+        assert_eq!(VVRTAny_as_floating(zero), 0.0);
+
+        assert!(VVRTAny_ne(Into::<VVRTAny>::into(0f32), Into::<VVRTAny>::into(0i32)));
+    }
+}
diff --git a/src/Rust/vvs_runtime_types/src/types/variant.rs b/src/Rust/vvs_runtime_types/src/types/variant.rs
new file mode 100644
index 00000000..92da9f77
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/types/variant.rs
@@ -0,0 +1,361 @@
+use crate::types::*;
+use anyhow::{anyhow, bail, ensure};
+use std::{
+    alloc,
+    mem::{size_of, transmute},
+    ptr::NonNull,
+    slice, str,
+};
+
+/// Store all the registered variants. We share variants between colors and movements.
+static mut VARIANTS: Vec<VariantDescription> = Vec::new();
+
+struct VariantDescription {
+    /// The name of the variant family in the AST, like color or movement.
+    ast_name: &'static str,
+
+    /// The name of the variant in its family, like `rgb`, `move`, etc.
+    variant_name: &'static str,
+
+    /// The content of this variant, we store the runtime types here.
+    arguments: Vec<VVRTType>,
+
+    /// The layout of this variant. If we have a string we don't store the content of said string
+    /// here, we only take into account the integer used to store the length of the string.
+    layout: alloc::Layout,
+
+    /// The layouts of the content of this variant. Note that we also store the offset of the
+    /// discriminent in this vector. Because of that, we have the following:
+    /// `assert!(arguments.len() == offsets.len() + 1)`;
+    offsets: Vec<usize>,
+}
+
+unsafe fn get_variant_argument_count_by_discriminent(discriminent: usize) -> i32 {
+    VARIANTS[discriminent].arguments.len() as i32
+}
+
+unsafe fn get_variant_desc_by_name(
+    ast: &str,
+    var: &str,
+) -> (usize, &'static alloc::Layout, &'static [usize], &'static [VVRTType]) {
+    VARIANTS
+        .iter()
+        .enumerate()
+        .find_map(
+            |(idx, VariantDescription { ast_name, variant_name, layout, offsets, arguments })| {
+                (*ast_name == ast && *variant_name == var).then_some((idx, layout, &**offsets, &**arguments))
+            },
+        )
+        .expect("asked to build an invalid variant")
+}
+
+#[derive(Debug, Clone, Copy)]
+#[repr(transparent)]
+pub struct VVRTVariant(NonNull<u64>);
+crate::types::any::impl_try_from_any! { Variant => VVRTVariant }
+
+impl VVRTVariant {
+    #[inline]
+    pub fn dangling() -> Self {
+        Self(NonNull::dangling())
+    }
+
+    #[inline]
+    pub fn discriminent(&self) -> usize {
+        unsafe { *transmute::<*mut u64, *const usize>(self.0.as_ptr()) }
+    }
+
+    /// # Safety
+    /// This function is not thread safe.
+    pub unsafe fn register_runtime_variant(
+        ast_name: &'static str,
+        variant_name: &'static str,
+        arguments: Vec<VVRTType>,
+    ) -> anyhow::Result<()> {
+        use VVRTType::*;
+        let name = format!("{ast_name}.{variant_name}");
+
+        if let [heads @ .., last] = &arguments[..] {
+            heads.iter().copied().enumerate().try_for_each(|(idx, ty)| {
+                (!matches!(ty, Number))
+                    .then_some(())
+                    .ok_or_else(|| anyhow!("found invalid argument type `{ty}` at position {idx} in variant `{name}`"))
+            })?;
+            ensure!(
+                matches!(last, String | Number),
+                "found invalid argument type `{last}` at last position in variant `{name}`"
+            );
+        }
+
+        (!VARIANTS
+            .iter()
+            .any(|desc| desc.ast_name == ast_name && desc.variant_name == variant_name))
+        .then(|| -> anyhow::Result<()> {
+            let (layout, offsets) = VVRTVariant::layout(&arguments)?;
+            VARIANTS.push(VariantDescription { ast_name, variant_name, arguments, layout, offsets });
+            Ok(())
+        })
+        .ok_or_else(|| anyhow!("redefinition of variant {name}"))?
+    }
+
+    /// Get the location of the variant.
+    #[inline]
+    pub fn as_ptr(self) -> *mut u64 {
+        self.0.as_ptr()
+    }
+
+    /// Get the base of the memory corresponding to the passed index along side the type of this
+    /// memory location.
+    unsafe fn offset_of_index(&self, idx: i32) -> (*const u8, VVRTType) {
+        let VariantDescription { arguments, offsets, .. } =
+            VARIANTS.get(self.discriminent()).expect("variant was not valid");
+
+        debug_assert!(arguments.len() == offsets.len() + 1, "invalid variant");
+        debug_assert!(arguments.len() > idx as usize, "invalid index");
+
+        // In the offsets we store the initial index for the discriminent in the offsets also!
+        let ptr: *const u8 = self.0.as_ptr().byte_add(offsets[idx as usize + 1]) as *const _;
+        (ptr, arguments[idx as usize])
+    }
+
+    /// Compute the layout for the content of a variant. Because of how we represent strings in a
+    /// variant, a vairant is immutable, like strings. Here we don't put the space for the content
+    /// of the string because we can't know it.
+    fn layout(body: &[VVRTType]) -> anyhow::Result<(alloc::Layout, Vec<usize>)> {
+        // We need the first element to be the discriminent of the variant. The discriminent is
+        // the index in the variant vector, thus we need a usize.
+        let init = (alloc::Layout::new::<usize>(), vec![0]);
+
+        // We fold the body into the layout.
+        let fold = |(body, mut offsets): (alloc::Layout, Vec<usize>), elem: VVRTType| {
+            let (body, next) = body.extend(match elem {
+                // Only the length. Because of the alignement, the next two bytes are always
+                // allocated for the content of the string, so we don't waste too much space.
+                VVRTType::String => alloc::Layout::new::<i32>(),
+
+                // For numbers we directly use an any.
+                VVRTType::Number => alloc::Layout::new::<VVRTAny>(),
+
+                _ => bail!("invalid type `{elem}` in variant"),
+            })?;
+            offsets.push(next);
+            Ok::<_, anyhow::Error>((body, offsets))
+        };
+
+        body.iter()
+            .copied()
+            .try_fold(init, fold)
+            .map(|(layout, offsets)| (layout.pad_to_align(), offsets))
+    }
+
+    /// Get the layout for the current value. In this layout we have the space for the content of
+    /// the string.
+    fn get_value_layout(&self) -> alloc::Layout {
+        let VariantDescription { arguments, layout, offsets, .. } = unsafe { &VARIANTS[self.discriminent()] };
+
+        match (arguments.last(), offsets.last()) {
+            (Some(VVRTType::String), Some(offset)) => {
+                // Get the memory layout for where we store the string.
+                let str_len = unsafe { *(self.0.as_ptr().add(*offset) as *const i32) as usize };
+                let str_layout = alloc::Layout::array::<u8>(str_len);
+
+                // Get the total layout. Just assert we are not doing things too big.
+                let layout = layout.extend(str_layout.expect("too big")).expect("too big").0;
+
+                // Because of C things, we must pad the layout up to the align value, which should
+                // be the same as `*mut u64`.
+                layout.pad_to_align()
+            }
+
+            _ => *layout,
+        }
+    }
+
+    /// Like [VVRTVariant_get] but for [VVRTNumber]. Return default on type error.
+    fn get_number(&self, idx: i32) -> VVRTNumber {
+        match unsafe { self.offset_of_index(idx) } {
+            (ptr, VVRTType::Number) => Into::into(unsafe { *(ptr as *const VVRTAny) }),
+            _ => Default::default(),
+        }
+    }
+
+    /// Like [self::VVRTVariant_get] but for the string in the variant. Return default on type
+    /// error. Here we don't have an index because we know that we have only one string in the
+    /// variant and that it's at the last index.
+    fn get_string(&self) -> &str {
+        match unsafe { self.offset_of_index(get_variant_argument_count_by_discriminent(self.discriminent()) - 1) } {
+            (ptr, VVRTType::String) => unsafe {
+                str::from_utf8_unchecked(slice::from_raw_parts(
+                    ptr.byte_add(size_of::<i32>()),
+                    *(ptr as *const i32) as usize,
+                ))
+            },
+            _ => Default::default(),
+        }
+    }
+}
+
+impl AsRef<[u8]> for VVRTVariant {
+    #[inline]
+    fn as_ref(&self) -> &[u8] {
+        unsafe { slice::from_raw_parts(self.0.as_ptr() as *const u8, self.get_value_layout().size()) }
+    }
+}
+
+impl Eq for VVRTVariant {}
+impl PartialEq for VVRTVariant {
+    #[inline]
+    fn eq(&self, other: &Self) -> bool {
+        (self.discriminent() == other.discriminent()) && (self.as_ref() == other.as_ref())
+    }
+}
+
+/// Module used to defined functions to be exported to the JIT.
+#[allow(clippy::missing_safety_doc)]
+#[vvs_procmacro::vvrt_bridge(VVRTVariant)]
+mod ffi {
+    use std::borrow::Cow;
+
+    #[no_mangle]
+    unsafe extern "C" fn new(
+        ast_ptr: *const u8,
+        ast_len: i32,
+        var_ptr: *const u8,
+        var_len: i32,
+        str_ptr: *const u8,
+        str_len: i32,
+    ) -> VVRTVariant {
+        let ast = str::from_utf8_unchecked(slice::from_raw_parts(ast_ptr, ast_len as usize));
+        let var = str::from_utf8_unchecked(slice::from_raw_parts(var_ptr, var_len as usize));
+        let (discriminent, layout, offsets, types) = get_variant_desc_by_name(ast, var);
+
+        // Get the layout for the variant to allocate.
+        let (layout, string_offset) = match types {
+            [body @ .., _] if body.iter().copied().any(|t| t == VVRTType::String) => {
+                unreachable!("strings must be in last position in variants")
+            }
+            [.., VVRTType::String] => {
+                let (layout, next) = layout
+                    .extend(alloc::Layout::array::<u8>(str_len as usize).expect("too big"))
+                    .expect("too big");
+                (layout.pad_to_align(), Some(next))
+            }
+            _ => (*layout, None),
+        };
+
+        // Create and initialize the variant. Pay attention that the unit of the pointer is a byte
+        // (a u8...)
+        let ptr: NonNull<u8> = NonNull::new(alloc::alloc(layout)).expect("out of memory");
+        *transmute::<*mut u8, *mut usize>(ptr.as_ptr()) = discriminent;
+        slice::from_raw_parts_mut(ptr.as_ptr(), layout.size())
+            .iter_mut()
+            .skip(size_of::<usize>())
+            .for_each(|byte: &mut u8| std::ptr::write(byte, 0));
+
+        // If we have a string we must copy it.
+        if let Some(string_offset) = string_offset {
+            std::ptr::write(
+                ptr.as_ptr().byte_add(*offsets.last().expect("invalid variant")) as *mut i32,
+                str_len,
+            );
+            std::ptr::copy_nonoverlapping(str_ptr, ptr.as_ptr().byte_add(string_offset), str_len as usize);
+        }
+
+        // Ok, we can return the thing.
+        VVRTVariant(NonNull::new_unchecked(ptr.as_ptr() as *mut _))
+    }
+
+    /// Create a new string from the content of the variant.
+    #[no_mangle]
+    unsafe extern "C" fn to_string(var: VVRTVariant) -> VVRTString {
+        let discriminent = var.discriminent();
+        let VariantDescription { ast_name, variant_name, arguments, .. } = &VARIANTS[discriminent];
+        let mut pretty = format!("#({ast_name}.{variant_name}");
+
+        arguments.iter().copied().enumerate().for_each(|(idx, arg)| {
+            pretty.push_str(if idx == 0 { " " } else { ", " });
+            pretty.push_str(&match arg {
+                VVRTType::Number => Cow::Owned(format!("{}", var.get_number(idx as i32))),
+                VVRTType::String => Cow::Borrowed(var.get_string()),
+                ty => unreachable!("invalid variant {ast_name}.{variant_name} at idx {idx}, got type: {ty}"),
+            });
+        });
+
+        pretty.push(')');
+        VVRTString::from_vec(pretty.into())
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn clone(this: VVRTVariant) -> VVRTVariant {
+        let layout = this.get_value_layout(); // Get the layout of the value, because we need to
+                                              // take into account the string part if any.
+        let ptr = NonNull::new(alloc::alloc(layout) as *mut u64).expect("out of memory");
+        std::ptr::copy_nonoverlapping(this.0.as_ptr() as *const u8, ptr.as_ptr() as *mut u8, layout.size());
+        VVRTVariant(ptr)
+    }
+
+    /// Like [self::VVRTVariant_get] but for the string in the variant. Return default on type
+    /// error. Here we don't have an index because we know that we have only one string in the
+    /// variant and that it's at the last index. The string is allocated here and the codegen will
+    /// need to insert a drop call...
+    #[no_mangle]
+    pub unsafe extern "C" fn get_string(this: VVRTVariant) -> VVRTString {
+        Into::into(VVRTString::from_bytes(this.get_string().as_bytes()))
+    }
+
+    /// Like [self::VVRTVariant_get] but for i32. Return default on type error.
+    #[no_mangle]
+    pub unsafe extern "C" fn get_i32(this: VVRTVariant, idx: i32) -> i32 {
+        this.get_number(idx).into()
+    }
+
+    /// Like [self::VVRTVariant_get] but for f32. Return default on type error.
+    #[no_mangle]
+    pub unsafe extern "C" fn get_f32(this: VVRTVariant, idx: i32) -> f32 {
+        this.get_number(idx).into()
+    }
+
+    /// Clone the result, may be freed by the user.
+    #[no_mangle]
+    pub unsafe extern "C" fn get(this: VVRTVariant, idx: i32) -> VVRTAny {
+        match this.offset_of_index(idx) {
+            // For numbers we use directly the any to store them. Because of the discriminent
+            // everything is already aligned in a good way.
+            (ptr, VVRTType::Number) => *(ptr as *const VVRTAny),
+
+            // We have a string, the first 4 bytes are the length of said string, the next things
+            // are the content of said string.
+            (ptr, VVRTType::String) => Into::into(VVRTString::from_bytes(slice::from_raw_parts(
+                ptr.byte_add(size_of::<i32>()),
+                *(ptr as *const i32) as usize,
+            ))),
+
+            _ => unreachable!("variant was not valid"),
+        }
+    }
+
+    #[no_mangle]
+    pub unsafe extern "C" fn deep_clone(this: VVRTVariant) -> VVRTVariant {
+        VVRTVariant_clone(this)
+    }
+
+    /// Creates a new string!
+    #[no_mangle]
+    unsafe extern "C" fn get_variant_name(ptr: VVRTVariant) -> VVRTString {
+        VVRTString::from_bytes(VARIANTS[ptr.discriminent()].variant_name.as_bytes())
+    }
+
+    /// Creates a new string!
+    #[no_mangle]
+    unsafe extern "C" fn get_ast_name(ptr: VVRTVariant) -> VVRTString {
+        VVRTString::from_bytes(VARIANTS[ptr.discriminent()].ast_name.as_bytes())
+    }
+
+    #[no_mangle]
+    unsafe extern "C" fn drop(var @ VVRTVariant(ptr): VVRTVariant) {
+        alloc::dealloc(ptr.as_ptr() as *mut _, var.get_value_layout());
+    }
+
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn eq(this: VVRTVariant, other: VVRTVariant) -> bool { PartialEq::eq(&this, &other) }
+    #[rustfmt::skip] #[no_mangle] unsafe extern "C" fn ne(this: VVRTVariant, other: VVRTVariant) -> bool { PartialEq::ne(&this, &other) }
+}
diff --git a/src/Rust/vvs_runtime_types/src/vvll.rs b/src/Rust/vvs_runtime_types/src/vvll.rs
new file mode 100644
index 00000000..cbaaeed3
--- /dev/null
+++ b/src/Rust/vvs_runtime_types/src/vvll.rs
@@ -0,0 +1,101 @@
+#![allow(non_snake_case)]
+
+use hashbrown::{HashMap, HashSet};
+use std::{ffi::CString, sync::OnceLock};
+use vvs_lang::ast::ASTType;
+use vvs_llvm::*;
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub struct ManageFunctions {
+    pub clone: &'static str,
+    pub drop: &'static str,
+}
+
+/// Store properties about a type and the associated functions.
+#[derive(Debug, Default)]
+pub struct Properties {
+    /// The drop/clone functions if present for this type. If [None], then we don't need to manage
+    /// the memory for this type. The drop function takes the thing, and the clone a const pointer
+    /// to the thing.
+    pub manage: Option<ManageFunctions>,
+
+    /// The function to call to check the equality. Must take only two arguments, const pointers to
+    /// the same type, and return a boolean. This function doesn't consume the arguments.
+    pub equality: Option<&'static str>,
+
+    /// The function to call to get the length of the item. Must take one argument, a const pointer
+    /// to the thing. This function doesn't consume the arguments. This function returns an
+    /// integer.
+    pub len: Option<&'static str>,
+
+    /// Stores all the methods with some informations about them.
+    pub methods: HashMap<&'static str, (unsafe extern "C" fn(), LLVMTypeRef, ASTType)>,
+}
+
+/// Trait used to give to the codegen the layout and functions associated with a type that is
+/// present in the runtime and that must be handled in the codegen.
+pub trait LLVMExported {
+    /// Get the layout of the type.
+    ///
+    /// # Safety
+    /// The [LLVMContextRef] must be valid.
+    unsafe fn llvm_type(_: LLVMContextRef) -> LLVMTypeRef;
+
+    /// Get all the functions associated with a type and some properties of this type. For example,
+    /// integers and floating numbers can be copied without having to clone them, but strings, any,
+    /// table, sequences, etc, must be cloned and dropped when no longer used.
+    ///
+    /// # Safety
+    /// The [LLVMContextRef] must be valid.
+    unsafe fn llvm_properties(_: LLVMContextRef) -> Properties;
+}
+
+/// Tells if a type is managed or not.
+///
+/// # Safety
+/// - All the managed types must have been exported into at least one module
+/// - This function is not thread-safe
+pub unsafe fn LLVMTypeIsManaged(ty: LLVMTypeRef) -> bool {
+    managed_types().contains(&ty)
+}
+
+unsafe fn managed_types() -> &'static mut HashSet<LLVMTypeRef> {
+    static mut MANAGED_TYPES: OnceLock<HashSet<LLVMTypeRef>> = OnceLock::new();
+    MANAGED_TYPES.get_or_init(HashSet::new);
+    MANAGED_TYPES.get_mut().expect(" should have been created")
+}
+
+/// Register all the exported types and functions into a module.
+///
+/// # Safety
+/// - The [LLVMContextRef] must be valid
+/// - the [LLVMModuleRef] must be valid
+/// - This function is not thread-safe
+pub unsafe fn LLVMRegisterExportedIntoModule(
+    c: LLVMContextRef,
+    m: LLVMModuleRef,
+) -> Vec<(&'static str, ASTType, LLVMValueRef, LLVMTypeRef)> {
+    let mut ret = Vec::default();
+
+    macro_rules! handle {
+        ($ty: ty, $($tys: ty),+ $(,)?) => {
+            handle!($ty);
+            handle!($($tys),+);
+        };
+        ($ty: ty) => {
+            let Properties { manage, equality: _, len: _, methods } = <$ty>::llvm_properties(c);
+            if manage.is_some() {
+                managed_types().insert(<$ty>::llvm_type(c));
+            }
+            for (name, (_, ty, asttype)) in methods {
+                let cstr = CString::new(name).expect("invalid function name");
+                let function = unsafe { LLVMAddFunction(m, cstr.as_ptr(), ty) };
+                ret.push((name, asttype, function, ty));
+            }
+        };
+    }
+
+    use crate::types::*;
+    handle!(VVRTType, VVRTAny, VVRTSeq, VVRTString, VVRTTable);
+    ret
+}
diff --git a/src/Rust/vvs_utils/Cargo.toml b/src/Rust/vvs_utils/Cargo.toml
index b27c119f..557198c6 100644
--- a/src/Rust/vvs_utils/Cargo.toml
+++ b/src/Rust/vvs_utils/Cargo.toml
@@ -1,12 +1,13 @@
 [package]
-name = "vvs_utils"
+name              = "vvs_utils"
+description       = "Utility crate for VVS"
 version.workspace = true
 authors.workspace = true
 edition.workspace = true
 license.workspace = true
-description = "Utility crate for VVS"
 
 [dependencies]
 thiserror.workspace = true
-serde.workspace = true
-log.workspace = true
+anyhow.workspace    = true
+serde.workspace     = true
+log.workspace       = true
diff --git a/src/Rust/vvs_utils/src/angles.rs b/src/Rust/vvs_utils/src/angles.rs
index 53424bca..4a2ecc70 100644
--- a/src/Rust/vvs_utils/src/angles.rs
+++ b/src/Rust/vvs_utils/src/angles.rs
@@ -1,17 +1,21 @@
 use core::{f32::consts::PI as PI_32, f64::consts::PI as PI_64};
 
+#[inline]
 pub fn f64_randians_clamp(rad: f64) -> f64 {
     rad % (2.0 * PI_64)
 }
 
+#[inline]
 pub fn f64_degres_clamp(rad: f64) -> f64 {
     rad % 360.0
 }
 
+#[inline]
 pub fn f32_randians_clamp(rad: f32) -> f32 {
     rad % (2.0 * PI_32)
 }
 
+#[inline]
 pub fn f32_degres_clamp(rad: f32) -> f32 {
     rad % 360.0
 }
diff --git a/src/Rust/vvs_utils/src/assert.rs b/src/Rust/vvs_utils/src/assert.rs
index 2f34f04c..13f886d0 100644
--- a/src/Rust/vvs_utils/src/assert.rs
+++ b/src/Rust/vvs_utils/src/assert.rs
@@ -33,7 +33,7 @@ macro_rules! assert_ok {
     ($x: expr) => {
         match $x {
             Ok(x) => x,
-            Err(e) => panic!("failed '{}' with error '{e:?}'", stringify!($x)),
+            Err(e) => panic!("failed '{}' with error '{e}'", stringify!($x)),
         }
     };
 }
diff --git a/src/Rust/vvs_utils/src/conds.rs b/src/Rust/vvs_utils/src/conds.rs
index 98256e0c..715b6cc2 100644
--- a/src/Rust/vvs_utils/src/conds.rs
+++ b/src/Rust/vvs_utils/src/conds.rs
@@ -9,10 +9,12 @@ macro_rules! either {
     }};
 }
 
+#[inline]
 pub fn f64_epsilon_eq(a: f64, b: f64) -> bool {
     (a - b).abs() <= 10E-10
 }
 
+#[inline]
 pub fn f32_epsilon_eq(a: f32, b: f32) -> bool {
     (a - b).abs() <= 10E-7
 }
diff --git a/src/Rust/vvs_utils/src/file/lock.rs b/src/Rust/vvs_utils/src/file/lock.rs
index 4dfbdf33..9d17fdc9 100644
--- a/src/Rust/vvs_utils/src/file/lock.rs
+++ b/src/Rust/vvs_utils/src/file/lock.rs
@@ -28,6 +28,7 @@ pub type LockResult<T> = Result<T, LockError>;
 pub struct LockFile(File);
 
 impl LockFile {
+    #[inline]
     fn handle_xdg_error(err: XDGError) -> LockError {
         match err {
             XDGError::ConfigIO(_, _, err) => Self::handle_io_error(err),
@@ -35,6 +36,7 @@ impl LockFile {
         }
     }
 
+    #[inline]
     fn handle_io_error(err: IoError) -> LockError {
         match err.kind() {
             std::io::ErrorKind::AlreadyExists => LockError::AlreadyLocked,
@@ -42,6 +44,7 @@ impl LockFile {
         }
     }
 
+    #[inline]
     fn create(app: impl AsRef<str>, file: String) -> LockResult<Self> {
         match XDGFolder::RuntimeDir
             .find(app, file, XDGFindBehaviour::NonExistingOnly)
@@ -58,6 +61,7 @@ impl LockFile {
     }
 
     /// Create a lock file for another file.
+    #[inline]
     pub fn for_file(app: impl AsRef<str>, path: impl AsRef<Path>) -> LockResult<Self> {
         let mut s = DefaultHasher::new();
         path.as_ref().hash(&mut s);
@@ -65,6 +69,7 @@ impl LockFile {
     }
 
     /// Create a lock file for an hashable ressource.
+    #[inline]
     pub fn for_resource(app: impl AsRef<str>, rsc: impl Hash) -> LockResult<Self> {
         let mut s = DefaultHasher::new();
         rsc.hash(&mut s);
@@ -72,12 +77,14 @@ impl LockFile {
     }
 
     /// Create a lock file for an ID.
+    #[inline]
     pub fn for_id(app: impl AsRef<str>, id: u64) -> LockResult<Self> {
         Self::create(app, format!("{id:#X}.id.lock"))
     }
 }
 
 impl Drop for LockFile {
+    #[inline]
     fn drop(&mut self) {
         todo!("drop {:?}", self.0)
     }
diff --git a/src/Rust/vvs_utils/src/file/temp.rs b/src/Rust/vvs_utils/src/file/temp.rs
index 63537b83..0a5dcd0b 100644
--- a/src/Rust/vvs_utils/src/file/temp.rs
+++ b/src/Rust/vvs_utils/src/file/temp.rs
@@ -32,18 +32,21 @@ pub struct TempFile(File);
 impl Deref for TempFile {
     type Target = File;
 
+    #[inline]
     fn deref(&self) -> &Self::Target {
         &self.0
     }
 }
 
 impl DerefMut for TempFile {
+    #[inline]
     fn deref_mut(&mut self) -> &mut Self::Target {
         &mut self.0
     }
 }
 
 impl TempFile {
+    #[inline]
     fn handle_xdg_error(err: XDGError) -> TempError {
         match err {
             XDGError::ConfigIO(_, _, err) => Self::handle_io_error(err),
@@ -51,6 +54,7 @@ impl TempFile {
         }
     }
 
+    #[inline]
     fn handle_io_error(err: IoError) -> TempError {
         match err.kind() {
             std::io::ErrorKind::AlreadyExists => TempError::Duplicate,
@@ -59,6 +63,7 @@ impl TempFile {
     }
 
     #[cfg(unix)]
+    #[inline]
     fn create(app: impl AsRef<str>, file: impl AsRef<str>) -> TempResult<PathBuf> {
         let list = XDGFolder::RuntimeDir
             .find(app, file, XDGFindBehaviour::NonExistingOnly)
@@ -83,10 +88,7 @@ impl TempFile {
         if !folder.is_dir() {
             Err(IoError::new(
                 IoErrorKind::NotFound,
-                format!(
-                    "folder doesn't exists or is not a directory: {}",
-                    folder.to_string_lossy()
-                ),
+                format!("folder doesn't exists or is not a directory: {}", folder.to_string_lossy()),
             )
             .into())
         } else {
@@ -98,6 +100,7 @@ impl TempFile {
     /// Create a new temporary file somewhere. Note that the creation pattern is predictible and
     /// not secure in any way. Moreover we depend on the fact that PID from dead processes are not
     /// reused between reboots, and that temp folder are cleared at reboots...
+    #[inline]
     pub fn new(app: impl AsRef<str>) -> TempResult<Self> {
         let (pid, rand) = (std::process::id(), crate::rand());
         let file = OpenOptions::new()
diff --git a/src/Rust/vvs_utils/src/lib.rs b/src/Rust/vvs_utils/src/lib.rs
index 9a351c50..f7dc7380 100644
--- a/src/Rust/vvs_utils/src/lib.rs
+++ b/src/Rust/vvs_utils/src/lib.rs
@@ -8,7 +8,6 @@ pub mod file;
 pub mod xdg;
 
 pub use angles::*;
-pub use assert::*;
 pub use conds::*;
 pub use minmax::*;
 pub use rand::*;
diff --git a/src/Rust/vvs_utils/src/rand.rs b/src/Rust/vvs_utils/src/rand.rs
index 9833b2e5..8b10f723 100644
--- a/src/Rust/vvs_utils/src/rand.rs
+++ b/src/Rust/vvs_utils/src/rand.rs
@@ -11,10 +11,11 @@ struct MersenneTwister {
 
 thread_local! {
     /// We do our things here.
-    static MERSENNE: OnceLock<RefCell<MersenneTwister>> = OnceLock::new();
+    static MERSENNE: OnceLock<RefCell<MersenneTwister>> = const { OnceLock::new() };
 }
 
 /// Get the seed for the thread.
+#[inline]
 fn get_seed() -> u64 {
     f64::to_bits(
         std::time::SystemTime::now()
@@ -43,6 +44,7 @@ impl MersenneTwister {
     const LOWER_MASK: u64 = (1_u64 << MersenneTwister::R).overflowing_sub(1_u64).0;
     const UPPER_MASK: u64 = !Self::LOWER_MASK;
 
+    #[inline]
     fn twist(&mut self) {
         (0..Self::N).for_each(|i| {
             let index = i as usize;
@@ -54,6 +56,7 @@ impl MersenneTwister {
         self.index = 0;
     }
 
+    #[inline]
     fn extract_number(&mut self) -> u64 {
         if self.index >= Self::N as usize {
             self.twist();
@@ -69,6 +72,7 @@ impl MersenneTwister {
 }
 
 /// Get next pseudo random number with our homebrew mersenne twister.
+#[inline]
 pub fn rand() -> u64 {
     MERSENNE.with(|mt| {
         mt.get_or_init(|| {
diff --git a/src/Rust/vvs_utils/src/xdg/config.rs b/src/Rust/vvs_utils/src/xdg/config.rs
index 499ba276..49339f5f 100644
--- a/src/Rust/vvs_utils/src/xdg/config.rs
+++ b/src/Rust/vvs_utils/src/xdg/config.rs
@@ -140,6 +140,7 @@ where
     const DEFAULT_FILE: &'static str = "config";
 
     /// Create a new [XDGConfig] helper.
+    #[inline]
     pub fn new(
         app: &'a str,
         deserialize: impl Fn(String) -> Result<Format, Box<dyn std::error::Error>> + 'static,
@@ -154,6 +155,7 @@ where
     }
 
     /// Change the file to resolve.
+    #[inline]
     pub fn file(&mut self, file: &'a str) -> &mut Self {
         self.file = Some(file);
         self
@@ -161,6 +163,7 @@ where
 
     /// Get the name of the config file that we will try to read. Returns the default if not set by
     /// the user.
+    #[inline]
     pub fn get_file(&self) -> &str {
         match self.file.as_ref() {
             Some(file) => file,
@@ -169,11 +172,13 @@ where
     }
 
     /// Search all config files in all locations...
+    #[inline]
     fn search_files(&self) -> Result<MaybeFolderList, XDGError> {
         XDGFolder::ConfigDirs.find(self.app, self.get_file(), XDGFindBehaviour::ExistingOnly)
     }
 
     /// Prepare config folders.
+    #[inline]
     pub fn prepare_folder(&self) -> impl IntoIterator<Item = <MaybeFolderList as IntoIterator>::Item> {
         XDGFolder::ConfigDirs.prepare_folder()
     }
@@ -186,10 +191,7 @@ where
     /// Try to read the config file and deserialize it.
     pub fn try_read(&self) -> Result<Format, XDGError> {
         let Some(file) = self.search_files()?.into_first() else {
-            return Err(XDGError::ConfigNotFound(
-                self.app.to_string(),
-                self.get_file().to_string(),
-            ));
+            return Err(XDGError::ConfigNotFound(self.app.to_string(), self.get_file().to_string()));
         };
         let file = std::fs::read_to_string(file)
             .map_err(|err| XDGError::ConfigIO(self.app.to_string(), self.get_file().to_string(), err))?;
@@ -205,6 +207,7 @@ where
     /// Try to read the config file and deserialize it. If an error is encountred at any point, log
     /// it and return the provided default. If needed the default value is written on the disk,
     /// note that this operation may fail silently.
+    #[inline]
     pub fn read_or(
         &self,
         serialize: impl FnOnce(&Format) -> Result<String, Box<dyn std::error::Error>>,
@@ -219,6 +222,7 @@ where
     /// Try to read the config file and deserialize it. If an error is encountred at any point, log
     /// it and return the provided default. If needed the default value is written on the disk,
     /// note that this operation may fail silently.
+    #[inline]
     pub fn read_or_else(
         &self,
         serialize: impl FnOnce(&Format) -> Result<String, Box<dyn std::error::Error>>,
@@ -248,16 +252,12 @@ where
             )
         };
 
-        match std::fs::create_dir_all(path.parent().ok_or(XDGError::ConfigFileHasNoParentFolder(
-            self.app.to_string(),
-            self.get_file().to_string(),
-        ))?) {
+        match std::fs::create_dir_all(
+            path.parent()
+                .ok_or(XDGError::ConfigFileHasNoParentFolder(self.app.to_string(), self.get_file().to_string()))?,
+        ) {
             Err(err) if !matches!(err.kind(), std::io::ErrorKind::AlreadyExists) => {
-                return Err(XDGError::ConfigIO(
-                    self.app.to_string(),
-                    self.get_file().to_string(),
-                    err,
-                ))
+                return Err(XDGError::ConfigIO(self.app.to_string(), self.get_file().to_string(), err))
             }
             _ => {}
         }
@@ -270,6 +270,7 @@ where
 
     /// Same as [XDGConfig::write] but log any error and fail silently, returning the value that
     /// was attempted to be written to disk.
+    #[inline]
     fn write_silent(
         &self,
         serialize: impl FnOnce(&Format) -> Result<String, Box<dyn std::error::Error>>,
@@ -289,6 +290,7 @@ where
     /// Try to read the config file and deserialize it. If an error is encountred at any point, log
     /// it and return the default. If needed the default value is written on the disk, note that
     /// this operation may fail silently.
+    #[inline]
     pub fn read_or_default(
         &self,
         serialize: impl FnOnce(&Format) -> Result<String, Box<dyn std::error::Error>>,
@@ -310,6 +312,7 @@ where
     /// When trying to read or write the default, we write the file with the same logic as the
     /// [XDGConfigFirst] variant, we add this function to reduce the code to write for the write
     /// logic...
+    #[inline]
     fn to_config_first(&self) -> XDGConfig<Format, XDGConfigFirst> {
         XDGConfig::<Format, XDGConfigFirst> {
             app: self.app,
@@ -325,6 +328,7 @@ where
     /// the merge was silent. If no config file where found this is an error. All the files are
     /// merged, this operation can't fail, implementations must fail silently or have sane defaults
     /// and prefer files with higher priority.
+    #[inline]
     pub fn try_read(&self) -> Result<Format, XDGError> {
         Merged::try_read(self)
     }
@@ -339,6 +343,7 @@ where
     /// log it and return the provided default if the merge was not silent, skip the file if it was
     /// silent. If needed the default value is written on the disk, note that this operation may
     /// fail silently.
+    #[inline]
     pub fn read_or(
         &self,
         serialize: impl FnOnce(&Format) -> Result<String, Box<dyn std::error::Error>>,
@@ -354,6 +359,7 @@ where
     /// log it and return the provided default if the merge was not silent, skip the file if it was
     /// silent. If needed the default value is written on the disk, note that this operation may
     /// fail silently.
+    #[inline]
     pub fn read_or_else(
         &self,
         serialize: impl FnOnce(&Format) -> Result<String, Box<dyn std::error::Error>>,
@@ -375,6 +381,7 @@ where
     /// log it and return the provided default if the merge was not silent, skip the file if it was
     /// silent. If needed the default value is written on the disk, note that this operation may
     /// fail silently.
+    #[inline]
     pub fn read_or_default(
         &self,
         serialize: impl FnOnce(&Format) -> Result<String, Box<dyn std::error::Error>>,
diff --git a/src/Rust/vvs_utils/src/xdg/folders.rs b/src/Rust/vvs_utils/src/xdg/folders.rs
index 4552b2c6..3933ddb5 100644
--- a/src/Rust/vvs_utils/src/xdg/folders.rs
+++ b/src/Rust/vvs_utils/src/xdg/folders.rs
@@ -109,9 +109,11 @@ impl XDGFolder {
     pub fn get_folder(&self) -> MaybeFolderList {
         #[cfg(unix)]
         mod variables {
+            #[inline]
             pub fn data_dirs(_: impl AsRef<std::path::Path>) -> super::MaybeFolderList {
                 super::MaybeFolderList::from_iter(["/usr/local/share", "/usr/share"])
             }
+            #[inline]
             pub fn config_dirs(_: impl AsRef<std::path::Path>) -> super::MaybeFolderList {
                 super::MaybeFolderList::from("/etc/xdg")
             }
@@ -232,27 +234,26 @@ impl XDGFolder {
 
             // The list that we want is empty, or all lists are empty, returns nothing -> should it
             // really be an error?
-            _ => Err(XDGError::NotFound(
-                *self,
-                app.as_ref().to_string(),
-                file.as_ref().to_string(),
-            )),
+            _ => Err(XDGError::NotFound(*self, app.as_ref().to_string(), file.as_ref().to_string())),
         }
     }
 
     /// Is this variable a folder list?
+    #[inline]
     pub fn is_list(&self) -> bool {
         use XDGFolder::*;
         matches!(self, DataDirs | ConfigDirs)
     }
 
     /// Get the env variable name associated with the folder or folder list.
+    #[inline]
     pub fn env_var_name(&self) -> &str {
         self.as_ref()
     }
 }
 
 impl AsRef<str> for XDGFolder {
+    #[inline]
     fn as_ref(&self) -> &str {
         match self {
             XDGFolder::DataHome => "XDG_DATA_HOME",
@@ -268,6 +269,7 @@ impl AsRef<str> for XDGFolder {
 }
 
 impl std::fmt::Display for XDGFolder {
+    #[inline]
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(f, "${}", self.as_ref())
     }
diff --git a/src/Rust/vvs_utils/src/xdg/mod.rs b/src/Rust/vvs_utils/src/xdg/mod.rs
index bc1e04b2..54ca2644 100644
--- a/src/Rust/vvs_utils/src/xdg/mod.rs
+++ b/src/Rust/vvs_utils/src/xdg/mod.rs
@@ -19,6 +19,7 @@ use thiserror::Error;
 
 /// Get the user's home folder. Panics if the env variable was not found or it can't be
 /// canonicalized.
+#[inline]
 pub fn home_folder() -> PathBuf {
     PathBuf::from(std::env::var("HOME").expect("failed to get the $HOME env variable"))
         .canonicalize()
diff --git a/src/Rust/vvs_utils/src/xdg/paths.rs b/src/Rust/vvs_utils/src/xdg/paths.rs
index a99eb333..7eec911d 100644
--- a/src/Rust/vvs_utils/src/xdg/paths.rs
+++ b/src/Rust/vvs_utils/src/xdg/paths.rs
@@ -28,16 +28,19 @@ pub struct MaybeFolderListIterator<'a> {
 
 impl MaybeFolderList {
     /// Is there no folder?
+    #[inline]
     pub fn is_none(&self) -> bool {
         matches!(self, MaybeFolderList::Empty)
     }
 
     /// Is there folders?
+    #[inline]
     pub fn is_some(&self) -> bool {
         !self.is_none()
     }
 
     /// Get the first folder, or the last folder. If no folder is present just returns [None].
+    #[inline]
     pub fn first(&self) -> Option<&Path> {
         use MaybeFolderList::*;
         match self {
@@ -97,6 +100,7 @@ impl MaybeFolderList {
     /// Get the first folder, or the last folder. If no folder is present just returns [None]. The
     /// difference from the [MaybeFolderList::first] function is that this function consumes the
     /// [MaybeFolderList].
+    #[inline]
     pub fn into_first(self) -> Option<PathBuf> {
         use MaybeFolderList::*;
         match self {
@@ -106,6 +110,7 @@ impl MaybeFolderList {
     }
 
     /// Get an iterator over the contained folders.
+    #[inline]
     pub fn iter(&self) -> MaybeFolderListIterator {
         let (next, list): (_, &[_]) = match self {
             MaybeFolderList::Empty => (None, &[]),
@@ -116,6 +121,7 @@ impl MaybeFolderList {
     }
 
     /// Create a list of folders from a description string and a separator.
+    #[inline]
     pub(super) fn from_str_list(list: &str, separator: char) -> Self {
         let mut folders = list.split(separator);
         match folders.next() {
@@ -157,6 +163,7 @@ impl<'a, S> From<S> for MaybeFolderList
 where
     S: AsRef<str> + 'a,
 {
+    #[inline]
     fn from(value: S) -> Self {
         MaybeFolderList::Folder(PathBuf::from(value.as_ref()))
     }
@@ -166,14 +173,14 @@ impl<'a, P> FromIterator<P> for MaybeFolderList
 where
     P: AsRef<Path> + 'a,
 {
+    #[inline]
     fn from_iter<T: IntoIterator<Item = P>>(iter: T) -> Self {
         let mut folders = iter.into_iter();
         match folders.next() {
             None => MaybeFolderList::Empty,
-            Some(first) => MaybeFolderList::Many(
-                first.as_ref().to_path_buf(),
-                folders.map(|p| p.as_ref().to_path_buf()).collect(),
-            ),
+            Some(first) => {
+                MaybeFolderList::Many(first.as_ref().to_path_buf(), folders.map(|p| p.as_ref().to_path_buf()).collect())
+            }
         }
     }
 }
@@ -182,6 +189,7 @@ impl IntoIterator for MaybeFolderList {
     type Item = PathBuf;
     type IntoIter = <Vec<PathBuf> as IntoIterator>::IntoIter;
 
+    #[inline]
     fn into_iter(self) -> Self::IntoIter {
         match self {
             MaybeFolderList::Empty => vec![].into_iter(),
@@ -197,6 +205,7 @@ impl IntoIterator for MaybeFolderList {
 impl<'a> Iterator for MaybeFolderListIterator<'a> {
     type Item = &'a PathBuf;
 
+    #[inline]
     fn next(&mut self) -> Option<Self::Item> {
         let next = self.next?;
         match self.list.split_first() {
diff --git a/utils/lua/sample-spec.module b/utils/lua/sample-spec.module
deleted file mode 100644
index b007d97a..00000000
--- a/utils/lua/sample-spec.module
+++ /dev/null
@@ -1,54 +0,0 @@
---- Declaration
-
-local custom_opt = DeclareOption { option1 = false }
-local time_opt   = DeclareOption { preTime = -900, postTime = 300, }
-local color_opt  = DeclareOption { color1 = Vivy:newColor("#314159") }
-
-local module = DeclareModule {
-    name        = "sample-spec",
-    description = "Sample script used for the specification proposition",
-    author      = "Vivy",
-    revision    = "rev-1254",
-    imports     = { "utils" },
-    options     = { custom_opt, time_opt, color_opt },
-    functions   = {
-        DeclareFunction { "tripleCopySyl" },
-        DeclareFunction { "printFoo" },
-        ImportFunction  { "utils", "prettyPrint" },
-    },
-    jobs = {
-        DeclareJob { "set_retime", options = { time_opt } },
-        DeclareJob { "demultiply_syllabes" },
-        ImportJob  { "utils", "color_after_read_3", "utils", options = { color_opt } }
-    }
-}
-
---- Implementation
-
-local utils       = module:import { "utils" }
-local prettyPrint = module:import { "utils", "prettyPrint" }
-
-local tripleCopySyl = module:export { "tripleCopySyl", function (syl)
-    return { syl:copy(), syl:copy(), syl:copy() }
-end }
-
-module:export { "printFoo", function () prettyPrint ("Bar") end }
-
-module:export { "retime_lines", LINE, function (opt, line)
-    line.start  = line.start + opt.preTime
-    line.finish = line.start + opt.postTime
-    if line.start  <= Vivy:start()  then line.start  = Vivy:start()  end
-    if line.finish >= Vivy:finish() then line.finish = Vivy:finish() end
-    return line
-end }
-
-module:export { "create_syllabes", SYLLABE, function (opt, syl)
-    local newSyls     = tripleCopySyl(syl)
-    newSyls[1].start  = syl.line.start
-    newSyls[1].finish = syl.start
-    newSyls[3].finish = syl.line.finish
-    newSyls[3].start  = syl.finish
-    return newSyls
-end }
-
--- vim: ft=lua
diff --git a/utils/lua/simple.module b/utils/lua/simple.module
deleted file mode 100644
index 85439d80..00000000
--- a/utils/lua/simple.module
+++ /dev/null
@@ -1,48 +0,0 @@
---- Declaration
-
-local custom_opt = DeclareOption { option1 = false }
-local time_opt   = DeclareOption { preTime = -900, postTime = 300, }
-local color_opt  = DeclareOption { color1 = Vivy:newColor("#314159") }
-
-local module = DeclareModule {
-    name        = "sample-spec",
-    description = "Sample script used for the specification proposition",
-    author      = "Vivy",
-    revision    = "rev-1254",
-    options     = { custom_opt, time_opt, color_opt },
-    functions   = {
-        DeclareFunction { "tripleCopySyl" },
-        DeclareFunction { "printFoo" },
-    },
-    jobs = {
-        DeclareJob { "set_retime", options = { time_opt } },
-        DeclareJob { "create_syllabes" },
-    }
-}
-
---- Implementation
-
-local tripleCopySyl = module:export { "tripleCopySyl", function (syl)
-    return { syl:copy(), syl:copy(), syl:copy() }
-end }
-
-module:export { "printFoo", function () prettyPrint ("Bar") end }
-
-module:export { "set_retime", LINE, function (opt, line)
-    line.start  = line.start + opt.preTime
-    line.finish = line.start + opt.postTime
-    if line.start  <= Vivy:start()  then line.start  = Vivy:start()  end
-    if line.finish >= Vivy:finish() then line.finish = Vivy:finish() end
-    return line
-end }
-
-module:export { "create_syllabes", SYLLABE, function (opt, syl)
-    local newSyls     = tripleCopySyl(syl)
-    newSyls[1].start  = syl.line.start
-    newSyls[1].finish = syl.start
-    newSyls[3].finish = syl.line.finish
-    newSyls[3].start  = syl.finish
-    return newSyls
-end }
-
--- vim: ft=lua
diff --git a/utils/samples/hwlock.rs b/utils/samples/hwlock.rs
new file mode 100644
index 00000000..316a98cc
--- /dev/null
+++ b/utils/samples/hwlock.rs
@@ -0,0 +1,64 @@
+#!/usr/bin/env cargo script
+
+//! ```cargo
+//! [package]
+//! name = "topo"
+//! version = "0.1.0"
+//! edition = "2021"
+//!
+//! [dependencies]
+//! hwlocality = { version = "1.0.0-alpha.1", features = ["hwloc-latest", "vendored"] }
+//! anyhow = "*"
+//! ```
+
+use anyhow::{anyhow, Result};
+use hwlocality::{
+    cpu::binding::CpuBindingFlags,
+    object::types::ObjectType,
+    topology::support::{DiscoverySupport, FeatureSupport},
+    Topology,
+};
+use std::os::unix::thread::JoinHandleExt;
+
+fn main() -> Result<()> {
+    let topology = Topology::new()?;
+    if !topology.supports(FeatureSupport::discovery, DiscoverySupport::pu_count) {
+        println!("This example needs accurate reporting of PU objects");
+        return Ok(());
+    }
+    let Some(cpu_support) = topology.feature_support().cpu_binding() else {
+        println!("This example requires CPU binding support");
+        return Ok(());
+    };
+    if !(cpu_support.get_thread() && cpu_support.set_thread()) {
+        println!("This example needs support for querying and setting thread CPU bindings");
+        return Ok(());
+    }
+
+    let core_depth = topology.depth_or_below_for_type(ObjectType::Core)?;
+    let mut handles: Vec<_> = Vec::new();
+
+    for (idx, core) in topology.objects_at_depth(core_depth).enumerate() {
+        let handle = std::thread::spawn(move || -> Result<()> {
+            // Worker thread
+            std::thread::sleep(std::time::Duration::from_secs_f64(3.0));
+            Ok(())
+        });
+        let tid = handle.as_pthread_t();
+
+        let mut bind_to = core
+            .cpuset()
+            .ok_or_else(|| anyhow!("CPU cores should have CpuSets"))?
+            .clone_target();
+        bind_to.singlify();
+
+        let before = topology.thread_cpu_binding(tid, CpuBindingFlags::empty())?;
+        topology.bind_thread_cpu(tid, &bind_to, CpuBindingFlags::empty())?;
+        let after = topology.thread_cpu_binding(tid, CpuBindingFlags::empty())?;
+
+        println!("- Thread {idx} binding: {before:?} -> {after:?}");
+        handles.push(handle);
+    }
+    Ok(())
+}
+
diff --git a/utils/scripts/build-libvivy.bash b/utils/scripts/build-libvivy.bash
new file mode 100755
index 00000000..f6c321c1
--- /dev/null
+++ b/utils/scripts/build-libvivy.bash
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+set -e
+exec 5>&1
+cd "$(git rev-parse --show-toplevel)"
+
+FILES=$(cargo build --manifest-path src/Rust/Cargo.toml --workspace ${2} --message-format=json \
+    | jq -r 'select( .reason == "compiler-artifact" and ((.target.kind | index("staticlib")) or (.target.kind | index("bin"))) ) .filenames[0]' \
+    | tee >(cat - >&5))
+
+for FILE in ${FILES}; do
+    FILE=${FILE}
+    cp -u ${FILE} "${1}/$(basename ${FILE})"
+done
-- 
GitLab